現象:兩臺機器間有tcp連接,一臺顯示已斷開,一臺顯示established
因為代碼沒有涉及對tcp連接層面的操作,一時沒有排查思路。
請教一下可能的產生原因和解決方法。
現有HAproxy服務器,和nodejs(socket.io)服務器
用戶與nodejs建立連接需經過:瀏覽器->阿里SLB->HA->NodeJS
最近發現,在無用戶使用的時候,NodeJS機器上仍有來自HA的連接數(netstat 命令查看)
然而,在HA機器上卻看不到這些連接。
================
如:在一臺NodeJS(13.8)機器上執行
[13.8]$ netstat -nat |grep 10711
tcp 0 0 192.168.13.8:3007 192.168.13.13:10711 ESTABLISHED
此輸出顯示13.8與13.13的10711建立了一個連接
然而在HA(13.13)上執行結果是
[13.13]$ netstat -nat |grep 10711
[13.13]$
沒有這個連接的資訊
================
這種連接目前沒有發現會自己消失,由于會不斷累積,所以現在通過重啟NodeJS服務解決。重啟NodeJS服務后(不用重啟機器,只是NodeJS行程),這種連接會消失。
uj5u.com熱心網友回復:
netstat -anop,引數o可以查看tcp keepalive計時器狀態。初步懷疑你服務器上不斷積累的tcp連接是 timer off 狀態,這種狀態下是沒有keepalive檢測的,計時器是關閉狀態,永遠不會觸發過期。在代碼里可以用setsockopt設定一下SO_KEEPALIVE來手動開啟。uj5u.com熱心網友回復:
看了一下確實是off。
我看正常的連接在established狀態也都是off啊,沒看出為什么這部分為什么就不肯消失。
專案是基于nodejs的,我沒有這方面經驗,但是在github上搜nodejs的源代碼,是有您說的設定SO_KEEPALIVE的。
用戶那邊和前面的HAproxy機器上都正常關閉了。而nodejs上一直是established。
線上不斷出現。。。測驗環境還沒能復現。。。愁苦。。。
uj5u.com熱心網友回復:
這就不清楚了。timer off的連接在正常關閉的時候是可以回收掉的。例外的關閉它發現不了,所以才會累積。具體還要摳一下創建連接的代碼為什么這個計時器沒有打開。
uj5u.com熱心網友回復:
經過各種抓包,發現問題了,阿里云內網丟包,rst包丟了,nodejs就如Runnerchin所說,因為timer off就不再變化了
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/112619.html
標籤:網絡通信
上一篇:CentOS 7 DNS決議問題
