메모리 지연이 CPU 병목인 이유
원제 It's the Memory Latency, Stupid
105 포인트댓글 34
Key Point
CPU 100% 사용률도 메모리 레이턴시로 절반 이상 정체될 수 있으며, 캐시 친화 알고리즘으로 성능을 3배 이상 개선할 수 있다는 것을 구체적 성능 측정으로 입증한다.
핵심 요약
- CPU가 100% 사용 중이어도 메모리 접근 때문에 유휴 상태에 빠질 수 있다. 현대 CPU는 나노초당 4~8개 명령을 처리하지만 RAM 접근은 50~100ns 걸려서 한 번의 메모리 접근마다 400~800개 명령을 처리할 수 있는 시간이 소비된다.
- L1 캐시(1ns)는 RAM(50~100ns)보다 50~100배 빠르지만 용량이 약 64KB에 불과하고, L2·L3 캐시도 MB 단위로 제한되어 있다.
- 단순한 GROUP BY 구현에서 해시테이블이 매우 커지면 거의 모든 접근이 RAM 캐시 미스가 되어, 50.1%의 CPU 시간이 메모리 대기로 낭비되고 실제 연산은 16.1%에만 사용된다.
- ClickBench의 99m 행 데이터셋에서 약 17m 개의 고유 UserID로 GROUP BY를 하면 단순 구현은 3.9초가 소요되고 RAM에서 4.5GB를 읽는다.
- 래디스 파티셔닝으로 데이터를 4096개 파티션으로 먼저 분할한 후 각 파티션별로 별도 해시테이블을 만들면, 더 작은 해시테이블들이 CPU 캐시에 맞춰 캐시 미스가 줄어든다.
- 같은 쿼리가 개선된 방식으로 3.3초(2.7초)에 완료되고, 메모리 대기는 23.5%로, 실제 연산은 32.2%로 증가하며 DRAM 읽기는 1.5GB로 줄어든다.
- 연산이 400만 개 더 많지만(11.4억 → 19.4억) 찬 메모리 접근 대신 CPU 명령으로 전환하는 것이 효율적이므로 전체 성능이 개선된다.
- Pivot의 최적화된 JOIN 구현으로는 단일 코어에서 1.8초, 16코어 병렬 처리에서 171ms에 완료되며 954MB만 읽는다.