Struktur soket kernel dan TCP_DIAG

18

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 ( sockin 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 masuk
  • wmem_alloc : ukuran buffer keluar
  • sk_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
Twister
sumber
Apa konfigurasi ukuran buffer Anda? Apakah Anda melihat buffer menerima jenuh pada koneksi soket? Apakah pihak Anda memutuskan koneksi di EWOULDBLOCK?
Karlson
Ukuran soket saya cukup kecil, saya pikir, saya memperbarui pos dengan mereka. Untuk EWOULDBLOCK saya tidak tahu. Klien saya ada di JAWA dan katakan saja sudah terputus oleh server. Server berada di C ++ dan hanya mengatakan bahwa ia menjatuhkan koneksi tanpa informasi apa pun. Saya tidak memiliki kode sumber server sehingga saya tidak dapat mengubah perilakunya. Tampaknya klien terputus ketika mereka sedikit kelebihan beban, bahkan jika itu hanya berlangsung beberapa detik.
Twister
Apakah konfigurasi ukuran buffer dapat disesuaikan di server? Bisakah Anda menonton ukuran buffer pada klien? Apakah Anda memiliki akses ke sumber klien? Sudahkah Anda menjalankan netstat -apnc untuk menonton ukuran buffer? Apakah Anda mencoba meningkatkan ukuran buffer di kernel untuk melihat apa yang terjadi?
Karlson
Ya mereka, dan sudah diatur ke nilai maksimal server (saya percaya mereka tidak bisa lebih besar dari properti net.ipv4.tcp_ *, kan?) Untuk netstat -apnc itu tidak memberi saya ukuran buffer, itu sebabnya saya melihat ss. Untuk kernel saya tidak melakukan root pada server, dan tim TI di sini cukup keras kepala. Saya perlu memastikan apa yang terjadi sebelum saya meminta mereka untuk mengubah nilai-nilai ... Dan ya saya memiliki akses ke sumber klien, dan penyelidikan saya pada klien mengkonfirmasi bahwa pemutusan berasal dari server.
Twister
netstat -apnc memberi Anda ukuran total kirim dan terima antrian di Linux. Jika server menetapkan buffer ke maksimum yang tersedia dan Anda masih jenuh, mungkin Anda memerlukan pengaturan buffer yang lebih tinggi di level OS
Karlson

Jawaban:

7

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

aculich
sumber
Saya tidak mengerti bagaimana definisi ini sk_wmem_queuedberbeda sk_wmem_alloc, dapatkah Anda sedikit memperluas ini? (Jika Anda tahu jawabannya, jangan ragu untuk menambahkan jawaban untuk pertanyaan ini: unix.stackexchange.com/questions/551444/… )
little-dude
1

Lihat halaman manual ss.

<fwd_alloc>
   The  memory allocated by the socket as cache, but not used for receiving/sending packet yet. If need memory to send/receive packet, the memory in this cache will be used before allocate additional memory.

<wmem_queued>
   The memory allocated for sending packet (which has not been sent to layer 3)
wenjianhn
sumber
0

Mengenai sk_wmem_queueddan sk_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:

sk_wmem_allocmelacak jumlah byte untuk skb yang diantrekan setelah tumpukan transportasi: lapisan qdisc dan buffer cincin NIC TX.

Jika Anda memiliki 1 MB data yang duduk dalam antrean tulis TCP, belum dikirim (batas cwnd), sk_wmem_queueakan menjadi sekitar 1MB, tetapi sk_wmem_allocakan menjadi sekitar 0

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.

tumpukan jaringan menempatkan paket langsung ke disiplin antrian atau mendorong kembali pada lapisan atas (mis. buffer buffer) jika antrian penuh

Jadi pada dasarnya: sk_wmem_queuesadalah memori yang digunakan oleh buffer socket ( sock.sk_write_queue) sementara itu sk_wmem_allocadalah memori yang digunakan oleh paket-paket dalam qdisc dan antrian perangkat.

Bung kecil
sumber