TECH 으로 돌아가기
TECH HACKER NEWS 어제 6분 읽기 37 READS

벤치마크를 그대로 믿지 마라: '냅킨 계산' 저장소가 알려주는 것

벤치마크를 그대로 믿지 마라: '냅킨 계산' 저장소가 알려주는 것
SOURCE IMAGE · HACKER NEWS

성능 감을 잡기 위해 흔히 쓰이는 '냅킨 계산(napkin math)' 표가 있다. 메모리 접근은 몇 나노초, 디스크 읽기는 몇 마이크로초 같은 식으로 자릿수 규모를 외워두고 대략적인 성능 추정에 쓰는 방식이다. 데이터 엔지니어이자 블로거인 Dan Luu는 이런 벤치마크와 평가 지표를 세 가지 사례로 나눠 살펴봤는데, 그중 가장 자세히 파고든 것이 GitHub의 sirupsen/napkin-math 저장소다. 별 5.4천 개를 받은 이 저장소는 '컴퓨터 성능 면접 준비'를 구글에 검색하면 최상단에 뜰 만큼 널리 참조된다. 문제는 표에 실린 상당수 숫자가 틀렸다는 데 있다.

병렬로 실행되는데 '지연시간'이라 부른다

면접을 준비하던 그의 친구 Jamie가 가장 먼저 이상하게 여긴 값은 랜덤 메모리 읽기/쓰기의 20ns였다. 이는 캐시 히트가 아니라 실제 DRAM 읽기를 뜻하는 것으로 보이는데, 자릿수 추정이라면 대략 100ns 정도가 맞다. 코드를 열어보니 이유가 드러났다. 루프의 각 반복 사이에 데이터 의존성이 없어 메모리 읽기가 병렬로 겹쳐 실행된 것이다. 현대 CPU는 여러 로드를 동시에 진행할 수 있으므로, 접근당 평균 시간을 지연시간이라 부르면 실제보다 훨씬 작게 측정된다. 제대로 지연시간을 재려면 로드 사이에 의존성을 넣어 접근이 겹치지 않게 해야 한다. README가 지연시간이 아닌 값에도 '지연시간'이라는 용어를 붙여 쓰는 점도 지적됐는데, Dan은 이를 역수 처리량(reciprocal throughput)에 대한 축약으로 볼 여지가 있어 크게 문제 삼지 않았다.

디스크 숫자는 캐시를 재고 있었다

디스크 값은 더 미심쩍다. 랜덤 SSD 읽기가 100us/70MB/s로 적혀 있지만, Optane이 아닌 평범한 고속 장치(예: Kioxia CD9P-R)도 약 30us, 즉 40us 미만의 지연을 낸다. 코드에서는 offset을 생성할 때 접근 길이를 고려하지 않아, 마지막 오프셋이 SIZE-4096+1이 되면 4095바이트만 남는데도 8192바이트를 읽으려 해 EOF를 넘기는 버그가 있다. 순차 읽기(1us, 8GiB/s)의 경우 1GiB 파일을 플러시한 뒤 반복해서 다시 읽어, 한 번의 비캐시 읽기 다음에 캐시 읽기가 이어진다. POSIX_FADV_RANDOM이나 POSIX_FADV_DONTNEED 같은 권고는 OS 캐시나 SSD 내부 캐시를 막지 못한다. 실제로 이 측정이 이뤄진 c4-standard-48-lssd 인스턴스의 구글 문서상 최대 처리량은 디스크 8개 합산 5000MiB/s(디스크당 625MiB/s)여서 8GiB/s는 과도하다. 즉 부주의하게 캐시를 읽고 있었다는 정황이다. Postgres 디스크 성능을 다뤄온 Peter Geoghegan도 디스크 성능이 읽기 크기, 큐 깊이, 잡 수에 따라 폭넓게 달라진다는 데 동의했다.

하나의 숫자를 외우는 것이 왜 위험한가

핵심 교훈은 단일 숫자에 대한 과신이다. DRAM 접근은 한두 개 숫자만 알아도 감을 잡기 쉬운 편이지만, 디스크는 그렇지 않다. 게다가 이 표의 디스크 값은 8개 디스크 구성에서 나온 것이라 단일 디스크 VM이라면 대략 1/8 수준의 대역폭을 예상해야 한다. 특정 GCP 8디스크 구성의 값을 통째로 외우는 것이 무슨 실무적 의미가 있느냐는 지적이다. 압축도 마찬가지다. README는 압축 500MiB/s, 압축 해제 1GiB/s로 적었지만 zstd의 옵션만 바꿔도 압축 속도가 두 자릿수 배 이상 벌어지고, 고속 특화 알고리즘까지 넣으면 범위는 더 커진다.

Dan은 이런 숫자를 아는 것 자체는 유용하다고 인정한다. 다만 표를 외우는 방식에는 회의적이다. 대부분의 값은 유도가 가능하며, 무언가를 바꿨을 때의 영향을 이해하려면 결과 숫자가 아니라 그 뒤의 메커니즘을 알아야 한다. 그는 20년 전 광학 작업에서 접한 표준 단일모드 광섬유의 분산값 17ps/nm·km을 지금도 기억하는데, 이는 외우려 해서가 아니라 계산에 자주 쓰다 보니 자연스럽게 남은 것이라고 설명한다. 2의 거듭제곱을 코딩하다 저절로 외우게 되는 것과 같은 이치다. 정작 우려스러운 대목은 이 저장소가 워낙 인기가 높아, 면접관마저 대부분의 값이 틀렸다는 사실을 모른 채 그대로 인용할 수 있다는 점이다. 널리 인용된다는 사실이 정확성을 보증하지 않는다는, 벤치마크를 대할 때 늘 새겨야 할 원칙을 이 사례가 그대로 보여준다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://danluu.com/exercise-7/
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기
처리 중...