如果这不是这个问题的最佳论坛,请原谅我,但它似乎与内核相关而不是与编程本身相关。
我正在编写一个脚本来查询系统的开放端口,以便我们可以绘制和监视统计信息。为此,我使用了 iproute 包中的“ss”命令。如果执行,ss -s|grep estab您将收到类似于以下内容的输出:
TCP: 296 (estab 6, closed 238, orphaned 0, synrecv 0, timewait 238/0), ports 0
Run Code Online (Sandbox Code Playgroud)
我的问题与 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
);
Run Code Online (Sandbox Code Playgroud)
我必须承认,我对“slabstat”应该意味着什么的搜索最终导致我了解了 /proc/slabinfo 中的平板缓存及其报告界面。
问题:slabtable 与 TIME_WAIT 套接字计算有什么关系?我不明白为什么报告这个数字,因为每次我在我尝试过的每台服务器上运行命令时,这个数字总是零。
我试图找到如何记录特定实例化rrdtool以查看它接收的路径是否不正确。
我知道我可以将可执行文件包装在一个可以记录参数的 shell 脚本中,但我想知道是否有一种更特定于内核的方法来监视它,也许是一个文件系统回调,可以看到特定的 /proc/pid/exe匹配给定的二进制文件?
许多年前,我在 Linux 上遇到了一个问题,其中进程会随机进入睡眠状态。那时,我知道/proc文件系统的一个技巧来触发进程的唤醒。我依稀记得能够做类似的事情,"echo R" >/proc/pid/stat但这似乎不是正确的命令。
互联网上有很多关于“如何唤醒睡眠过程?”的点击率。很多答案都是“哦,杀了它!” 我知道还有另一种方式,但现在我的记忆力很差。
到目前为止,我已经尝试过:
kill -SIGCONT <pid>
echo "R" > /proc/<pid>/status
echo "R" > /proc/<pid>/stat
Run Code Online (Sandbox Code Playgroud) 我曾在多家公司、多个发行版和多个内核版本的机器上随机、间歇性地发生此问题。我想我只是被诅咒了。
发生的情况是我将加载一个新的盒子,并且我将在 ssh 中做一些事情,比如 yum 更新或 apt-get。一切都会进展顺利,然后会话就停止了。ssh 不会断开连接,就好像有人向会话发送了滚动锁定按键一样。
如果我在 ssh 会话中按回车键、空格键或任何按键,会话会重新唤醒并且好像没有出错一样。
曾几何时,我追查过这样的问题,发现交互进程正在进入 SLEEP 状态。在这种情况下,我无法确认这是相同的行为,但如果我能查明具体原因,我会修正这个问题。
无论如何,我一直无法弄清楚为什么这些进程会随机进入睡眠状态。
有没有人遇到过这个或类似的问题,并且对可能导致它的原因有任何了解?