카테노이드가 VOD 와 라이브 HTTP 스트리밍 서버의 TCP 혼잡 제어를 CUBIC 에서 BBR 로 바꾸고 그 효과를 서버와 클라이언트 양쪽에서 측정한 기록이다. 서버 전송 속도가 평균 30퍼센트 이상 올랐고, 특히 백분위 90퍼센트 이상 구간에서 개선이 뚜렷했다. 측정 과정에서 nginx 의 request_time 이 왜 부적절한 지표인지도 짚는다.
핵심 포인트- 사용자에게 비디오를 전달하는 주류는 HTTP 프로그레시브와 HLS 이고 둘 다 TCP 기반이라, 대역폭을 얼마나 끌어 쓰느냐가 TCP 혼잡 제어에 달려 있다.
- CUBIC 은 패킷 손실이 날 때까지 혼잡 윈도우를 키우고 손실 시 줄이는 방식이라 손실률이 오르면 전송 속도가 급락한다.
- BBR 은 RTT 와 현재 대역폭 사용률을 보면서 RTT 가 오르지 않는 선의 최대 속도를 찾는다. 라우터 버퍼가 과도하게 큰 bufferbloat 환경에서 유리하다.
- 적용은 sysctl 세 줄이면 된다. qdisc 를 fq 로, 혼잡 제어를 bbr 로 바꾸고 네트워크 서비스를 재시작한다. 서버 애플리케이션 수정은 필요 없다.
- 24시간 실측 결과 BBR 의 delivery_rate 가 CUBIC 대비 38퍼센트 높았고, 패킷 손실과 재전송률은 약간 높지만 미미한 수준이었다.
상세 정리- 혼잡 제어가 없던 초기 TCP 는 연결이 많아지면 아무도 패킷을 못 보내는 혼잡 붕괴가 일어났고, 이를 막으려 알고리즘이 내장됐다.
- 인터넷 기본은 New Reno 이지만 리눅스, 윈도우, macOS 커널의 기본 탑재는 CUBIC 이다. BBR 은 2016년 구글이 발표했고 리눅스 커널 4.9 부터 포함돼 있다.
- 혼잡 윈도우는 지금 얼마나 더 보낼 수 있는지를 나타내며 리눅스에서는 세그먼트 수로 지정된다. 연결 직후 기본값은 10 세그먼트다.
- 혼잡 제어는 송신에만 적용된다. 브라우저가 파일을 받을 때는 서버의 설정이, 업로드할 때는 사용자 PC 의 설정이 작동한다.
- 상태 확인은 ss 명령으로 한다. 출력에 cubic 이나 bbr 문자열, cwnd, mss, delivery_rate 등이 나오고 BBR 은 bw 와 mrtt, pacing_gain, cwnd_gain 같은 내부 상태를 추가로 보여준다.
- 커널 설정은 accept 호출 시점에 알고리즘이 결정되므로 값을 바꾼 뒤 네트워크를 쓰는 프로세스를 재시작해야 한다. 컨테이너 환경에서는 호스트 sysctl 이 하위 컨테이너에 함께 적용되는 점도 유의해야 한다.
- 간단 테스트로 31MB 파일을 IDC 서버에서 사무실로 3회씩 받아보니 BBR 이 CUBIC 대비 40퍼센트 이상 빨랐다.
- 그런데 실서버에서 nginx 의 request_time 으로 비교했더니 BBR 서버와 CUBIC 서버의 차이가 거의 없었다.
- 원인은 request_time 이 마지막 바이트를 클라이언트에 쓴 시점까지를 재기 때문이다. 소켓에 쓴 시점과 실제 다운로드 완료 시점은 네트워크 전송과 재전송 때문에 크게 벌어질 수 있다.
- 대안 지표는 delivery_rate 다. 클라이언트의 ack 까지 반영해 계산되고 혼잡 제어 알고리즘과 무관하게 항상 구해진다. BBR 은 이 값을 쓰고 CUBIC 은 쓰지 않는다.
- nginx 로 이 값을 남기려면 소스를 고쳐야 해서, 대신 bpftrace 를 골랐다. BPF 프로그램을 직접 짜지 않고 스크립트로 쓸 수 있어서다.
- bpftrace 예제 중 TCP 연결 종료 시 정보를 보여주는 스크립트를 고쳐 클라이언트 IP, 송수신 패킷, 손실과 재전송 패킷, 데이터 크기, delivery_rate 를 남겼다.
- 백분위로 보면 75퍼센트 지점까지는 두 알고리즘 차이가 거의 없고 90퍼센트부터 BBR 이 앞서기 시작한다. 이 구간이 평균을 끌어올린 것이다.
- 클라이언트 측은 플레이어가 수집하는 초기 버퍼링 완료 시간으로 확인했다. 여기서도 상위 백분위에서 BBR 이 더 좋았다.
- 단점도 적는다. BBR 은 손실 시 전송률을 크게 낮추지 않아 손실과 재전송률이 올라가는 경향이 있고, CUBIC 같은 손실 기반 알고리즘과 같은 네트워크를 공유하면 대역을 더 차지한다는 점이 알려져 있다. 다만 실서비스 적용 후 눈에 띄는 변화는 없었다.
왜 읽나대용량 파일이나 스트리밍을 자체 서버로 내보내는 팀에게 커널 설정 세 줄로 얻는 효과와, 그 효과를 제대로 재는 방법까지 알려주는 실측 사례.