一條很有用的命令解決tcp數據發送積壓問題netstat -anpt|grep 2181|awk ‘{if($2!=0||$3!=0) print $0}’
以kafka爲例:開源kafka默認配置的據傳輸端口是2181,kafka server會監聽2181端口,等待客戶端連接,
netstat -anpt的輸出所有的tcp連接信息
netstat -anpt|grep 2181輸出和2181有關的端口的連接信息
man netstat一下如下圖:
第二列recv-q 代表此連接,內核已把數據接收到的tcp的緩衝區,但還未被應用程序調用read讀走
第三列send-q代表此連接,應用程序已調用write寫進tcp緩衝區並且已經發送到接收端但接收端還未確認的數據
情況1
如果接收端recv-q有大量積壓代表本機應用程序有問題,可能存在性能問題,數據已從網卡拷貝到tcp內核接收緩衝區就待應用程序調用read拷貝到用戶空間了,此時增加多個線程處理即可,如果應用要把數據落盤,或再通過網絡轉發走,還要關注是否,是磁盤和下一環節的網絡問題導致
例如:如果發現kafka broker節點2181端口recv-q積壓比較多,在cpu充足的情況下適當增加網絡io和磁盤io線程,同時查看iowait
情況2
如果發送端send-q有大量積壓,
1:接收端的recv-q沒有積壓則代表,發送端與接收端的網絡,或網卡有問題,可用traceroute查看具體是網絡鏈路的那一環節出現了問題,如果鏈路的每一環節都沒問題那就是網卡的問題了
2:接收端的recv-q有積壓則代表,同 情況1