如果这不是解决这个问题的最佳论坛,请原谅我,但它似乎与内核比与编程本身更相关。
我正在编写一个脚本来查询系统的开放端口,以便我们可以绘制图表并监视统计数据。为此,我使用 iproute 包中的“ss”命令。如果执行,ss -s|grep estab
您将收到类似以下的输出:
TCP: 296 (estab 6, closed 238, orphaned 0, synrecv 0, timewait 238/0), ports 0
我的问题与 timewait 变量有关,它显示计算出的套接字处于 TIME_WAIT 状态。当我试图找出斜线后引用的数字时,它变成了搜索源代码的旋风式冒险,最终导致我找到了以下代码片段:
printf("TCP: %d (estab %d, closed %d, orphaned %d, synrecv %d, timewait %d/%d), ports %d\n",
s.tcp_total + slabstat.tcp_syns + s.tcp_tws,
sn.tcp_estab,
s.tcp_total - (s.tcp4_hashed+s.tcp6_hashed-s.tcp_tws),
s.tcp_orphans,
slabstat.tcp_syns,
s.tcp_tws, slabstat.tcp_tws,
slabstat.tcp_ports
);
我必须承认,我对“slabstat”含义的搜索最终导致我了解了slab 缓存及其在/proc/slabinfo 的报告接口。
问题:slabtable 与 TIME_WAIT 套接字计算有什么关系?我无法弄清楚为什么会报告这个数字,因为每次我在尝试过的每台服务器上运行该命令时,该数字始终为零。
答案1
它看起来像是tcp_tw_buckets
最终被轮询的内容,这是一个从 Linux 2.6.12 开始被删除的结构
所以最后一个数字可能总是 0,除非它是在 7 年的内核上。
至于查询平板,据我所知,它比其他可用方法快得多。