【问题标题】:How to do like "netstat -p", but faster?如何像“netstat -p”一样做,但更快?
【发布时间】:2010-10-30 01:21:52
【问题描述】:

“netstat -p”和“lsof -n -i -P”似乎都在重新链接所有进程 fd,例如 stat /proc/*/fd/*

如何更有效地做到这一点?

我的程序想知道连接到它的进程是什么。一遍又一遍地遍历所有进程似乎太无效了。

也欢迎建议 iptables 或内核补丁的方式。

【问题讨论】:

标签: linux sockets process netstat


【解决方案1】:

看看this answer,其中提到了执行套接字到进程映射的各种方法和程序。您还可以尝试几种其他技术来提高性能:

  1. 缓存/proc中的文件描述符,以及/proc/net中的信息。这是由链接答案中提到的程序完成的,但仅当您的过程持续超过几秒钟时才可行。
  2. 您可以尝试getpeername(),但这需要您了解可能的端点以及它们映射到的进程。您的问题表明您正在本地连接套接字,您可以尝试使用Unix sockets,它允许您在交换消息时通过将SO_PASSCRED 传递给setsockopt() 来接收对等方的凭据。看看这些例子(它们很讨厌,但我能找到最好的)。
  3. 看看Linux内核中的fs/proc/base.c。这是/proc/PID/fd/FD 中文件描述符上的读取链接结果给出的信息的核心。开销的一个重要部分是请求在 VFS 层上下的传递,在提供给定信息的所有内核数据结构上发生的大量锁定,以及分别在内核和您端的 stringyfying 和 destringyfying。您可以调整此文件中的一些代码以在没有许多中间层的情况下生成此信息,特别是将锁定最小化为每个进程一次,或者只需每次扫描您所追求的整个数据集一次。

我个人的建议是暂时强制使用它,理想情况下以相反的数字顺序遍历 /proc 中的进程,因为最近和有趣的进程将具有更高的 PID,并在您找到后立即返回你追求的结果。每个传入连接执行一次此操作相对成本较低,这实际上取决于您的应用程序对性能的重要性。您肯定会发现绕过调用netstat 并直接从/proc/net/PROTO 解析新连接,然后在/proc/PID/fd 中定位套接字是值得的。如果您的所有流量都是 localhost,则只需切换到 Unix 套接字并直接获取凭据。编写一个新的 syscall 或 proc 模块,转储大量关于我要保存到最后的文件描述符的数据。

【讨论】:

  • 2 不是办法。 Unix套接字也可以。该程序捕获由“-j REDIRECT”重定向的连接并向用户显示该连接用于哪个程序(并根据进程名称应用策略)。如果是Firefox,那么优先级较高;如果 qbittorrent 那么低优先级。
  • “每个传入连接执行一次相对便宜”即使是这样,控制台中的“strace”的外观也不会比以前好。大多数系统调用都是徒劳的(只有少数——有利润)。
  • @Vi:你看,现实和现实太不一样了。您可能会注意到在 strace 中调用任何 C 程序“看起来”非常糟糕。由于您还没有真正实现这一点,您会观察到 netstat 看起来有多慢。您会发现这与 /proc 中 fd 查找的开销无关,而与反向主机名查找有关(通过 -n 绕过它)。您应该先分析您的最终应用,然后再将这归咎于程序的这一部分。
  • 这是什么意思“如果你所有的流量都是本地主机,只需切换到 Unix 套接字并直接获取凭据。”?
  • @Lavanya:OP 想要获取套接字对等进程的详细信息。 Unix 套接字允许您从套接字中获取它,而无需挖掘 /proc
猜你喜欢
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 2021-07-09
  • 2013-07-11
  • 2011-02-09
  • 1970-01-01
相关资源
最近更新 更多