“netstat -p”和“lsof -n -i -P”似乎都在读取所有进程fd的链接,如stat /proc/*/fd/*
。
如何更有效地完成工作?
我的程序想知道连接到它的进程。一遍又一遍地遍历所有过程似乎太无效了。
也欢迎提出iptables内容或内核补丁的方法。
答案 0 :(得分:4)
查看this answer,其中提到了执行套接字到进程映射的各种方法和程序。您还可以尝试其他几种技术来提高性能:
/proc
中的文件描述符和/proc/net
中的信息。这是通过链接答案中提到的程序完成的,但只有在您的过程持续时间超过几秒钟时才可行。getpeername()
,但这会让您了解可能的端点以及它们映射到的流程。您的问题表明您正在本地连接套接字,您可以尝试使用Unix sockets,它允许您在通过将SO_PASSCRED
传递给setsockopt()
来交换消息时接收对等方的凭据。看看这些例子(它们非常讨厌,但我能找到的最好)。
fs/proc/base.c
。这是/proc/PID/fd/FD
中文件描述符上的readlink结果给出的信息的核心。开销的一个重要部分是在VFS层上下传递请求,在提供给定信息的所有内核数据结构上发生的大量锁定,以及分别在内核和末端的字符串连接和解串。您可以调整此文件中的某些代码来生成此信息,而不需要很多中间层,特别是将每次进程的锁定最小化一次,或者只扫描一次您对整个数据集的操作。我个人的建议是暂时强行使用它,最好以反向数字顺序遍历/proc
中的进程,因为更近期和有趣的进程将具有更高的PID,并且一旦你已经返回找到你想要的结果。每个传入连接执行此操作相对便宜,这实际上取决于您的应用程序的性能关键程度。您肯定会发现绕过调用netstat
并直接从/proc/net/PROTO
解析新连接,然后在/proc/PID/fd
中找到套接字是值得的。如果您的所有流量都是localhost,只需切换到Unix套接字并直接获取凭据。编写一个新的系统调用程序或proc模块,它会转储大量有关文件描述符的数据,我将保存到最后。