23 điểm bởi GN⁺ 2024-09-23 | 1 bình luận | Chia sẻ qua WhatsApp
  • Khi client kết nối tới Discord, chúng nhận các cập nhật thời gian thực về những gì đang diễn ra thông qua một dịch vụ gọi là "gateway"
  • Từ cuối năm 2017, các kết nối gateway của client đã được nén bằng zlib, giúp kích thước thông điệp nhỏ hơn từ 2 đến 10 lần
  • Zstandard (zstd) có tỷ lệ nén cao hơn zlib, thời gian nén ngắn hơn, và hỗ trợ tính năng dictionary để tiếp tục giảm băng thông
  • Kết quả thử nghiệm zstd năm 2019 không mấy tích cực, nhưng họ đánh giá việc thử lại là xứng đáng

Streaming với Zstd

  • zlib sử dụng nén dạng streaming, còn zstd thì không
  • Với các payload nhỏ, zstd cho hiệu năng kém hơn zlib
  • Họ fork ezstd, binding zstd cho Elixir, để bổ sung khả năng streaming
  • Sau khi chuyển sang streaming với zstd, họ đạt cải thiện lớn so với streaming zlib cả về tỷ lệ nén lẫn tốc độ

Nỗ lực tối ưu hóa

Tinh chỉnh

  • Họ điều chỉnh các tham số nén zstd như chainlog, hashlog, windowlog để cân bằng giữa mức dùng bộ nhớ và thời gian nén

Dictionary của Zstd

  • Họ cố tận dụng tính năng dictionary của zstd để tăng tỷ lệ nén, nhưng hiệu quả khá hạn chế
  • Họ kết luận độ phức tạp khi dùng dictionary lớn hơn lợi ích mang lại nên quyết định không áp dụng

Nâng cấp buffer

  • Họ triển khai một vòng phản hồi để nâng cấp buffer zstd bằng cách tận dụng phần bộ nhớ dư vào giờ thấp điểm
  • Tỷ lệ nâng cấp thấp hơn dự kiến; họ thử cải thiện bằng cách điều chỉnh cấu hình allocator của BEAM, nhưng cuối cùng rút lại vì lợi ích không tương xứng với độ phức tạp

Triển khai và phát hành

  • Mức cải thiện băng thông từ zstd đủ lớn để họ quyết định áp dụng không chỉ cho mobile mà cả desktop
  • Họ tìm các binding zstd phù hợp cho từng nền tảng như Java, Objective-C, Rust và phát hành theo từng giai đoạn trong nhiều tháng

Thành quả bổ sung: Passive Sessions V2

  • Trong quá trình áp dụng zstd, họ phát hiện thông điệp passive_update_v1 chiếm hơn 30% băng thông gateway
  • Họ giới thiệu passive_update_v2, chỉ gửi các kênh/thành viên đã thay đổi, giúp giảm phần băng thông này từ 35% xuống 5%

Mức tiết kiệm lớn

  • Việc kết hợp Passive Sessions v2 và zstd đã giúp giảm gần 40% băng thông gateway mà client sử dụng
  • Việc phát hiện ra cơ hội tối ưu hóa ngoài dự tính cho thấy tầm quan trọng của đo đạc phù hợp và phân tích biểu đồ bằng tư duy phản biện

1 bình luận

 
GN⁺ 2024-09-23
Ý kiến trên Hacker News
  • Có ý kiến phàn nàn rằng thời gian khởi chạy của Discord mất tới 20–30 giây

    • Đặt câu hỏi vì sao tốc độ khởi chạy lại chậm ngay cả trên PC trị giá $5000
    • Dùng cách ví von rằng có vẻ như họ biên dịch lại client về đơn nhân mỗi lần chạy
  • Có vẻ bài viết tập trung vào tỷ lệ nén và việc giảm băng thông mạng

    • Không thấy đề cập đến thời gian CPU hay những cải thiện thực sự có thể đo được với người dùng
    • Khi công ty của họ từng làm nỗ lực tương tự, hiệu năng lại tệ hơn do chi phí nén/giải nén
  • Cách tiếp cận nén dựa trên từ điển dùng JSON và Erlang ETF khá thú vị

    • Đây là hướng họ chọn thay vì chuyển sang các hệ thống dựa trên schema như Cap'n Proto hoặc Protobufs
    • Có quan tâm đến benchmark giữa Zstandard và LZ4
    • Với dữ liệu overlay/HUD phát trực tuyến của drone, họ đã dùng LZ4 và đạt mức nén tương tự ở tốc độ cao bằng cách dùng từ điển được tạo bởi công cụ từ điển Zstd
  • Có người ngạc nhiên khi phản hồi bootstrap thông thường (READY) lại lớn hơn 2MB

  • Có nhắc đến nội dung thực tế của dispatch PASSIVE_UPDATE_V1

    • Ngay cả khi chỉ một phần tử thay đổi, nó vẫn gửi toàn bộ kênh, thành viên hoặc thành viên thoại
    • Các chỉ số được phát hiện trong quá trình thử nghiệm zstd cho thấy hành vi đáng ngạc nhiên
    • Đặt câu hỏi vì sao ngay từ đầu họ không phân tích metric
    • Đặt câu hỏi vì sao ngay từ đầu họ không gửi delta
  • Không thấy đề cập đến mức độ an toàn trước các kiểu tấn công như compression oracle attack (BREACH)

    • Tin rằng Discord hẳn đã cân nhắc điều này vì họ đã bỏ nhiều công sức cho việc triển khai nén
    • Có ý kiến rằng giá như họ viết cụ thể hơn thì tốt
  • Có vấn đề là chỉ cần mở tab Discord thì máy tính đã chậm đi

  • Có ý kiến cho rằng việc họ mô tả cả những thứ đã thử nhưng không hiệu quả là rất tốt

    • Các bài viết giải thích những lần thử thất bại ngày càng hiếm, nhưng điều đó lại rất thú vị và hữu ích
  • Có ý kiến rằng mIRC làm tốt hơn