Lập trình 22/09/2026 9 phút

10.000 kết nối WebSocket trên một tiến trình Go đo thật: 27 KB RSS mỗi kết nối idle với bộ đệm mặc định, 20 KB khi hạ xuống 1 KB, ping từng kết nối tốn gấp đôi CPU so với quét, ulimit 1024 gãy ở kết nối 1.018, dải cổng 28.232 cạn vì TIME_WAIT

Server Go nhận 10.000 kết nối WebSocket idle và tự chụp số liệu khi vượt mốc. Bộ đệm gorilla mặc định 4 KB cộng 4 KB: heap 225,7 MB, RSS 277,7 MB, 10.002 goroutine, tức 27 KB mỗi kết nối; hạ xuống 1 KB còn 204,5 MB. Ping mỗi 10 giây: timer riêng từng kết nối tốn 331 MB và 3,75 giây CPU trong 60 giây, quét bằng một goroutine tốn 273 MB và 1,85 giây cho cùng số ping. Ba chỗ gãy: ulimit 1024 dừng ở 1.018 kết nối; bùng nổ 10.000 connect không tràn backlog nhưng p99 tăng từ 45 lên 321 ms; đóng 10.000 rồi mở 20.000 ngay thì TIME_WAIT chiếm trọn 28.231 cổng.