Saya sedang mengerjakan perangkat lunak yang menghubungkan ke server data Real Time (menggunakan TCP) dan saya memiliki beberapa koneksi yang terputus. Dugaan saya adalah bahwa klien tidak membaca data yang datang dari server dengan cukup cepat. Karena itu saya ingin memonitor soket TCP saya. Untuk ini saya menemukan alat "ss".
Alat ini memungkinkan untuk melihat status setiap soket - inilah contoh baris dari output perintah ss -inm 'src *:50000'
ESTAB 0 0 184.7.60.2:50000 184.92.35.104:1105
mem:(r0,w0,f0,t0) sack rto:204 rtt:1.875/0.75 ato:40
Pertanyaan saya adalah: apa arti bagian memori? Melihat kode sumber alat saya menemukan bahwa data berasal dari struktur kernel ( sock
in sock.h
). Lebih tepatnya, itu berasal dari ladang:
r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;
Apakah ada yang tahu apa artinya? Dugaan saya adalah:
rmem_alloc
: ukuran buffer masukwmem_alloc
: ukuran buffer keluarsk_forward_alloc
: ???sk->sk_wmem_queued
: ???
Berikut ini ukuran buffer saya:
net.ipv4.tcp_rmem = 4096 87380 174760
net.ipv4.tcp_wmem = 4096 16384 131072
net.ipv4.tcp_mem = 786432 1048576 1572864
net.core.rmem_default = 110592
net.core.wmem_default = 110592
net.core.rmem_max = 1048576
net.core.wmem_max = 131071
Jawaban:
sk_forward_alloc
adalah memori yang dialokasikan ke depan yang merupakan total memori yang saat ini tersedia dalam kuota soket.sk_wmem_queued
adalah jumlah memori yang digunakan oleh soket untuk mengirim buffer dalam antrian transmisi dan belum dikirim atau belum diakui.Anda dapat mempelajari lebih lanjut tentang Manajemen Memori TCP di bab 9 Arsitektur TCP / IP, Desain dan Implementasi di Linux Oleh Sameer Seth, M. Ajaykumar Venkatesulu
sumber
sk_wmem_queued
berbedask_wmem_alloc
, dapatkah Anda sedikit memperluas ini? (Jika Anda tahu jawabannya, jangan ragu untuk menambahkan jawaban untuk pertanyaan ini: unix.stackexchange.com/questions/551444/… )Lihat halaman manual ss.
sumber
Mengenai
sk_wmem_queued
dansk_wmem_alloc
, saya mengajukan pertanyaan yang sama jadi saya akan menyalin jawabannya di sini:Saya mengirim email kepada Eric Dumazet, yang berkontribusi pada tumpukan jaringan Linux, dan inilah jawabannya:
Dokumen yang sangat baik untuk memahami apa tiga jenis antrian ini (buffer soket, antrian qdisc, dan antrian perangkat) adalah artikel ini (agak panjang) . Singkatnya, soket mulai dengan mendorong paket langsung ke antrian qdisc, yang meneruskannya ke antrian perangkat. Ketika antrian qdisc penuh, soket mulai buffering data dalam antrian tulisnya sendiri.
Jadi pada dasarnya:
sk_wmem_queues
adalah memori yang digunakan oleh buffer socket (sock.sk_write_queue
) sementara itusk_wmem_alloc
adalah memori yang digunakan oleh paket-paket dalam qdisc dan antrian perangkat.sumber