https://discord.com/blog/how-discord-reduced-websocket-traffic-by-40-percent
- 클라이언트가 Discord에 연결하면 "게이트웨이"라고 하는 서비스를 통해 무슨 일이 일어나고 있는지에 대한 실시간 업데이트를 받음
- 2017년 말부터 클라이언트의 게이트웨이 연결은 zlib를 사용하여 압축되어 메시지의 크기가 2배에서 10배까지 작아졌음
- Zstandard(zstd)는 zlib보다 압축률이 높고 압축 시간이 짧으며, 사전 기능을 지원해 대역폭을 추가로 줄일 수 있음
- 2019년 zstd 테스트 결과는 그다지 긍정적이지 않았으나, 다시 시도해볼 가치가 있다고 판단함
Zstd 스트리밍
- Zlib은 스트리밍 압축을 사용한 반면, zstd는 그렇지 않았음
- 작은 페이로드에서 zstd가 zlib보다 성능이 떨어졌음
- Elixir용 zstd 바인딩인 ezstd를 포크하여 스트리밍을 추가함
- Zstd 스트리밍으로 전환한 결과 zlib 스트리밍보다 압축률과 속도 면에서 크게 개선됨
최적화 노력
튜닝
- Chainlog, hashlog, windowlog 등 zstd 압축 매개변수를 조정하여 메모리 사용량과 압축 시간의 균형을 맞춤
Zstd 딕셔너리
- Zstd의 사전 기능을 활용하여 압축률을 높이려 했으나 효과는 제한적이었음
- 사전 사용의 복잡성이 이점보다 크다고 판단하여 도입하지 않기로 함
버퍼 업그레이드
- 비사용 시간대의 여분 메모리를 활용해 zstd 버퍼를 업그레이드하는 피드백 루프를 구현
- 예상보다 업그레이드 비율이 낮았고, BEAM 할당자 설정 조정 등으로 개선을 시도했으나 복잡성 대비 이점이 크지 않아 철회함
구현과 출시
- Zstd의 대역폭 개선 효과가 커서 모바일뿐 아니라 데스크톱에도 적용하기로 함
- Java, Objective-C, Rust 등 각 플랫폼에 맞는 zstd 바인딩을 찾아 몇 달에 걸쳐 단계적으로 출시함
추가 성과: Passive Sessions V2
- Zstd 적용 과정에서 passive_update_v1 메시지가 게이트웨이 대역폭의 30% 이상을 차지한다는 것을 발견함
- 변경된 채널/멤버만 전송하는 passive_update_v2를 도입하여 해당 대역폭을 35%에서 5%로 줄임
큰 절감 효과
- Passive Sessions v2와 zstd의 결합으로 클라이언트가 사용하는 게이트웨이 대역폭을 거의 40% 감소시킴
- 의도치 않은 최적화 기회를 발견한 것은, 적절한 계측과 비판적 시각으로 그래프를 분석하는 것의 중요성을 보여줌
댓글 영역