參考: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 |