我有一个关于 linux netstat 的使用和输出结果的问题。我正在尝试解决为什么我的服务器面临通信延迟和瓶颈问题的困境,所以我开始挖掘和研究,我需要知道的一件事是按 IP 地址分组的完整连接列表和已建立的计数数量连接,所以我首先得到这个:
[root@ip-localhost ec2-user]# netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
...
9 77.70.115.30
14 54.211.25.39
198 172.31.30.15
3951
问题是,如果我对每个 ip 列出的连接数量进行汇总,我得到的总数不会是 3951,该数字也会增加到超过 44K,那么,没有 ip 地址的最终行数代表什么?文件描述符?可能的内部内核连接?忘记了系统打开的套接字?
我还总结了这些联系:
[root@ip-localhost ec2-user]# netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n
1 established)
1 Foreign
4 FIN_WAIT1
8 SYN_SENT
57 LISTEN
67 SYN_RECV
180 TIME_WAIT
1040 LAST_ACK
6323 CLOSE_WAIT
7209 ESTABLISHED
````
注意:我必须插入完整的输出,因为在 netstat 输出的末尾列出的连接没有总计。谢谢
答案1
好吧,我认为您应该在应用 awk 并剪切输出之前首先了解命令 netstat。
netstat -ntu
将显示所有 udp 和 tcp 连接,包括 tcp6。因此,当您尝试对 netstat 命令的输出应用 awk & cut 时
netstat -ntu | awk '{print $5}' | cut -d: -f1
然后 cut 命令选择“:”作为分隔符并显示第一个字段。
tcp v4 连接如下所示
12.34.56.78:80
tcp v6 连接在 netstat 输出中如下所示
::1:631
现在,当您应用带有分隔符“:”的剪切时,tcp v4 连接的输出将显示 IP 地址,但 tcp v6 的输出将是一个空行。并且应用 sort|uniq -c 将计算空白行。
如果您想列出与您的 Web 服务器建立的所有 tcp 连接,请尝试此操作
netstat -npa | grep pid_of_your_web_server | grep ESTABLISHED | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c
或者与您的 Web 服务器相关的所有 tcp 连接
netstat -npa | grep pid_of_your_web_server | grep tcp | grep -v LISTEN | awk '{print $5}' | awk -F ':' '{print $1}' | sort | uniq -c
计算所有的总数,不进行分组
netstat -npa | grep pid_of_your_web_server | grep tcp | grep -v LISTEN | wc -l
答案2
抱歉跳到旧主题,但改进永远不会太晚,为什么不使用一个 awk 来完成所有事情,而不是像这样在 grep 上浪费资源:
netstat -npa | awk -F: '/tcp/&&/LISTEN/ {print $1}' | sort | uniq -c