我可以看到我的服务器正在发送大量的stream量。 如果我去netstat -apln | grep的httpd我可以看到,所有的stream量将去一个IP。
有没有一种方法,我可以看到什么脚本/文件被用来发送数据到该IP? 或一般的任何IP?
我知道tcpdump可以看数据包,但似乎无法做到这一点。
netstat命令只能告诉你哪些连接当前打开,而不是每个发送和接收的stream量。 要找出哪些连接正在传输大部分数据,您需要使用其他工具,例如iftop或tcpdump 。
您接下来要做的事情很大程度上取决于每个连接的生命周期以及哪一端build立了连接。 如果你的末端是服务器,那么你应该能够识别属于服务器进程的监听套接字。
如果它确实是一个httpd进程(你似乎暗示了你的问题),那么你的Web服务器访问日志就是你要查看的地方。 需要注意的一点是,每次请求只有在该请求的传输完成后才被logging。 如果您正在提供MB大小的文件,这可能会产生重大影响。
如果你的结局恰好是客户端,那么你将不会看到侦听套接字,但是如果连接长期存在,一旦你确认了哪个连接正在占用带宽,就可以使用netstatfind连接和相应的进程。
如果上述调查引导您发现大多数stream量发生在从您的末端build立的短期连接上,那么netstat不足以识别哪个stream程负责。 这个特定的情况已经在一个较老的问题中讨论过 。
netstat -nlpt(必须以sudo或root身份运行)将返回负责连接的进程的pid /名称。 既然你知道IP,你应该可以简单的做
sudo netstat -nlpt | grep xx.xx.xx.xx
并看看它是哪个进程。 我的技能更多的是在Windows中,所以我的语法可能有点偏离。 我查了一下linux的开关,发现这里是#5。
nethogs报告每个进程使用的带宽,每秒更新一次。
您可以尝试使用lsof来检查哪些进程正在使用networking连接。
列出所有networking连接: lsof -i
列出所有的TCP或UDP连接: lsof -i tcp; lsof -i udp; lsof -i tcp; lsof -i udp;
侦听特定端口的进程: lsof -i :80
列出进程正在使用的networking文件: lsof -i -a -p 234
列出以ssh: lsof -i -a -c ssh开头的进程打开的networking文件
这是一个有趣的问题,看起来内核默认情况下不存储每进程networking吞吐量的计数器,但内核模块netatop [1]增加了这个function,然后使用atop [ 2]。
[1]:见http://www.atoptool.nl/netatop.php
[2]:见http://www.atoptool.nl/