問題1:connection reset by peer
首先禽额,看一下TCP握手簡單描繪過程:
2020-07-25 14-03-46 的屏幕截圖.png
其握手過程原理实辑,就不必說了剪撬,有很多詳細文章進行敘述悠反,本文只關注研究重點斋否。
在第三次握手過程中如叼,如果服務器收到ACK笼恰,就會與客戶端建立連接社证,此時內(nèi)核會把連接從半連接隊列移除追葡,然后創(chuàng)建新的連接宜肉,并將其添加到全連接隊列谬返,等待進程調(diào)用遣铝。
如果服務器繁忙瘫絮,來不及調(diào)用連接導致全連接隊列溢出麦萤,服務器就會放棄當前握手連接频鉴,發(fā)送RST給客戶端垛孔,即connection reset by peer周荐。
設置服務器的tcp_abort_on_overflow=0概作,可以在服務器的全連接隊列有空位時,接受到客戶端的重試ACK讯榕,任然會觸發(fā)服務端連接成功匙睹。
問題2:Socket/File : too many open files
在linux平臺上,客戶端在進行高并發(fā)TCP連接處理時痕檬,最高并發(fā)數(shù)量都要受系統(tǒng)對用戶單一進程同時打開文件數(shù)量的限制(這是因為系統(tǒng)每個TCP都是SOCKET句柄,每個soker句柄都是一個文件)丘跌,當打開連接超過限制,就會出現(xiàn)too many open files闭树。
使用下指令查看最大句柄數(shù)量:
ulimit -a
增加句柄解決方案
vim /etc/security/limits.conf
#在最后加入
* soft nofile 4096
* hard nofile 4096