linux中netstat和ss命令詳解

參考:https://www.phpmianshi.com/?id=105

 

 

由於nio的普及,ck10k的問題已經成爲過去式。現在隨便一臺服務器,就可以支持數十萬級別的連接了。那麼我們來算一下,100萬的連接需要多少資源。

首先,每一個連接都是文件句柄,所以需要文件描述符數量支持纔行,每一個socket內存佔用15k-20k之間,這樣,僅維護相應socket,就需要20G內存;而廣播一個1KB的消息需要佔用的帶寬爲1000M

由於nio的普及,ck10k的問題已經成爲過去式。現在隨便一臺服務器,都可以支持數十萬級別的連接了。

 

那麼10萬的連接需要多少資源呢?

 

由於一個連接都是文件句柄,所以需要文件描述符數量支持纔行,每一個socket內存佔用15k-20k之間,這樣,僅維護相應socket,就需要20kx10萬=2G內存;而廣播一個1KB的消息需要佔用的帶寬爲100M

 

如何查看當前系統有多少連接呢

查看當前系統的連接
[root@VM_0_15_centos ~]# netstat -antp | awk '{a[$6]++}END{ for(x in a)print x,a[x]}'
LISTEN 13
ESTABLISHED 5
established) 1
Foreign 1
TIME_WAIT 5

 

但如果你在一臺有上萬連接的服務器上執行這個命令,你可能會等上很長時間。所以,我們有了第二代網絡狀態統計工具:netstat => ss

如果你在一臺有上萬連接的服務器上執行這個命令,可能會很卡。但是我們有了更好的替代方案ss命令

[root@VM_0_15_centos ~]# ss -s
Total: 252 (kernel 294)
TCP:   24 (estab 5, closed 6, orphaned 0, synrecv 0, timewait 4/0), ports 0

Transport Total     IP        IPv6
*         294       -         -        
RAW       0         0         0        
UDP       8         5         3        
TCP       18        15        3        
INET      26        20        6        
FRAG      0         0         0

 

下面我們詳解2個命令的用法

1.netstat命令

netstat 命令:用於顯示各種網絡相關信息,如網絡連接,路由表,接口統計狀態,無效連接,組播成員 等等。

netstat命令是net-tools軟件包中的一員

選項:    
-a:  列出系統中所有網絡連接,包括已經連接的網絡服務、監聽的網絡服務和Socket套接字        
-t:  列出TCP數據
-u:  列出UDP數據    
-l:  列出正在監聽的網絡服務(不包含已經連接的網路服務)    
-n:  用端口顯示服務,而不用服務名    
-p:  列出該服務的進程ID(PID)

 

 

2.ss命令

 

 

ss是Socket Statistics的縮寫

ss命令可以用來獲取socket統計信息,它可以顯示和netstat類似的內容。但是ss的優勢在於它能夠顯示更詳細的有關網絡連接的狀態信息,而比netstat更快速、更高效。

ss命令是iproute2軟件包中的一員

 

查看服務器上所有的socket連接

[root@dev logs]# ss -a
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port   
LISTEN     0      128                     *:51204                    *:*       
LISTEN     0      64                      *:rsync                    *:*       
LISTEN     0      7                       *:svn                      *:*       
LISTEN     0      50                      *:mysql                    *:*       
LISTEN     0      50                      *:netbios-ssn                  *:*

 

查看TCP sockets,使用-ta選項
查看UDP sockets,使用-ua選項
查看RAW sockets,使用-wa選項
查看UNIX sockets,使用-xa選項

 

重點說明一下Recv-Q和Send-Q

在LISTEN和ESTAB狀態分別代表不同意義。正常的應用程序這兩個值都應該爲0(backlog除外)。數值越大,說明問題越嚴重。

LISTEN狀態
Recv-Q:代表建立的連接還有多少沒有被accept,比如Nginx接受新連接變的很慢
Send-Q:代表listen backlog值
ESTAB狀態
Recv-Q:內核中的數據還有多少(bytes)沒有被應用程序讀取,發生了一定程度的阻塞
Send-Q:代表內核中發送隊列裏還有多少(bytes)數據沒有收到ack,對端的接收處理能力不強

 

 

和某個ip的所有連接

ss dst 10.66.224.130
ss dst 10.66.224.130:http
ss dst 10.66.224.130:smtp
ss dst 10.66.224.130:443

顯示所有的http連接

ss  dport = :http

和某個ip的所有連接
ss dst 10.66.224.130
ss dst 10.66.224.130:http
ss dst 10.66.224.130:smtp
ss dst 10.66.224.130:443

 

顯示所有的http連接
ss  dport = :http

 

 

查看連接本機最多的前10個ip地址

查看連接本機最多的前10個ip地址

 

netstat -antp | awk '{print $4}' | cut -d ':' -f1 | sort | uniq -c  | sort -n -k1 -r | head -n 10

netstat -antp | awk '{print $4}' | cut -d ':' -f1 | sort | uniq -c  | sort -n -k1 -r | head -n 10

查看TCP sockets,使用-ta選項
查看UDP sockets,使用-ua選項
查看RAW sockets,使用-wa選項
查看UNIX sockets,使用-xa選項

 

查看TCP sockets,使用-ta選項
查看UDP sockets,使用-ua選項
查看RAW sockets,使用-wa選項
查看UNIX sockets,使用-xa選項

 

3.net-tools   iproute2替換命令

 

 

net-tools起源於BSD的TCP/IP工具箱,後來成爲老版本Linux內核中配置網絡功能的工具。但自2001年起,Linux社區已經對其停止維護。同時,一些Linux發行版比如Arch Linux和CentOS/RHEL 7則已經完全拋棄了net-tools,只支持iproute2

作爲網絡配置工具的一份子,iproute2的出現旨在從功能上取代net-tools。net-tools通過procfs(/proc)和ioctl系統調用去訪問和改變內核網絡配置,而iproute2則通過netlink套接字接口與內核通訊。
 

 

當服務器的socket連接數量變得非常大時,無論是使用netstat命令還是直接cat /proc/net/tcp,執行速度都會很慢。當服務器維持的連接達到上萬個的時候,使用netstat等於浪費生命,而用ss纔是節省時間。
ss快的祕訣在於,它利用到了TCP協議棧中tcp_diag。tcp_diag是一個用於分析統計的模塊,可以獲得Linux 內核中第一手的信息,這就確保了ss的快捷高效。當然,如果你的系統中沒有tcp_diag,ss也可以正常運行,只是效率會變得稍慢。(但仍然比 netstat要快)

 

功能 net-tools (已過時) iproute2
可用網絡地址 ifconfig ip addr
網絡統計 netstat ss
路由 route -n  / netstat -rn ip route
ARP arp ip neigh
VPN iptunnel ip tunnel
vlan vconfig ip link
組播 ipmaddr /netstat -g ip maddr

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章