한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Buku Putih Lag Game › L7 OS server (kernel)

Buffer socket kernel terlalu kecil Small socket buffers

ID penyebab so-sockbuf · Penanggung jawab utama Infrastruktur server (Tim Infrastruktur) · Turut terlibat Pengembangan server (Tim Pengembang Game)

Buka kartu interaktif dengan gambar dan simulasi →

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)

Gejala
Teleport, Fast forward
Faktor
Packet loss, Stall
Siapa yang mengalami
Seluruh server
Kapan
Saat banyak pemain berkumpul
Penanggung jawab
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

  1. socket(7) — Linux manual page Linux 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
  2. 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)
  3. IP Sysctl Linux kernel
    tcp_rmem dan tcp_wmem: jika SO_RCVBUF dan SO_SNDBUF ditetapkan langsung, auto-tuning ukuran untuk socket itu mati
  4. net/ipv4/udp.c (Linux v6.12) Linux kernel
    Jika antrean terima UDP melebihi ukuran buffer socket, paket langsung dibuang dan RcvbufErrors naik
  5. net/ipv4/proc.c (Linux v6.12) Linux kernel
    Nama counter yang ditampilkan nstat: RcvbufErrors dan SndbufErrors di grup Udp
  6. ss(8) — Linux manual page iproute2
    skmem pada -m: rb ukuran buffer terima, tb ukuran buffer kirim, w memori antrean kirim, d jumlah paket yang dibuang sebelum masuk ke socket

Lihat juga

Lapisan yang sama: L7 OS server (kernel)

Penyebab di lapisan lain dengan gejala yang sama (Teleport)

Lihat kartu interaktif dengan gambar dan simulasi