由于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.130ss dst 10.66.224.130:httpss dst 10.66.224.130:smtpss 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要快)