확장성

확장성 은 증가한 부하에 대처하는 시스템의 능력을 설명하는데 사용되는 용어이다. 확장성을 논할 때 “X는 확장 가능하다” 또는 “Y는 확장성이 없다” 와 같은 말은 의미가 없다. 확장성을 논한다는 것은 “시스템이 커진다면 이에 대처하기 위한 선택은 무엇인가?” 와 “추가 부하를 다루기 위해 자원을 어떻게 투입할까?” 와 같은 질문을 고려한다는 의미이다.

부하 기술하기

이러한 질문에 답변을 위해서는 현재 시스템의 부하를 간결하게 기술해야한다. 그래야 부하 성장 질문(부하가 두 배로 된다면 어떻게 될까?)을 논의할 수 있다. 부하는 부하 매개변수(load parameter) 라 부르는 몇 개의 숫자로 나타낼 수 있다. 시스템에 따라 적합한 부하 매개변수는 달라질 수 있지만, 일반적으로 다음과 같은 부하 매개변수들이 있다:

  • 웹 서버의 초당 요청 수
  • 데이터베이스의 읽기 대 쓰기 비율
  • 동시 활성 사용자 (active user)
  • 캐시 적중률

부하 매개변수는 평균적인 경우가 중요할 수도 있고, 소수의 극단적인 경우가 병목 현상의 원인일 수도 있다.

성능 기술하기

부하를 기술하면 부하가 증가할 때 어떤 일이 일어나는지 조사할 수 있다:

  • 부하 매개변수를 증가시키고 시스템 자원(CPU, 메모리, 네트워크 대역폭)은 변경하지 않는다면 시스템 성능에 어떤 영향을 미칠까?
  • 부하 매개변수를 증가시켰을 때 성능을 유지시키길 원한다면 자원을 얼마나 많이 늘려야 할까?

두 질문에 답변을 하기 위해서는 성능 수치가 필요하다.

하둡과 같은 일괄 처리 시스템은 보통 처리량(throughput) (초당 처리할 수 있는 레코드 수 또는 일정 크기의 데이터 집합으로 작업을 수행할 때 걸리는 시간) 에 관심을 가진다. 온라인 시스템이라면 서비스 응답 시간(response time) (클라이언트가 요청을 보내고 응답을 받기까지의 시간) 에 관심을 둔다. 동일한 요청을 하더라도 매번 응답 시간이 다르기때문에, 응답 시간은 단일 숫자가 아니라 측정 가능한 분포로 생각해야한다.

응답 시간을 살필 때는 평균 응답 시간은 좋은 지표가 아니다. 평균은 얼마나 많은 사용자가 실제로 지연을 경험했는지 알려주지 않기 때문이다. 대신 백분위(percentile) 를 사용하는 것이 좋다.

응답 시간 목록을 가장 빠른 시간부터 제일 느린 시간 순으로 정렬했을 때 중간 지점을 중앙값(median) 이라고 한다. 예를 들어 중간 응답 시간이 200밀리초 라면 사용자중 절반은 응답 시간 미만으로, 나머지 절반은 응답 시간보다 오래 걸렸다는 의미가 된다. 이렇게 특이 값(outlier) (대부분의 요청은 빠르지만 가끔 꽤 오래 걸리는 특이 값) 을 측정하기 위해서 상위 백분위를 살펴보는 것도 좋다. 주로 95분위(p95), 99분위(p99), 99.9분위(p999) 가 일반적이다. 이는 각각, 요청의 95%, 99%, 99.9%가 특정 기준치보다 더 빠르다면, 해당 기준치가 각 백분위의 응답 시간 기준치가 된다는 의미이다. 예를 들어, 95분위 응답 시간이 1.5초라면 100개의 요청 중 95개는 1.5초 미만이고, 5개는 1.5초보다 더 걸린다는 의미이다.

꼬리 지연 시간(tail latency) 로 알려진 상위 백분위 응답 시간은 서비스의 사용자 경험에 직접적인 영양을 주기 때문에 중요한 수치가 될 수 있다.