목록 조회를 검색 API 경유로 바꾼 뒤의 성능 결과표를 받았다. 열 번 시행한 표였고 응답시간과 메모리 두 종류로 항목이 셋이었다.
Table of contents
Open Table of contents
결과 — 열 번 시행한 표
기존 방식의 응답시간부터 봤다.
1298 1205 1197 1196 1240 1238 1376 1216 1233 1299
1,196에서 1,376밀리초 사이이고 폭이 180밀리초쯤 된다.
바꾼 뒤는 이랬다.
50 48 45 49 53 49 402 48 48 48
아홉 개가 45에서 53 사이인데 일곱 번째만 402다.
기존 쪽에는 이런 값이 없다. 가장 큰 1,376도 가장 작은 값의 1.15배여서 열 개가 한 덩어리로 읽힌다.
이상치 — 하나만 여덟 배
바꾼 쪽에서만 한 값이 나머지의 여덟 배쯤으로 나왔다. 이런 값이 하나 있으면 그것을 어떻게 다룰지가 결과의 해석을 바꾼다.
이 한 값이 평균을 얼마나 움직이는지 먼저 봤다.
열 개 평균 84.0ms
7번 뺀 평균 48.7ms
같은 자료인데 평균이 두 배 가까이 갈린다.
중앙값은 48.5밀리초로 7번을 빼든 넣든 거의 그대로다. 가운데 값이라 한쪽 끝이 아무리 커도 자리가 안 움직인다.
평균은 아홉 개 어디에도 없는 84.0에 놓인다. 대표값이 실제로 관측된 값들과 동떨어진 자리에 서는 셈이다.
평균과 중앙값의 배수가 갈렸다
개선율로 바꿔 보면 차이가 더 벌어진다.
평균 기준 1244 / 84.0 = 약 14.8배
중앙값 기준 1236 / 48.5 = 약 25.5배
7번 제외 1244 / 48.7 = 약 25.5배
14.8배와 25.5배는 같은 시행을 두고 나온 숫자다.
어느 쪽으로 보고하느냐에 따라 읽는 사람이 받는 인상이 달라진다. 표에는 시행별 개선율도 이미 적혀 있었다.
01 2591.02%
02 2475.77%
03 2655.21%
04 2416.36%
05 2322.10%
06 2522.61%
07 342.17% ← 여기
08 2529.52%
09 2522.90%
10 2690.48%
아홉 개가 2,300에서 2,700퍼센트 사이이고 하나가 342퍼센트다.
시행별로 계산해 두면 어느 시행이 이상한지가 표에서 바로 보인다. 전체 평균 한 줄만 있으면 이 줄이 안 보이고 배수만 낮게 남는다.
원인 — 표에 없는 시각과 환경
402가 왜 나왔는지는 이 표만으로 알 수 없다. 떠오르는 가능성은 몇 가지 있다.
캐시가 비어 있던 첫 요청
그 순간의 다른 부하
연결 수립 지연
일곱 번째가 첫 요청이 아니므로 캐시 쪽은 덜 유력하지만 확인할 근거가 없다.
표에는 각 시행이 언제 돌았는지도 그때 서버가 무엇을 하고 있었는지도 없다. 시행 번호 옆에 시각 한 열만 있었어도 cron 에 걸린 작업과 맞춰 볼 수 있었다.
그래서 지금 말할 수 있는 것은 원인을 모른다는 것까지다. 모르는 것을 모른다고 적는 편이 그럴듯한 이유를 붙이는 것보다 낫다.
조치 — 범위와 예외의 두 줄
보고에는 하나의 값으로 요약하지 않고 이렇게 쓰기로 했다.
열 번 중 아홉 번은 45~53ms (약 25배 개선)
한 번 402ms — 원인 미확인
평균만 적으면 402가 섞여 들어가 25배가 14.8배로 줄어든다.
반대로 402를 빼고 적으면 그런 값이 있었다는 사실 자체가 사라진다. 열 번에 한 번 그런 일이 난다면 그것도 읽는 쪽이 알아야 할 정보다.
두 줄로 적으면 읽는 사람이 판단할 자료가 그대로 남는다. 요약을 한 줄로 줄이려는 쪽이 오히려 정보를 버리는 일이었다.
메모리는 성질이 달랐다
같은 표의 메모리 항목은 응답시간과 전혀 다르게 나왔다.
200.522 200.527 200.527 200.527 200.527
200.527 200.527 200.527 200.527 200.527
첫 번째만 200.522이고 나머지 아홉이 전부 같다.
실제 메모리 쪽은 열 번이 210.764로 소수점 셋째 자리까지 같았다. 개선율도 열 번 모두 8040.00퍼센트로 소수점까지 같아서 처음에는 값을 복사한 것인가 싶었다.
응답시간은 그때의 부하와 대기와 통신이 섞이지만 메모리는 같은 코드가 같은 자료를 담으면 같은 양이 나온다. 바깥 상황이 잘 안 섞이는 지표라 열 번을 재도 같은 값이 열 번 나온다.
그래서 여러 번 재야 하는 지표와 두세 번이면 되는 지표가 갈린다. 다만 그것은 재고 나서 아는 것이라 처음에는 둘 다 열 번 재는 편이 낫다.
이름이 다른 두 메모리 값이 200.527과 210.764로 10KiB쯤 차이 나는 것도 걸렸다. 바꾼 뒤에는 2.945와 2.621로 크기가 뒤바뀌어서 어느 쪽을 인용하느냐에 따라 개선율이 6,800퍼센트와 8,040퍼센트로 갈렸다.
정리
- 열 번 시행에서 하나만 여덟 배로 튀었다
- 그 하나가 평균을 84.0과 48.7로 두 배 가까이 움직인다
- 중앙값 48.5는 그 값에 거의 안 움직인다
- 배수가 14.8배와 25.5배로 갈린다
- 시행별 개선율이 있으면 어느 시행이 이상한지 바로 보인다
- 표에 시각과 환경이 없으면 왜 튀었는지 알 수 없다
- 모르는 것은 모른다고 적는다
- 하나로 요약하지 말고 아홉 번의 범위와 한 번의 예외를 같이 적는다
- 응답시간은 흔들리고 메모리는 소수점까지 고정이다
- 이름이 다른 두 메모리 값은 정의를 모르면 어느 쪽도 못 고른다