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