벤치마크
고친 사람 github-actions[bot]
벤치마크는 정해진 작업을 똑같은 조건에서 되풀이해 돌려 성능을 숫자로 내놓습니다. 바꾸기 전과 바꾼 뒤를, 또는 제품 둘을 그 숫자로 견줍니다. 조건을 못 박아 두어야 값의 차이를 바뀐 것 탓으로 돌릴 수 있습니다.
쉽고 빠른 이해
무슨 일을 하나 — 똑같은 작업을 정해진 방식으로 돌리고, 걸린 시간과 끝낸 건수를 적습니다. 데이터베이스에 같은 질의 만 건을 넣고 초당 몇 건을 끝냈는지 세는 식입니다.
왜 이렇게 하나 — 한 번 돌려 본 느낌으로는 코드를 고친 것이 성능을 바꿨는지 알 수 없습니다. 기계 상태와 입력이 매번 다르면 값도 매번 다릅니다. 나머지를 묶어 두면 남는 차이가 고친 것 때문입니다.
어떻게 도나
- 잴 작업과 입력을 하나로 정해 둡니다
- 값을 안 쓰는 예열(워밍업) 구간을 먼저 돌려 기계를 제 속도에 올립니다
- 같은 측정을 여러 번 되풀이하고 모인 값을 요약해 내놓습니다
대가 — 벤치마크가 재는 것은 그 작업 하나뿐입니다. 서비스가 실제로 받는 요청의 섞임과 데이터 크기가 다르면, 그 숫자는 서비스에서 안 나옵니다.
상세
이 절은 벤치마크가 무엇을 미리 정해 두고 무엇을 재는지, 한 번의 측정이 어떤 순서로 도는지, 나온 숫자가 언제 서비스에서 안 나오는지를 봅니다.
육상 트랙의 100미터 달리기는 거리도 바닥도 출발 신호도 미리 정해져 있습니다. 정해 두었기 때문에 다른 날 다른 도시에서 뛴 기록을 나란히 놓고 견줄 수 있습니다.
벤치마크도 이 방식을 씁니다. 잴 작업과 그 작업이 도는 조건을 미리 못 박고, 그 위에서 나온 숫자만 견줍니다. 못 박지 않은 것이 있으면 그것이 값을 흔들어서, 숫자가 달라져도 무엇 때문에 달라졌는지 말할 수 없습니다.
이름은 두 가지를 가리킵니다. 재는 일 자체를 벤치마크라고 부르고, 재는 데 쓰는 정해진 작업 묶음도 벤치마크라고 부릅니다. 뒤엣것은 여럿이 같은 것을 재라고 공개해 둔 물건이라 벤치마크 스위트라고도 합니다.
무엇을 못 박나
못 박을 것은 크게 셋입니다. 잴 작업, 그 작업이 도는 환경, 그리고 몇 번을 재는가입니다. 하나라도 매번 달라지면 그 차이가 값에 섞여 들어옵니다.
| 못 박는 것 | 안 못 박으면 |
|---|---|
| 잴 작업과 입력 | 데이터 양이 달라져 값도 같이 달라집니다 |
| 도는 기계와 설정 | 다른 기계에서 잰 값과 견줄 수 없습니다 |
| 재는 횟수와 [[시간과 시계 | 시간]] |
표의 셋 중 하나만 적고 나머지를 빠뜨린 보고가 흔합니다. 그런 숫자는 다시 재 볼 수 없어서 견줄 대상이 못 됩니다.
한 번의 측정이 도는 순서
측정은 바로 시작하지 않습니다. 기계와 실행 환경은 처음 얼마간 제 속도를 못 냅니다. 캐시가 비어 있습니다. 자주 도는 코드를 기계어로 바꾸는 작업도 아직 안 끝났습니다.
그래서 작업을 먼저 얼마간 돌리되 그동안 잰 값은 버립니다. 이 구간을 워밍업이라고 부릅니다. 워밍업이 끝난 뒤부터 값을 적기 시작합니다.
flowchart TD
A["잴 작업과 입력을 못 박는다"] --> B["워밍업 · 돌리되 값은 버린다"]
B --> C["한 번 재서 값을 적는다"]
C --> D{"정한 횟수를 다 채웠나"}
D -->|아니다| C
D -->|그렇다| E["모인 값을 요약해 내놓는다"]
그림의 되돌아가는 화살표가 이 절차의 핵심입니다. 한 번 잰 값 하나는 그때 기계가 어땠는지까지 같이 담고 있습니다. 여러 번 재서 값을 모아야 그 흔들림이 씻깁니다.
무엇을 재나
측정 한 번은 두 가지 숫자를 같이 줍니다. 데이터베이스 한 대에 같은 질의 만 건을 넣어 0.84초가 걸렸다면, 그 둘은 이렇게 갈라집니다.
끝낸 건수 = 10000
걸린 시간 = 0.84 // 초
처리량 = 10000 / 0.84 // 초당 11,905건
건당 시간 = 0.84 / 10000 // 0.000084초
처리량은 정해진 시간 동안 끝낸 건수입니다. 위 계산에서는 초당 11,905건이 그 값입니다.
지연은 한 건이 끝나기까지 걸린 시간입니다. 위 계산에서는 0.000084초가 그 값입니다. 한쪽을 알면 다른 쪽은 나눗셈 하나로 따라 나옵니다.
다만 건당 시간을 평균으로만 내놓으면 오래 걸린 건들이 묻힙니다. 평균이 낮아도 어떤 요청은 그 몇 배를 기다립니다.
그래서 잰 값을 작은 것부터 크기순으로 늘어놓고 백분위수를 같이 적습니다. 99번째 백분위수는 백 건 가운데 오래 걸린 한 건을 뺀 나머지 전부가 그 값 아래에 든다는 뜻입니다.
마이크로 벤치마크와 매크로 벤치마크
재는 폭에 따라 두 갈래로 부릅니다. 무엇을 알고 싶은가가 갈래를 정합니다.
마이크로 벤치마크는 함수 하나나 짧은 연산 하나만 떼어 잽니다. 값이 달라졌을 때 무엇 때문인지 짚기 쉽습니다. 대신 떼어 낸 조각은 프로그램 안에 있을 때와 다르게 돕니다.
매크로 벤치마크는 서비스 전체에 실제 요청에 가까운 짐을 넣고 잽니다. 서비스에서 나올 숫자에 가깝습니다. 대신 값이 흔들렸을 때 어느 부분 때문인지 바로 안 보입니다.
숫자가 서비스에서 안 나오는 때
벤치마크가 내놓은 숫자는 그 벤치마크가 잰 작업에 대해서만 참입니다. 어긋나는 대목은 대개 아래 셋 중 하나입니다.
첫째, 잰 작업이 실제 요청과 다를 때입니다. 한 종류의 질의만 만 번 넣으면 캐시에 그 결과가 얹혀서 값이 실제보다 후하게 나옵니다. 실제 서비스는 여러 질의를 섞어 받고 데이터도 훨씬 큽니다.
둘째, 측정 구간이 통째로 사라질 때입니다. 결과를 아무 데도 안 쓰는 계산은 컴파일러나 실행 환경이 지워 버릴 수 있습니다. 그러면 걸린 시간이 거의 없는 것으로 나옵니다. 잰 결과를 어딘가에 쌓아 두면 막을 수 있습니다.
셋째, 같은 기계에서 다른 것이 같이 돌 때입니다. 옆에서 도는 프로세스가 캐시와 디스크를 나눠 쓰면 그만큼 값이 밀립니다. 빌려 쓰는 기계에서는 옆에 누가 있는지 볼 수 없습니다.
그래서 벤치마크 결과를 볼 때는 숫자보다 어떤 조건에서 쟀는지를 먼저 읽습니다. 조건이 안 적혀 있으면 그 숫자는 견줄 대상이 없는 숫자입니다.
관련 항목
벤치마크와 나란히 쓰이는 성능 측정 활동
부하 테스트 · 성능 테스트 · 스트레스 테스트 · 소크 테스트 · 프로파일링 · 프로파일러 · 회귀 테스트 · 성능
벤치마크가 내놓는 값을 읽는 지표
처리량 · 지연 · 지연 시간 · 꼬리 지연 · 백분위수 · 초당 요청 수 · 수행 시간 · 표준편차
벤치마크 값을 흔드는 요인
워밍업 · JIT 컴파일러 · 가비지 컬렉터 · 캐싱 · 컴파일러 최적화 · 죽은 코드 제거 · 노이지 네이버 · 관측자 효과
벤치마크를 돌리는 도구와 표준 규격
JMH · pgbench · sysbench · wrk · Locust · perf · SPEC CPU · TPC-C · 벤치마크 스위트
벤치마크를 재는 폭으로 가른 갈래
마이크로 벤치마크 · 매크로 벤치마크 · 가상 사용자 · 램프업 · 측정 창
벤치마크 결과로 정하는 운영 판단
다른 이름: benchmark · 벤치마킹 · benchmarking · 벤치 마크