확률 분포
고친 사람 github-actions[bot]
확률 분포는 아직 나오지 않은 값이 어떤 크기로 얼마나 자주 나올지를 정해 둡니다. 주사위의 눈 1부터 6까지가 똑같이 자주 나온다는 규칙이 주사위의 확률 분포입니다. 서버에서는 다음 요청이 언제 들어올지와 응답이 얼마나 걸릴지를 이런 규칙으로 어림합니다. 값을 전부 재 보지 않고도 셈을 하게 해 주는 도구입니다.
쉽고 빠른 이해
확률 분포는 앞으로 나올 값이 어디쯤에 얼마나 자주 떨어질지를 적어 둔 규칙입니다. 「응답은 대개 0.1초 언저리에서 끝나고 1초를 넘는 일은 드물다」를 확률로 적어 둔 것이 응답 시간의 확률 분포입니다.
이게 없으면 이미 잰 값만 가지고 이야기할 수 있습니다. 요청이 지금의 두 배로 들어오면 대기열이 얼마나 길어질지 같은 물음에는 답할 수 없습니다. 아직 한 번도 잰 적이 없는 일이기 때문입니다.
- 잰 값을 보고 모양이 비슷한 분포를 하나 고릅니다
- 평균 같은 수 몇 개를 잰 값에 맞춥니다
- 그 분포로 아직 안 일어난 일의 확률을 계산합니다
대가는 분포가 가정이라는 것입니다. 고른 분포가 잰 값과 어긋나면 계산도 같이 어긋납니다. 오래 걸리는 요청이 드물 거라고 가정한 분포는 그런 요청이 드물지 않게 나올 때 그것을 놓칩니다.
상세
경품 추첨 상자에 공 백 개가 들어 있습니다. 빨간 공이 예순 개, 파란 공이 서른 개, 금색 공이 열 개입니다. 손을 넣기 전에는 무슨 색이 나올지 모릅니다. 그래도 빨간 공이 가장 자주 나오고 금색 공은 드물게 나온다는 것은 압니다.
확률 분포는 이 상자의 구성표와 같은 일을 합니다. 다음에 무엇이 나올지는 몰라도 무엇이 얼마나 자주 나올지는 알려 줍니다. 이 절은 그 구성표를 적는 법, 수 몇 개로 줄이는 법, 서버 일에 쓰는 곳을 봅니다. 예는 주사위와 서버의 응답 시간 두 가지로 끝까지 갑니다.
확률과 확률 변수
확률은 어떤 일이 얼마나 자주 일어나는지를 0에서 1 사이의 수로 적은 것입니다. 0은 절대 안 일어난다는 뜻이고 1은 반드시 일어난다는 뜻입니다. 같은 일을 여러 번 되풀이하면 그 일이 일어난 비율이 이 수에 가까워집니다.
던지기 전의 주사위 눈처럼 결과가 아직 안 정해진 값을 확률 변수라고 부릅니다. 서버에서는 다음 요청의 응답 시간과 다음 1초 동안 들어올 요청 수가 확률 변수입니다. 값은 그때그때 달라집니다. 그래도 어느 값이 자주 나오는지에는 규칙이 있습니다.
확률 분포는 확률 변수가 가질 수 있는 값마다 그 값이 나올 확률을 정해 둔 것입니다. 주사위라면 1부터 6까지 여섯 값에 각각 6분의 1을 줍니다. 어느 값이든 하나는 반드시 나오므로 모든 값의 확률을 더하면 1이 됩니다.
잰 분포와 확률 분포
분포라는 말은 이미 잰 값이 어디에 몰렸는지를 셀 때도 씁니다. 응답 천 건을 0.1초 폭으로 나눠 구간마다 몇 건인지 센 표가 그런 분포입니다. 이것은 지난 일을 센 기록입니다.
확률 분포는 앞으로 나올 값에 대한 규칙입니다. 주사위를 60번 던져 세어 보면 눈마다 열 번씩 고르게 나오지 않습니다. 던지는 횟수를 늘릴수록 눈마다 센 비율이 6분의 1에 가까워집니다. 이렇게 되풀이할수록 잰 비율이 확률에 다가가는 성질이 대수의 법칙입니다.
잰 분포와 확률 분포는 서로를 비춥니다. 잰 분포를 보고 확률 분포를 어림합니다. 어림한 확률 분포가 맞는지는 다시 잰 분포로 확인합니다.
이때 손에 쥔 잰 값 묶음이 표본입니다. 앞에서 센 응답 천 건이 표본입니다.
앞으로 끝없이 들어올 요청의 응답 시간은 다 잴 수 없습니다. 잰 천 건은 그 전체에서 뽑힌 일부입니다. 이렇게 표본을 뽑아 오는 값 전체가 모집단입니다. 확률 분포가 그리는 것은 이 모집단입니다.
셀 수 있는 값과 연속 값
확률 분포를 적는 방법은 값의 종류에 따라 둘로 갈립니다. 하나, 둘 하고 셀 수 있는 값과, 값 사이가 끝없이 촘촘한 값입니다.
주사위 눈이나 1초 동안 들어온 요청 수는 셀 수 있는 값입니다. 이런 값이 이산 값입니다.
이산 값은 값마다 확률을 하나씩 매기면 분포가 다 적힙니다. 값에서 그 값의 확률로 가는 이 대응이 확률 질량 함수입니다.
응답 시간은 다릅니다. 0.1초와 0.2초 사이에도 0.15초, 0.151초처럼 값이 끝없이 들어갑니다. 이런 값이 연속 값입니다.
연속 값에는 한 값씩 확률을 매길 수 없습니다. 끝없이 많은 값에 저마다 0보다 큰 확률을 주면 더한 값이 1을 넘어 버립니다. 그래서 딱 한 값의 확률은 0으로 둡니다. 확률은 0.1초에서 0.2초 사이처럼 구간에 매깁니다.
연속 값의 분포는 곡선으로 그립니다. 가로축에 값을 놓습니다. 오른쪽으로 갈수록 값이 큽니다. 응답 시간이라면 오른쪽이 오래 걸리는 쪽입니다.
곡선이 높은 곳일수록 값이 그 근처에 자주 떨어집니다. 두 값 사이에서 곡선 아래 넓이가 그 구간에 값이 떨어질 확률입니다. 이 곡선이 확률 밀도 함수입니다.
두 종류 모두에 쓰는 적는 방법이 하나 더 있습니다. 값이 x 이하로 나올 확률을 x마다 적는 방법입니다. 이것이 누적 분포 함수입니다. 응답 시간이라면 「0.3초 안에 끝날 확률은 0.9」 같은 문장을 시간마다 모아 둔 셈입니다.
누적 분포 함수를 거꾸로 읽으면 백분위수가 나옵니다. 누적 확률이 0.99에 닿는 응답 시간이 99번째 백분위수입니다. 서버 대시보드에서 분포의 오른쪽 끝을 볼 때 쓰는 그 수입니다.
분포를 수 몇 개로 줄이기
분포 전체를 늘 들고 다니기는 번거롭습니다. 흔히 분포의 성격을 수 몇 개로 줄여 말합니다. 가장 많이 쓰는 것이 기댓값과 분산입니다.
기댓값은 값마다 그 값의 확률을 곱해 모두 더한 수입니다. 분포의 무게중심에 해당합니다. 주사위는 1부터 6까지에 각각 6분의 1을 곱해 더하면 3.5가 됩니다.
주사위 눈 3.5는 한 번도 나오지 않습니다. 그래도 수백 번 던진 눈의 평균은 3.5에 가까워집니다. 기댓값은 한 번 뽑을 값의 예상이 아니라 오래 뽑았을 때의 평균입니다. 이 까닭에 기댓값을 분포의 평균이라고도 부릅니다.
분산은 값이 기댓값에서 얼마나 멀리 흩어지는지를 잽니다. 값마다 기댓값과의 차이를 제곱합니다. 거기에 확률을 곱해 모두 더합니다.
차이를 제곱했으니 분산은 단위도 제곱이 됩니다. 응답 시간이라면 초의 제곱입니다. 분산에 제곱근을 씌운 표준편차는 값과 단위가 같습니다. 「기댓값에서 대개 이만큼 벗어난다」로 바로 읽힙니다.
기댓값이 같아도 분포는 다를 수 있습니다. 응답이 늘 0.2초 언저리인 서버가 있습니다. 대부분 0.1초에 끝나다가 가끔 1초를 넘는 서버도 있습니다. 두 서버의 기댓값은 비슷할 수 있습니다. 둘을 가르는 것은 퍼짐과 분포의 오른쪽 끝입니다.
이름이 붙은 확률 분포
자주 나오는 모양에는 이름이 붙어 있습니다. 이름 있는 분포는 모양의 틀이 정해져 있습니다. 남은 것은 분포가 어디에 놓이고 얼마나 퍼지는지를 정하는 수 몇 개뿐입니다. 이 수가 모수입니다.
모수만 정하면 분포 전체가 정해집니다. 정규 분포라면 기댓값과 표준편차 두 수가 모수입니다.
아래 표는 서버 일에서 자주 만나는 다섯 분포입니다. 값의 종류와 모양, 그리고 흔히 이 분포로 어림하는 값을 나란히 적었습니다.
| 이름 | 값의 종류 | 모양 | 흔히 모형으로 삼는 값 |
|---|---|---|---|
| 균등 분포 | 연속 · 이산 | 범위 안의 모든 값이 똑같이 자주 나온다 | 난수 생성기가 내는 값 · 재시도 전에 섞는 무작위 지연 |
| 정규 분포 | 연속 | 기댓값을 가운데 둔 좌우 대칭의 종 모양 | 작은 요인 여럿이 더해진 값 · 측정 오차 |
| 지수 분포 | 연속 | 0 근처가 가장 두껍고 오른쪽으로 갈수록 얇아진다 | 요청과 요청 사이의 간격 |
| 포아송 분포 | 이산 | 기댓값 근처에 봉우리가 하나 선다 | 1초 동안 들어오는 요청 수 |
| 이항 분포 | 이산 | 시도 수에 성공 확률을 곱한 값 근처에 봉우리가 선다 | 요청 백 건 중 실패한 건수 |
표의 지수 분포와 포아송 분포는 짝으로 나옵니다. 요청이 서로 상관없이 들어온다고 해 봅시다. 1초에 들어오는 건수의 기댓값도 늘 같다고 둡니다.
그러면 1초마다 센 요청 수는 포아송 분포를 따릅니다. 요청과 요청 사이의 간격은 지수 분포를 따릅니다. 같은 도착 모습을 「몇 건」으로 보느냐 「얼마 만에」로 보느냐의 차이입니다.
정규 분포가 자주 나오는 데에도 까닭이 있습니다. 서로 상관없는 작은 값을 많이 더하면, 원래 값들이 어떤 분포를 따르든 대개 그 합은 정규 분포에 가까워집니다. 이 성질이 중심극한정리입니다.
서버 일에서 확률 분포를 쓰는 곳
백엔드 개발자가 확률 분포를 만나는 곳을 넷 봅니다. 넷 모두 아직 안 일어난 일을 계산하거나 흉내 냅니다.
큐잉 이론은 요청이 들어오는 간격과 한 건을 처리하는 시간을 확률 분포로 둡니다. 두 분포를 가지고 대기열 길이와 기다리는 시간을 계산합니다. 요청이 지금의 두 배로 들어오면 어떻게 될지를 부하를 걸어 보기 전에 어림할 수 있습니다.
부하 테스트에서 요청을 똑같은 간격으로 보내면 운영 트래픽보다 고른 부하가 됩니다. 운영 트래픽은 몰려 들어오기도 하고 한동안 뜸하기도 합니다. 그래서 요청 간격을 지수 분포에서 뽑아 보내는 방식이 있습니다. 이러면 도착이 몰리는 순간이 테스트에도 들어갑니다.
여러 클라이언트가 실패한 요청을 똑같은 시간 뒤에 다시 보내면 재시도가 한순간에 몰립니다. 그래서 기다리는 시간에 균등 분포에서 뽑은 무작위 값을 섞습니다. 이 무작위 지연이 지터입니다. 재시도가 시간 축에 흩어져 한순간에 몰리지 않습니다.
타임아웃이나 서비스 수준 목표를 정할 때는 응답 시간 분포의 오른쪽 끝을 봅니다. 「천 건 중 한 건이 이 시간을 넘는다」 같은 값은 기댓값에서는 안 보입니다. 분포에서 백분위수로 읽어야 나옵니다.
고른 분포가 잰 값과 어긋날 때
확률 분포는 세상을 단순하게 본 모형입니다. 잘 맞으면 재 보지 않은 일까지 계산하게 해 줍니다. 안 맞으면 계산이 그럴듯한 모양으로 틀립니다.
분포를 고르는 일은 한 번에 끝나지 않습니다. 맞춰 보고 어긋나면 다시 고르는 고리입니다. 잰 값을 구간별로 세어 막대로 그린 히스토그램에서 모양을 보고 시작합니다. 아래 그림에서 마름모가 되돌아가는 갈림입니다.
flowchart TD
A["잰 값을 히스토그램으로 그린다"] --> B["모양이 비슷한 분포를 고른다"]
B --> C["모수를 잰 값에 맞춘다"]
C --> D{"잰 값과 견줘 맞나"}
D -->|맞는다| E["그 분포로 계산한다"]
D -->|어긋난다| B
가장 흔히 어긋나는 곳은 오른쪽 끝입니다. 응답 시간의 분포는 대개 오래 걸리는 쪽으로 길게 늘어집니다. 이렇게 오른쪽으로 길게 늘어진 모양이 긴 꼬리입니다. 좌우 대칭인 정규 분포와는 모양이 다릅니다.
정규 분포로 어림하면 오래 걸리는 요청이 아주 드물다고 계산됩니다. 그런 요청이 드물지 않게 나오면 이 계산은 그 요청들의 긴 응답 시간을 놓칩니다. 분포의 오른쪽 끝에 놓인 이런 긴 응답 시간을 꼬리 지연이라고 합니다.
「요청이 서로 상관없이 들어온다」는 가정도 자주 깨집니다. 장애 뒤에 실패한 요청이 한꺼번에 다시 들어오는 재시도 폭풍에서는 요청끼리 서로 얽힙니다. 이때 포아송 분포로 계산한 대기열 길이는 운영에서 보는 것보다 짧게 나옵니다.
이름 있는 분포는 모양을 먼저 확인한 값에 씁니다. 모양을 모르는 값은 잰 분포에서 백분위수를 바로 읽습니다. 그러면 계산에 가정이 끼어들지 않습니다.
관련 항목
확률 분포를 적는 함수
확률 질량 함수 · 확률 밀도 함수 · 누적 분포 함수 · 적률 생성 함수
확률 분포에서 뽑아내는 요약 통계량
기댓값 · 평균 · 분산 · 표준편차 · 백분위수 · 분위수 · 중앙값 · 최빈값 · 치우침 · 첨도
이름이 붙은 확률 분포
균등 분포 · 정규 분포 · 지수 분포 · 포아송 분포 · 이항 분포 · 베르누이 분포 · 기하 분포 · 로그 정규 분포 · 파레토 분포 · 멱법칙
확률 분포를 떠받치는 확률론 개념
확률 · 확률 변수 · 확률론 · 조건부 확률 · 독립 사건 · 대수의 법칙 · 중심극한정리
잰 값으로 확률 분포를 어림하는 통계 개념
분포 · 표본 · 모집단 · 모집단 분포 · 표집 분포 · 히스토그램 · 모수 · 최대 가능도 추정 · 적합도 검정
확률 분포로 계산하거나 흉내 내는 운영 기법
큐잉 이론 · 리틀의 법칙 · 부하 테스트 · 지터 · 지수 백오프 · 몬테카를로 방법 · 용량 계획 · 샘플링 · 난수 생성기
확률 분포의 오른쪽 끝에서 드러나는 성능 지표
응답 시간 · 꼬리 지연 · 긴 꼬리 · 서비스 수준 목표 · 타임아웃
확률 분포의 가정을 깨는 장애
다른 이름: probability distribution