Anatomi Rantai Macet: Dari TCP Window ke PagedAttention
write(2) atau send(2) di tingkat runtime aplikasi.
Masalah bermula ketika client mengalami degradasi jaringan atau thread parsing sisi client terblokir. TCP receive window (rcv_wnd) milik client akan mengecil hingga menyentuh angka nol (Zero Window). Kernel Linux di host inferensi segera mendeteksi ini dan berhenti mengosongkan socket send buffer (SO_SNDBUF). Dalam hitungan milidetik, buffer socket terisi penuh. Event loop asynchronous di web server (seperti uvloop atau Tokio) yang bertugas mem-push token terpaksa menahan eksekusi coroutine streaming karena socket tidak lagi berstatus writable.
Di sinilah jurang pemisah antara network stack dan GPU memory manager runtuh. Scheduler inferensi (misalnya pada vLLM atau SGLang) menganggap sebuah request aktif sampai generator token benar-benar selesai dan socket berhasil ditutup. Karena coroutine streaming tertahan di kernel buffer, status request tidak pernah berpindah ke state FINISHED. Akibatnya, block manager pada GPU menolak melepaskan halaman blok KV-cache milik request tersebut dari HBM. Memori puluhan gigabyte yang seharusnya bisa langsung di-reuse untuk prompt berikutnya justru tersandera menunggu ACK dari jaringan seluler yang bapuk.
Jebakan Continuous Batching dan Preemption Cascade
BASH
# Memantau antrean TCP socket send buffer yang tersumbat pada port inferensi
ss -t -i 'sport = :8000' | awk '{print 1,2, 3,4, $5}'
# Perhatikan kolom Send-Q: angka yang membengkak menandakan backpressure ke runtimeMengisolasi Lapisan Jaringan dari Engine Scheduler
finish_reason: stop), tanpa menunggu socket client mengonfirmasi penerimaan seluruh chunk. Token-token yang sudah selesai digenerasi ditampung dalam ring-buffer kecil di memori host yang dikelola oleh reverse proxy berkinerja tinggi (seperti Envoy atau NGINX) sebelum dialirkan ke client.
Kedua, terapkan timeout agresif berbasis socket write readiness. Jika socket send buffer tertahan penuh melampaui ambang batas toleransi (misalnya 2 hingga 3 detik), reverse proxy atau middleware runtime harus langsung memutuskan koneksi (mengirimkan TCP RST) dan membatalkan request (early cancellation) di tingkat scheduler engine. Melindungi integritas kapasitas HBM jauh lebih krusial daripada mempertahankan satu client bermasalah yang mengorbankan ratusan pengguna lain di batch yang sama.
YAML
# Konfigurasi proteksi timeout buffer streaming pada Envoy proxy
route_config:
virtual_hosts:
- name: llm_backend
routes:
- match: { prefix: "/v1/chat/completions" }
route:
timeout: 0s # Nonaktifkan timeout global untuk SSE
idle_timeout: 5s # Putus jika tidak ada data yang mengalir selama 5 detik
max_stream_duration:
grpc_timeout_header_max: 120sSO_SNDBUF (net.ipv4.tcp_wmem) tanpa batas atas yang masuk akal pada node worker GPU. Buffer kernel yang terlalu besar hanya akan menyamarkan masalah (bufferbloat), memperlama waktu deteksi client yang macet, dan menunda sinyal error ke inference runtime.
Pergeseran beban kerja menuju inferensi menuntut kita berpikir melampaui optimasi CUDA kernel semata. Di era di mana GPU HBM adalah aset termahal dan paling terbatas di data center, membiarkan implementasi socket streaming primitif mengontrol siklus alokasi memori akselerator adalah resep pasti menuju bencana performa.