어떤 데이터는 왜 순식간에 오고, 어떤 건 한참 걸릴까?
함정 질문똑같이 "데이터를 가져온다"인데, 어떤 건 0.000001초에 끝나고 어떤 건 0.1초나 걸리는 이유는 뭘까요?
그림으로 보기
기다림의 사다리 — 책상 서랍에서 꺼내는 데 1초라면
가장 가까운 책상 서랍에서 꺼내는 데 1초가 걸린다고 치고, 나머지 시간을 전부 같은 비율로 늘렸습니다.
- 책상 서랍L1 캐시에서 읽기0.5 ns1초
- 방 안 책장메인 메모리에서 읽기100 ns3.3분
- 건물 안 창고SSD에서 한 번 읽기150 µs3.5일
- 옆 건물같은 데이터센터 안 왕복0.5 ms11.6일
- 도시 외곽 창고하드디스크 헤드 이동10 ms7.6개월
- 다른 도시대륙 간 왕복 (미국↔유럽)150 ms9.5년
외부 호출 한 번을 기다리는 동안, CPU는 명령 수억 개를 실행할 수 있었습니다.
출처: Jeff Dean · Peter Norvig, “Latency Numbers Every Programmer Should Know” (사람 시간 환산: hellerbarde). 막대는 로그 스케일.
문장 따라가기
1/39어떤 데이터는 왜 순식간에 오고, 어떤 건 한참 걸릴까요?
텍스트 모드에서는 3초마다 다음 문장으로 넘어갑니다.
이렇게 생각해 보세요
책상 서랍에서 꺼내는 것, 방 안 책장까지 걸어가는 것, 건물 안 창고까지 내려가는 것, 옆 건물에 다녀오는 것, 도시 외곽 창고까지 가는 것, 다른 도시로 사람을 보내는 것 — 여섯 가지는 전혀 다른 일입니다. 가져오는 물건이 같아도 걸리는 시간이 다릅니다.
컴퓨터에도 똑같은 사다리가 있습니다. 가까운 칸일수록 빠르지만 작고, 먼 칸일수록 느리지만 큽니다. 자주 쓰는 값을 가까운 칸에 복사해 두는 장치가 캐시입니다.
위 표에서 왼쪽 배지가 그 "거리"이고, 오른쪽이 사람이 아는 시간으로 늘린 값입니다. 코드에서는 어느 칸이든 그냥 한 줄로 보인다는 점이 이 장의 함정입니다.
숫자로 뒤집기
계산 · 지금 계산됨
가장 가까운 책상 서랍에서 값 하나 꺼내는 데 1초가 걸린다고 해봅시다. 그러면 방 안 책장(메모리)까지는 3.3분, 건물 창고(디스크)까지는 3.5일이 걸립니다.
다른 도시(대륙을 건너는 왕복)에 다녀오는 일은 9.5년입니다 — 서랍을 여는 것보다 300,000,000배 먼 길입니다. 그런데 코드에서는 둘 다 그냥 한 줄입니다.
이 숫자는 문구에 박아둔 값이 아니라, 이 화면을 그릴 때 산수로 계산한 값입니다.
시뮬레이터에서 해보기
- 1.'캐시 추가' 프리셋을 열면 Redis 노드의 cache hit rate (%)가 95입니다 — 10초 재생하면 Redis가 13,915건을 즉답하고, 뒤의 MySQL은 6,685건만 받습니다.
- 2.인스펙터에서 그 값을 50으로 내려 보세요. 가까운 서랍(캐시)에서 못 찾는 일이 10배로 늘고, 그만큼 더 먼 곳(MySQL)까지 다녀와야 합니다 — 이 장의 사다리가 처리량으로 나타납니다.
- cache hit rate를 95에서 50으로 내렸을 때, MySQL 카드가 받는 요청 수가 어떻게 변하는지 보세요.
- 캐시에서 못 찾은 요청은 결국 한 칸 더 먼 곳까지 다녀옵니다 — 사다리를 한 칸 내려간 셈입니다.
시뮬레이터에서 열기 →속도 차이는 얼마나 열심히 하느냐가 아니라, 얼마나 멀리 다녀오느냐에서 옵니다.
진도는 이 브라우저에만 저장됩니다 (계정·기기 간 동기화 없음).
확인 문제
0 / 3 맞음1.캐시를 두는 이유를 가장 잘 설명한 것은?
2.사다리에서 한 칸 아래(더 먼 곳)로 내려갈수록 함께 늘어나는 것은?
3.캐시 적중률이 95%에서 50%로 떨어지면 뒤에 있는 데이터베이스가 받는 요청은?
새로 나온 말
- 캐시
- 자주 쓰는 값을 가까운 곳에 복사해 두는 작은 저장 공간입니다.
- 캐시 적중률
- 찾으러 갔을 때 캐시에 이미 있어서 먼 길을 안 가도 되는 비율입니다. 95%면 스무 번에 한 번만 멀리 갑니다.
- 지연 시간
- 부탁한 값이 도착할 때까지 기다리는 시간입니다. 초당 몇 건을 처리하느냐(처리량)와는 다른 이야기입니다.