GN⁺: Discord가 웹소켓 트래픽을 40% 감소시킨 방법
(discord.com)- 클라이언트가 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% 감소시킴
- 의도치 않은 최적화 기회를 발견한 것은, 적절한 계측과 비판적 시각으로 그래프를 분석하는 것의 중요성을 보여줌
Hacker News 의견
-
Discord의 실행 시간이 20-30초 걸리는 문제에 대한 불만이 있음
- $5000 PC에서도 느린 실행 속도에 대한 의문 제기
- 클라이언트를 매번 단일 코어로 다시 컴파일하는 것 같다는 비유 사용
-
압축 비율과 네트워크 대역폭 감소에 집중한 것 같음
- CPU 시간이나 실제 사용자에게 측정 가능한 개선 사항에 대한 언급이 없음
- 회사에서 비슷한 노력을 했을 때 압축/압축 해제 오버헤드로 인해 성능이 더 나빠졌음
-
JSON과 Erlang ETF를 사용한 사전 기반 압축 접근 방식이 흥미로움
- Cap'n Proto나 Protobufs 같은 스키마 기반 시스템으로 전환하는 대신 선택한 방식
- Zstandard와 LZ4의 벤치마크에 관심이 있음
- 드론의 스트리밍 오버레이/HUD 데이터의 경우 LZ4를 사용했으며, Zstd 사전 도구로 생성된 사전을 사용해 높은 속도로 유사한 압축을 달성했음
-
일반적인 부트스트래핑 응답(READY)이 2MB 이상이라는 점이 놀라움
-
PASSIVE_UPDATE_V1 디스패치의 실제 내용에 대한 언급
- 단일 요소만 변경되었을 때도 모든 채널, 멤버 또는 음성 멤버를 전송함
- zstd 실험 중 발견된 메트릭이 놀라운 행동을 보여줌
- 처음부터 메트릭 분석을 하지 않은 이유에 대한 의문
- 처음부터 델타를 전송하지 않은 이유에 대한 의문
-
압축 오라클 공격(BREACH)과 같은 공격에 대한 안전성 언급이 없음
- Discord가 압축 롤아웃에 많은 노력을 기울였다는 점에서 이를 고려했을 것이라 믿음
- 더 구체적인 내용을 작성했으면 좋겠다는 의견
-
Discord 탭을 열면 컴퓨터가 느려지는 문제가 있음
-
시도했지만 잘 되지 않은 것들을 설명한 점이 매우 좋음
- 실패한 시도를 설명하는 기사가 점점 드물어지고 있지만, 이는 매우 흥미롭고 도움이 됨
-
mIRC가 더 잘 했다는 의견