Çekirdek soket yapısı ve TCP_DIAG


18

(TCP kullanarak) Gerçek Zamanlı veri sunucusuna bağlanan bir yazılım üzerinde çalışıyorum ve bazı bağlantıları bırakarak var. Benim tahminim, istemciler sunucudan gelen verileri yeterince hızlı okumazlar. Bu nedenle TCP soketlerimi izlemek istiyorum. Bunun için "ss" aracını buldum.

Bu araç her soketin durumunu görmenizi sağlar - burada komutun çıktısının örnek bir satırı 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

Sorum şu: hafıza kısmı ne anlama geliyor? Aracın kaynak koduna bakarak verilerin bir çekirdek yapısından ( sockin sock.h) geldiğini buldum . Daha doğrusu, alanlardan gelir:

r = sk->sk_rmem_alloc
w = sk->sk_wmem_queued;
f = sk->sk_forward_alloc;
t = sk->sk_wmem_alloc;

Birisi ne demek istediğini biliyor mu? Tahminlerim:

  • rmem_alloc : gelen arabellek boyutu
  • wmem_alloc : giden arabellek boyutu
  • sk_forward_alloc : ???
  • sk->sk_wmem_queued : ???

İşte benim tampon boyutları:

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

Arabellek boyutu yapılandırmanız nedir? Soket bağlantılarında doygunluk alma tamponlarının olduğunu görüyor musunuz? Partiniz EWOULDBLOCK'a bağlantıyı kesiyor mu?
Karlson

Yuvalarımın boyutları oldukça küçük, sanırım yazıyı onlarla güncelledim. EWOULDBLOCK için söyleyemem. İstemcim JAVA'da ve sadece sunucu tarafından bağlantısı kesildiğini söylüyor. Sunucu C ++ 'da ve sadece herhangi bir bilgi olmadan bağlantıyı bıraktığını söylüyor. Ben davranışını değiştiremiyorum bu yüzden sunucunun kaynak kodu yok. Görünüşe göre istemciler biraz fazla yüklendiklerinde, sadece birkaç saniye sürse bile bağlantı kesiliyor.
Twister

Arabellek boyutlarının yapılandırması sunucuda ayarlanabilir mi? İstemcide arabellek boyutlarını izleyebilir misiniz? Müşterinin kaynağına erişiminiz var mı? Arabellek boyutlarını izlemek için netstat -apnc komutunu çalıştırdınız mı? Ne olduğunu görmek için çekirdekteki tampon boyutlarını artırmaya çalıştınız mı?
Karlson

Evet, ve zaten sunucunun maksimum değerine ayarlanmış (net.ipv4.tcp_ * özelliklerinden daha büyük olamayacaklarına inanıyorum, değil mi?) Netstat -apnc için bana arabellek boyutlarını vermez, bu yüzden ss'ye baktım. Çekirdek için sunucuda kök değilim ve buradaki BT ekipleri oldukça inatçı. Değerleri değiştirmelerini istemeden önce ne olacağından emin olmalıyım ... Ve evet istemci kaynağına erişebiliyorum ve istemciyle ilgili incelemem, bağlantı kesmenin sunucudan geldiğini onaylıyor.
Twister

netstat -apnc Linux'ta toplam gönderme ve alma kuyruğu boyutunu verir. Sunucu arabelleği kullanılabilir maksimum değere ayarlarsa ve hala
doyuruyorsanız

Yanıtlar:


7

sk_forward_alloc soketin kotasında mevcut olan toplam bellek olan ileri atanan bellektir.

sk_wmem_queued soket gönderme arabelleği tarafından gönderme kuyruğunda kuyruğa alınmış ve henüz gönderilmemiş veya henüz onaylanmamış bellek miktarıdır.

TCP Bellek Yönetimi hakkında daha fazla bilgiyi Linux'ta TCP / IP Mimarisi, Tasarım ve Uygulama bölüm 9'da bulabilirsiniz Sameer Seth, M. Ajaykumar Venkatesulu


Bu tanımın nasıl sk_wmem_queuedfarklı olduğunu anlamıyorum sk_wmem_alloc, bu konuda biraz genişletebilir misiniz? (Cevabı biliyorsanız, bu soruya bir cevap eklemek için çekinmeyin: unix.stackexchange.com/questions/551444/… )
küçük dostum

1

Ss'nin man sayfasına bakın.

<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)

0

İlgili sk_wmem_queuedve sk_wmem_allocben aynı soruyu sordu Cevabı burada kopyalayacağız böylece:

Linux ağ yığınına katkıda bulunan Eric Dumazet'e e-posta gönderdim ve işte cevap:

sk_wmem_alloctaşıma yığınından sonra kuyruğa alınan skb için bayt sayısını izler : qdisc katmanı ve NIC TX halka arabellekleri.

TCP yazma kuyruğunda oturan 1 MB veri varsa, henüz gönderilmemişse (cwnd sınırı) sk_wmem_queueyaklaşık 1 MB , ancak sk_wmem_allocyaklaşık 0 olacaktır

Bu üç kuyruk türünün (soket arabelleği, qdisc kuyruğu ve aygıt kuyruğu) ne olduğunu anlamak için çok iyi bir belge bu makale (oldukça uzun) makaledir . Özetle, soket, paketleri doğrudan qdisc kuyruğuna iterek başlar ve bu da onları cihaz kuyruğuna iletir. Qdisc kuyruğu dolduğunda, soket verileri kendi yazma kuyruğunda arabelleğe almaya başlar.

ağ yığını paketleri doğrudan kuyruk disipline yerleştirir veya kuyruk doluysa üst katmanları (örneğin soket tamponu) geri iter

Temel olarak: sk_wmem_queuessoket arabelleği ( sock.sk_write_queue) sk_wmem_alloctarafından kullanılan bellek, qdisc ve cihaz kuyruklarındaki paketler tarafından kullanılan bellektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.