넷플릭스의 프로그래머인 Brendan Gregg가 자신의 블로그에 올린 글입니다.
우리는 CPU 점유율이 90%라고 치면, 대충 이런 상황일 거라고 생각합니다.
하지만 실제론 이렇습니다. 프로세서가 명령어를 수행하지 않고, 메모리 I/O를 기다리고 있는 Stalled 상태가 상당수를 차지하는 것이지요. 따라서 CPU가 얼마나 대기 상태인지를 이해하면 코드를 줄이거나 메모리 I/O를 줄여 성능을 향상시킬 수 있을 거라는 의견입니다.
실제 CPU 사용율은 '일하고 있는 시간'이 아니라, CPU가 '아이들 스레드를 실행하지 않는 시간'입니다. 운영체제 커널은 컨텍스트 스위치에서 이를 추적해, 아이들 상태가 아닌 스레드가 실행된 후 100밀리초 안에 중지되면 커널이 해당 CPU를 사용했다고 간주합니다.
이런 측정 방식은 참 오래된 것입니다. 요새 나오는 CPU는 시스템 메모리보다 훨씬 빨라졌으며, 메모리를 기다리는 게 CPU 점유율의 상당수를 차지합니다. CPU 점유율이 높으면 CPU가 병목 현상을 일으키기보다는, DRAM 쪽에 병목 현상이 일어났을 가능성이 큽니다.
그리고 이런 상황은 더욱 나빠지고 있습니다. 오랫동안 CPU 제조사들은 DRAM보다 클럭을 더 빠르게 높여왔습니다. 2005년엔 3GHz의 클럭이, 그리고 지금은 더 많은 수의 코어와 하이퍼스레딩, 멀티 소켓을 통해 메모리 서브시스템의 수요가 늘어나게 됐습니다. 프로세서 제조사는 대용량 스마트 CPU 캐시와 빠른 메모리 버스/인터커넥트를 통해 이런 병목 현상을 줄이려 노력했지만 여전히 해결되지 않았습니다.
물론 쓰로틀링, 터보 부스트, 커널, 평균 산출의 문제, 애플리케이션 설계의 잘못으로 인해 CPU 사용률이 잘못 나올 수 있습니다. 그리고 여기에선 디스크 I/O가 아니라 메모리 바인딩에 대해 이야기하는 것이라고 하네요.
본문에선 CPU 점유율을 측정하는 항목이나 프로그래밍에 대한 이야기가 있는데 그건 일반 유저들이 알아야 할 수준을 넘어서니 패스.