ماذا يعني ناتج "ss -s"

تم استبدال الأداة المساعدة netstat بأداة ss ، وغالبًا ما يتم استخدام مخرجات المعلومات (الملخص) المجمعة " ss -s " (أو " ss - summary ") لرصد الاحتياجات. ومع ذلك ، ماذا يعني كل من الحقول المعروضة؟

# ss -s
Total: 15046 (kernel 16739)
TCP:   39306 (estab 11458, closed 25092, orphaned 110, synrecv 0, timewait 24929/0), ports 0

Transport Total     IP        IPv6
*	  16739     -         -        
RAW	  0         0         0        
UDP	  15        5         10       
TCP	  14214     1214      13000    
INET	  14229     1219      13010    
FRAG	  0         0         0        

كما اتضح ، هناك خفايا.

مصدر الحقيقة هو كود المصدر. شفرة المصدر من الأداة المساعدة «SS» وجدت في iproute2 / ومتفرقات / ss.c . يتم إخراج "ss -s" في دالة print_summary .

قبل الإصدار 4.17.0 ، يتم عرض إخراج "ss -s" أعلاه. بعد ارتكاب 90ee99d ، بدأ يبدو هكذا :

# ss -s
Total: 15046
TCP:   39306 (estab 11458, closed 25092, orphaned 110, timewait 24929)

Transport Total     IP        IPv6
RAW	  0         0         0        
UDP	  15        5         10       
TCP	  14214     1214      13000    
INET	  14229     1219      13010    
FRAG	  0         0         0        

كما ترى ، تمت إزالة حقل "kernel" من سطر "Total". في السطر "TCP" ، تم حذف الحقل "synrecv" ، وبقي "(timewait)" رقم واحد (أول) ، وحذف "المنافذ". في الجدول "النقل" ، تم حذف الصف "*". يمكن ترجمة المعنى العام للالتزام على النحو التالي: " لقد أزلنا من الناتج ما تم كسره منذ فترة طويلة ".

ما الذي تم كسره؟


في print_summary الإصدار 4.16.0 ، يتم استخدام ألواح بناء ، يتم تعبئتها عن طريق استدعاء get_slabstat . إذا حاولنا ترجمة استدعاء get_slabstat إلى أوامر shell ، نحصل على ما يلي:

# egrep '^(sock|tcp_bind_bucket|tcp_tw_bucket|tcp_open_request|skbuff_head_cache)' /proc/slabinfo | awk '{ print $1, $2; }'

حيث تتوافق مفاتيح "/ proc / slabinfo" مع حقول بنية "slabstat":

struct slabstat {
	int socks;       // sock, net/core/sock.c:sk_init,   2.6.12
	int tcp_ports;   // tcp_bind_bucket, net/ipv4/tcp.c:tcp_init
	int tcp_tws;     // tcp_tw_bucket, net/ipv4/tcp.c:tcp_init,   2.6.14
	int tcp_syns;    // tcp_open_request, net/ipv4/tcp.c:tcp_init,   2.6.13
	int skbs;        // skbuff_head_cache, net/core/skbuff:skb_init,  
};

وبعبارة أخرى ، من بين جميع القيم التي تم الحصول عليها من "/ proc / slabinfo" اليوم ، يمكن الحصول على القيمة "tcp_bind_bucket" فقط ، والتي يتم عرضها في حقل "المنافذ". سأقدم وصفه من كتاب "بنية TCP / IP والتصميم والتنفيذ في Linux. بقلم S. Seth و MA Venkatesulu 2008 جمعية IEEE للكمبيوتر ":
This structure keeps information about the port number usage by sockets and the way the port number is being used. The information is useful enough to tell the new binding socket whether it can bind itself to a particular port number that is already in use. The data structure also keeps track of all the socket’s that are associated with this port number.
الآن مرة أخرى نفس الشيء ، ولكن في شكل صورة (الفنان مني حتى):



هل تلاحظ أي شيء غريب؟ لوح "جورب" (تم حذفه في 2.6.12) له قيمة غير صفرية. التفسير بسيط للغاية - نظرًا لخصائص مقارنة السلسلة ، فإن أي رقم يبدأ مفتاحه بـ "جورب" سيدخل في قيمة الحقل. في حالتي ، هذا هو "sock_inode_cache" من "net / socket.c: init_inodecache" المتعلق بـ "sockfs" - قائمة "inodes" التي تحتوي على "بنية مأخذ التوصيل" (ربما هذا ليس تمامًا ما يقصده صاحب الأداة):

# egrep '^sock' /proc/slabinfo | awk '{ print $1, $2; }'
sock_inode_cache 16739

حسنًا ، "tcp_bind_bucket" مفقود فقط بسبب خيارات بناء النواة (وبناءً على ذلك ، فإن حقل "المنافذ" يحتوي دائمًا على القيمة "0").

وصف المخرجات "ss -s"


قبل الغوص في تعقيدات العمليات الحسابية الميدانية ، من المنطقي تحديث حالة المقابس في الذاكرة (تم التأسيس ، والانتظار قريبًا ، والوقت - الانتظار ، وما إلى ذلك). لمن نسي ، ساعد ويكي: RU ، EN .

يعتمد إخراج الأداة على القيم التي تم الحصول عليها من الملفات:

# cat /proc/net/sockstat
sockets: used 15046
TCP: inuse 1205 orphan 111 tw 24952 alloc 14368 mem 5890
UDP: inuse 5 mem 86
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

# cat /proc/net/sockstat6
TCP6: inuse 13000
UDP6: inuse 10
UDPLITE6: inuse 0
RAW6: inuse 0
FRAG6: inuse 0 memory 0

# egrep '^Tcp:' /proc/net/snmp
Tcp: RtoAlgorithm RtoMin RtoMax ... AttemptFails EstabResets CurrEstab ...
Tcp: 1 200 120000 ... 1348218 4095008 11458 ...

القيم المحسوبة من محتويات "net / sockstat" (لتبسيط التصور في الصور):



  • الإجمالي - إجمالي عدد مآخذ التوصيل في النظام (بما في ذلك مآخذ توصيل يونيكس) في أي حالة باستثناء TIME_WAIT ؛
  • TCP: - العدد الإجمالي من مآخذ TCP (بما في ذلك الإصدار IPv6) في أي دولة، طوماس فيبس يتم فصل مآخذ من الوك مآخذ بسبب ما يسمى ب. " طابور الموت " - لا يمكن استخدامها حتى الانتقال إلى حالة "مغلقة".
    • orphaned — «» TCP (, );
    • timewait — TCP TIME_WAIT;
    • inuse TCP, UDP, RAWv4 CLOSED TIME_WAIT;
    • inuse FRAG (bool) — , memory — ( mem, ).

القيم المحسوبة بواسطة محتويات "net / sockstat6":



يبدو أن كل شيء بسيط هنا - " Transport / Total " هو مجموع قيم قيم " IP " و " IPv6 ".

القيم المحسوبة من محتويات "net / snmp". وفقًا لـ RFC-4022 ، فإن " tcpCurrEstab " هو "عدد اتصالات TCP التي تم تأسيس الحالة الحالية لها أو فترة انتظار قريبة".



وآخر حقل " مغلق " هو مجموع المقابس والمآخذ المخصصة في حالة TIME_WAIT ناقص مجموع مقابس TCPv4 و TCPv6 في أي من الحالات غير المغلقة:



PS ولا تنسَ التوقيع على المحاور على الرسوم البيانية.

All Articles