自从安装新服务器后,我的网络性能下降,我一直使用 Wireshark 来捕获我的网络。我发现有几次我的服务器在 30 秒内发送了 170,000 个 SSDP 请求。似乎有点过分 :p
Simple Service Discovery Protocol
M-SEARCH * HTTP/1.1\r\n
Host: 239.255.255.250:1900\r\n
<Host: 239.255.255.250:1900\r\n>
Man: "ssdp:discover"\r\n
ST: ssdp:all\r\n
MX: 5\r\n
\r\n
[Full request URI: http://239.255.255.250:1900*]
<Request: True>
[HTTP request 10/149390]
[Prev request in frame: 9]
[Next request in frame: 12]
这正是发送了超过 10 万次的请求。现在我想知道,有没有一种聪明的方法可以找出我的服务器上哪个进程导致了这个请求?
编辑:原来是 PLEX 服务器为 DNLA 创建了所有这些消息。我的路由器同时出现了一个错误,导致路由器超时和崩溃。升级路由器软件解决了这个问题。
答案1
要查找执行此操作的进程,请使用:
sudo lsof -n -P -i +c 13 | grep 1900
来自man lsof
:列出打开的文件
打开的文件可以是常规文件、目录、块特殊文件、字符特殊文件、执行文本引用、库、流或网络文件(Internet 套接字、NFS 文件或 UNIX 域套接字)。可以通过路径选择文件系统中的特定文件或所有文件。
-n
:禁止将网络号转换为网络文件的主机名。禁止转换可能会使lsof
运行速度更快。当主机名查找无法正常工作时,它也很有用。-P
:禁止将网络文件的端口号转换为端口名。禁止转换可能会使lsof
运行速度稍快一些。当端口名查找不正常时,它也很有用。-i [i]
:选择 Internet 地址与 i 中指定的地址相匹配的文件列表。如果未指定地址,则此选项将选择所有 Internet 和 x.25 (HP-UX) 网络文件的列表。+c w
:定义要打印在列中的与进程关联的 UNIX 命令的名称(由 UNIX 方言提供)的最大初始字符数。COMMAND
(lsof
默认值为 9。)
sudo lsof -n -P -i +c 13 | grep 1900
它列出了系统中进程打开的文件,并使用上面列出的选项来修改显示的内容。例如,我使用了:
sudo lsof -P -i +c 13
结果:
没有 则较慢
-n
,并且网络号到主机名的转换
postgres 2930 postgres 11u IPv4 28152 0t0 UDP localhost:56771->localhost:56771 postgres 2931 postgres 11u IPv4 28152 0t0 UDP localhost:56771->localhost:56771 postgres 2932 postgres 11u IPv4 28152 0t0 UDP localhost:56771->localhost:56771 postgres 2933 postgres 11u IPv4 28152 0t0 UDP localhost:56771->localhost:56771 postgres 2934 postgres 11u IPv4 28152 0t0 UDP localhost:56771->localhost:56771 postgres 2936 postgres 11u IPv4 26439 0t0 UDP localhost:46276->localhost:46276 postgres 2937 postgres 11u IPv4 26439 0t0 UDP localhost:46276->localhost:46276 postgres 2938 postgres 11u IPv4 26439 0t0 UDP localhost:46276->localhost:46276 postgres 2939 postgres 11u IPv4 26439 0t0 UDP localhost:46276->localhost:46276 postgres 2940 postgres 11u IPv4 26439 0t0 UDP localhost:46276->localhost:46276
但使用:
sudo lsof -n -P -i +c 13
结果:
速度更快,无需将网络号转换为主机名
postgres 2930 postgres 11u IPv4 28152 0t0 UDP 127.0.0.1:56771->127.0.0.1:56771 postgres 2931 postgres 11u IPv4 28152 0t0 UDP 127.0.0.1:56771->127.0.0.1:56771 postgres 2932 postgres 11u IPv4 28152 0t0 UDP 127.0.0.1:56771->127.0.0.1:56771 postgres 2933 postgres 11u IPv4 28152 0t0 UDP 127.0.0.1:56771->127.0.0.1:56771 postgres 2934 postgres 11u IPv4 28152 0t0 UDP 127.0.0.1:56771->127.0.0.1:56771 postgres 2936 postgres 11u IPv4 26439 0t0 UDP 127.0.0.1:46276->127.0.0.1:46276 postgres 2937 postgres 11u IPv4 26439 0t0 UDP 127.0.0.1:46276->127.0.0.1:46276 postgres 2938 postgres 11u IPv4 26439 0t0 UDP 127.0.0.1:46276->127.0.0.1:46276 postgres 2939 postgres 11u IPv4 26439 0t0 UDP 127.0.0.1:46276->127.0.0.1:46276 postgres 2940 postgres 11u IPv4 26439 0t0 UDP 127.0.0.1:46276->127.0.0.1:46276
这里我只使用了-n
,进行网络号转换需要更多时间,如果没有选项,-n
搜索速度会更快,删除以查看主机名。尝试使用其他选项来查看不同的输出。总的来说,这些选项可以改善搜索并使其更快。