Jam*_*wey 5 linux lsof tcp netstat
使用netstat
或查找已建立连接的 PID 是微不足道的lsof
。但是,我有一个进程每 60 秒创建一个连接到我们的数据库并通过最大化失败的连接尝试限制来锁定它。我可以将失败的连接限制增加到数据库上极高的值,或者我可以尝试追踪建立连接的原因,我选择了后者。
基于 tcpdump/wireshark,我可以看到正在发生的事情是建立了连接,然后连接服务器在服务器甚至可以响应之前立即关闭连接。我不知道是为什么。
第一步是找出哪个PID正在打开连接。不幸的是,这似乎说起来容易做起来难。问题是当连接进入 TIME_WAIT 状态时,它不再与 PID 相关联。由于我的连接的生命周期不到十分之一秒,有没有办法记录这些信息?
netstat
并且lsof
似乎能够每秒轮询一次,但这对于我正在处理的连接尝试来说还不够快。是否有我可以连接的挂钩以将此信息转储到日志中?或者我唯一的选择是用循环和一些编码来暴力破解它?
我使用 CentOS 6。
考虑使用SystemTap。它是动态检测引擎,可以动态修补内核,因此您可以跟踪任何内核内事件,例如打开套接字。它是由 RedHat 积极开发的,因此在 CentOS 中得到支持。
要在 CentOS 6 上安装 SystemTap:
启用调试信息存储库:
sed -i 's/^enabled=0/enabled=1/' /etc/yum.repos.d/CentOS-Debuginfo.repo
Run Code Online (Sandbox Code Playgroud)安装系统Tap:
yum install systemtap
Run Code Online (Sandbox Code Playgroud)安装内核的 debuginfo 包。它可以手动完成,但有一个工具可以自动完成:
stap-prep
Run Code Online (Sandbox Code Playgroud)SystemTap 没有 TCP 连接的 Tapset 探针,但您可以直接绑定到内核函数!您也可以在套接字级别执行此操作。
即创建名为conn.stp
:
probe kernel.function("tcp_v4_connect") {
printf("connect [%s:%d] -> %s:%d\n", execname(), pid(),
ip_ntop(@cast($uaddr, "struct sockaddr_in")->sin_addr->s_addr),
ntohs(@cast($uaddr, "struct sockaddr_in")->sin_port));
}
Run Code Online (Sandbox Code Playgroud)
这将为您提供以下输出:
# stap conn.stp
connect [nc:2552] -> 192.168.24.18:50000
connect [nc:2554] -> 192.168.24.18:50000
connect [nc:2556] -> 192.168.24.18:50000
Run Code Online (Sandbox Code Playgroud)
然而,跟踪断开连接事件似乎更加棘手。
归档时间: |
|
查看次数: |
568 次 |
最近记录: |