Jika buffer kirim dan buffer terima kecil, saat burst trafik datang paket yang diterima lewat UDP dibuang, dan pengiriman TCP tertahan karena buffer tidak punya ruang.
Mengapa SO_SNDBUF dan SO_RCVBUF masih default atau terlalu kecil → Akibatnya Saat burst atau saat thread penerima tertahan sebentar, buffer terima UDP meluap dan paket dibuang; TCP menunggu karena buffer kirim tidak punya ruang → Di layar Teleport (packet loss UDP) atau fast forward (TCP menunggu)
Penanggung jawab utama Infrastruktur server (Tim Infrastruktur) · Turut terlibat Pengembangan server (Tim Pengembang Game)
Tugas Tim Pengembang Game
Atur ukuran buffer (SO_SNDBUF, SO_RCVBUF) di kode sesuai trafik, ingat bahwa untuk TCP menetapkan ukuran secara manual mematikan auto-tuning Linux, jangan pakai ukuran terlalu besar karena data lama menumpuk di buffer dan latensi bertambah, jaga agar thread penerima tidak tertahan.
Tugas Tim Infrastruktur
Sesuaikan batas atas kernel (rmem_max dan wmem_max; ukuran buffer yang diatur di kode juga tidak bisa melewati nilai ini) dan nilai default (rmem_default), pantau counter buffer meluap (RcvbufErrors).
Kisaran angka
Default buffer terima UDP di Linux sekitar 208 KB. Satu paket kecil pun memakan memori kernel jauh lebih besar dari ukuran aslinya, jadi puluhan hingga ratusan paket sudah cukup untuk memenuhinya. Di server yang menerima 100.000 paket per detik, buffer meluap walaupun thread penerima hanya tertahan beberapa ms.
Di grafik
Melonjak acak sesekali · Buffer terima UDP meluap (UdpRcvbufErrors)
Yang diperiksa
Periksa kenaikan UdpRcvbufErrors di nstat -az dan skmem di ss -uamn (rb adalah ukuran buffer terima, d adalah jumlah paket yang dibuang karena tidak bisa dimasukkan ke socket). Untuk TCP, periksa skmem di ss -tm, apakah memori antrean kirim (w) sudah mencapai ukuran buffer kirim (tb)
Cocok jika
UdpRcvbufErrors (atau d pada socket) naik saat burst atau saat thread penerima tertahan, dan rb di sekitar nilai default (kira-kira 208 KB). Untuk TCP, w menempel di tb dan send tertahan
Tidak cocok jika
Counter tidak berubah tetapi ada packet loss: lebih mungkin di tahap NIC (“Ring buffer terlalu kecil”) atau di jalur jaringan
Sarana pemeriksaan
Tools infrastruktur (tanpa perlu kode game)
Sumber
socket(7) — Linux manual pageLinux man-pages Default SO_RCVBUF dan SO_SNDBUF adalah rmem_default dan wmem_default, batas atasnya rmem_max dan wmem_max; kernel menggandakan nilai yang diatur
include/net/sock.h (Linux v6.18)Linux kernel Buffer socket default didefinisikan sebesar 256 paket berukuran 256 byte termasuk overhead sk_buff (SKB_TRUESIZE(256)×256); frame kecil pun dihitung sebesar sk_buff+MTU (sekitar 208 KB adalah hasil hitungan untuk x86-64)
IP SysctlLinux kernel tcp_rmem dan tcp_wmem: jika SO_RCVBUF dan SO_SNDBUF ditetapkan langsung, auto-tuning ukuran untuk socket itu mati
net/ipv4/udp.c (Linux v6.12)Linux kernel Jika antrean terima UDP melebihi ukuran buffer socket, paket langsung dibuang dan RcvbufErrors naik
net/ipv4/proc.c (Linux v6.12)Linux kernel Nama counter yang ditampilkan nstat: RcvbufErrors dan SndbufErrors di grup Udp
ss(8) — Linux manual pageiproute2 skmem pada -m: rb ukuran buffer terima, tb ukuran buffer kirim, w memori antrean kirim, d jumlah paket yang dibuang sebelum masuk ke socket