1. 首先查看網絡連接數
netstat -an
或者 ss -s 進行統計,如果帶上-p參數的話當連接數比較多的時候就會比較慢
或者查看系統:
/proc/net/sockstat:
sockets: used 160 TCP: inuse 0 orphan 0 tw 0 alloc 4 mem 0 UDP: inuse 0 mem 1 UDPLITE: inuse 0 RAW: inuse 0 FRAG: inuse 0 memory 0
2. 系統dmesg提示 socket out of memory
首先查看系統socket使用了多少,參考1.
3. 查看系統給tcp分配的內存大小限制
cat /proc/sys/net/ipv4/tcp_rmem #tcp read buffer bytes
4096 87380 629145
第一項是buffer最小4096字節,第二項是默認值87380字節,第三項是read buffer 最大限制629145 字節
cat /proc/sys/net/ipv4/tcp_wmem #tcp write buffer bytes write buffer與read buffer類似 cat /proc/sys/net/ipv4/tcp_mem #tcp memory pages 21498 28665 42996
第一個值是內存使用的下限;第二個值是內存壓力模式開始對緩沖區使用應用壓力的上限;第三個值是內存使用的上限。在這個層次上可以將報文丟棄,從而減少對內存的使用socket out of memory。可以結合sockstat里的統計數據分析tcp使用內存是否超過了限制,注意這里單位是頁,查看頁大小getconf PAGESIZE
另外可以查看tcp讀寫發送窗口默認值:
/proc/sys/net/core/rmem_default /proc/sys/net/core/rmem_max /proc/sys/net/core/wmem_default /proc/sys/net/core/wmem_max
另外socket out of memory 也有可能是孤兒socket過多導致的。
4. 內核配置最大的孤兒socket數:
cat /proc/sys/net/ipv4/max_orphans
4096
查看孤兒socket
cat /proc/net/sockstat sockets: used 403 TCP: inuse 4 orphan 0 tw 0 alloc 10 mem 1 UDP: inuse 12 mem 7 UDPLITE: inuse 0 RAW: infuse 0 FRAG: inuse 0 memory 0
注意這里的orphan 往往會被內核x2 或者x4,所以有時候看到這里的orphan數比較小,但是卻有out of socket memory的提示,有可能就是這個放大倍數導致的。關于孤兒socket 可以參考:孤兒socket
5. 一個tcp socket占用多大內存
首先socket包括本地ip、端口,對端ip、端口;發送、接收緩沖區等(跟配置有關)。
如果按照上面最小的讀寫緩沖區來算那么一個socket大概占用8K的內存。
如果單從一個socket占用的內存來看,一個8GB的內存,一般情況下可以承受100萬得sock長連接,前提是系統文件句柄要調大
tcp內存最大也要進行調整。
tcp內核參數調優
tcp參數調優
6. 查看系統總共使用了多少文件描述符
cat /proc/sys/fs/file-nr 4096 0 9000
第一項就是當前系統已經打開的文件句柄(包括socket ),最后一項是整個系統最大可以打開的文件句柄數
cat /proc/sys/fs/file-max
系統最大的文件句柄數
cat /proc/sys/fs/nr_open
1048576
系統配置的單個進程最大可以打開的文件句柄數
7.dmesg or dmesg -T
查看內核的錯誤信息,比如tcp鏈接太多,句柄不夠用,內存不足導致某些進程被kill掉
8. 使用slabtop 查看內核內存分配
IOStat -d 1 10 -x
9. 查看系統統計
vmstat -n 1 10
可以通過該命令動態觀察swap內存是否在發生變化,如果一直在增長,那么可以初步斷定 系統內存不夠用。
當cache、buffer占用大量內存是可以通過調整內核參數釋放改內存:
$sync (必須要先執行)
$ echo “3” > /proc/sys/vm/drop_caches (該值默認是0,不釋放)
10. tcp keepalive time 如果想開啟tcp 半打開狀態的連接的回收,單單配置keep alive是不夠的,需要在程序中調用setsockopt 開啟探測功能,否則即使系統側配置了keepalive time也是不夠的。
11. top 然后按數字1,看各個cpu是否存在不均衡的情況,如果是則看下系統軟中斷一列的cpu是否使用過高,如果是則進一步確認是不是網卡軟中斷引起的:
Fig 1:各個cpu使用情況
下圖是系統中斷在各個cpu的分布,通過分析上下兩個圖就可以知道是不是因為網卡導致軟中斷過高,如果是網卡收發包軟中斷過高則需要進行多網卡隊列配置優化或者是收發包軟中斷優化(RPS/RFS)
查看網卡是否支持多網卡隊列可以通過以下命令:
ethtool -L eth0
RPS/RFS 優化配置(原理就是根據四元組進行hash選則對應的CPU進行CPU負載均衡、提升CPU緩存命中率):
RPS:
RPS指定哪些接收隊列需要通過rps平均到配置的cpu列表上。
/sys/class/net/(dev)/queues/rx-(n)/rps_cpus
RFS:
每個隊列的數據流表總數可以通過下面的參數來設置:
該值設置成rps_sock_flow_entries/N,其中N表示設備的接收隊列數量。
/sys/class/net/(dev)/queues/rx-(n)/rps_flow_cnt
全局數據流表(rps_sock_flow_table)的總數,紅帽是建議設置成32768,一般設置成最大并發鏈接數量
/proc/sys/net/core/rps_sock_flow_entries