Linux下tcp socket通訊優化與問題排查
阿新 • • 發佈:2018-12-27
Linux下tcp socket通訊優化與問題排查
@Date 2018.12.09
一. 優化
1. TPC接收視窗
- 問題 : 當TCP的接收視窗佇列阻塞 -> 傳送方繼續發 -> 接受方丟掉 -> 傳送方重傳 -> 網路變糟糕
- 解決 : 接收方把接收快取的大小告訴傳送方 -> 接收快取滿了 -> 傳送方不能傳送
# 調大接收視窗快取大小 net.ipv4.tcp_rmem = "40960 873800 41943040" net.core.rmem_max = 41943040 net.core.rmem_default = 873800 # 開啟win scale net.ipv4.tcp_window_scaling = 1
2. TCP擁塞視窗
# 優化擁塞視窗的初始大小
3. TIME_WAIT狀態的回收
# 調整TIME_WAIT的回收時間 $ vi /etc/sysctl.conf net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 net.core.somaxconn = 2048 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.core.somaxconn = 10000 net.core.netdev_max_backlog = 20000 net.ipv4.tcp_rmem = 7168 11264 16777216 net.ipv4.tcp_wmem = 7168 11264 16777216 net.ipv4.tcp_mem = 786432 2097152 3145728 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_max_syn_backlog = 16384 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_max_orphans = 131072 net.ipv4.tcp_max_tw_buckets=180000 fs.file-max = 1000000
二. 問題
1. 連線超時
- 問題 :
# 檢視是否數量很多,程式碼不同不同請求連線過多,Syn佇列溢位,丟棄連線
$ netstat -anp | grep SYN_RECV/TIME_WAIT
- 解決 : 更改配置檔案數量,開啟syncookie
- 問題 :
# 前面數字一直快速增長,客戶端大量請求,造成accept佇列滿,之後來syn包也會丟棄
# 服務端接收到syn後,先看syn佇列,再看accept佇列,有一個滿則丟棄syn
$ netstat -s | grep -i listen
- 解決 : 增加accept佇列長度--配置檔案, net.core.somaxconn=8192. 計算公式:Len of accept queue = min(backlog + 1,somaxconn)
- 問題 : 客戶端經常連線失敗
# 四元組:源ip、目的ip、源port、目的port
# 一個客戶端連線一個server只能使用固定埠範圍
# TIME_WAIT狀態的socket不能複用
- 解決 : 客戶端解決,修改socket配置檔案
# 調動埠使用範圍
$ --net.ipv4.ip_local_port_range="1024 65535"
# 複用time_out狀態埠
$ --net.ipv4.tcp_tw_reuse=1
$ net.ipv4.tcp_timestamp =1
# 加快TIME_OUT狀態埠釋放速度
$ net.ipv4.tcp_tw_recyle=1
$ net.ipv4.tcp_timestamp=1
2. too many open files
# 使用者程式沒有呼叫close函式,不會自動釋放--程式異常
$ netsata -anp | grep CLOSE_WAIT