接到一個項(xiàng)目需求,其中需要調(diào)用到供應(yīng)商的Http? API,因?yàn)橛写罅康臏y試資源,所以代碼中會循環(huán)調(diào)用API。
然而在測試代碼執(zhí)行過程中,過程中偶爾報錯:
?此時看到報錯,懷疑是可能是同時并發(fā)的問題,
但實(shí)際上并未對該接口進(jìn)行限制,所以應(yīng)該不是這個的問題,?進(jìn)一步查看其他的報錯的信息
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x0C9C64F0>: Failed to establish a new connection: [WinError 10048] 通常每個套接字地址(協(xié)議/網(wǎng)絡(luò)地址/端口)只允許使用一次。
此錯誤原因指示是:一個通訊端口只能用一次
通過以下命令查看?TCP連接狀態(tài)
ping host地址
netstat -ano |? findstr IP
發(fā)現(xiàn)大量請TCP連接處于TIME_WAIT狀態(tài)。
從上面TCP連接來看,?本地IP和服務(wù)端IP、服務(wù)端?端口都是固定不變的,而本地的端口是變化的。本地端口使用范圍是? 49152 -- ?65535,總共16383個
從代碼來看,因?yàn)槭茄h(huán)調(diào)用API,請求較多,導(dǎo)致大量請求處于TIME_WAIT狀態(tài),沒有被釋放,導(dǎo)致端口不夠用。
那TIME_WAIT狀態(tài)到底代表什么意思呢?
來看TCP三次握手四次揮手的過程
?
?客戶端在收到服務(wù)發(fā)送的FIN+ACK數(shù)據(jù)段后,向服務(wù)端發(fā)送一個ACK=1,?seq=m+1, ack=+1數(shù)據(jù)段,之后就進(jìn)入到TIME_WAIT狀態(tài)時,此時TCP連接還沒有完全釋放,必須等待2MSL時間(一個MSL為2分鐘),也就是4分鐘之后才會進(jìn)入到close狀態(tài),?以避免服務(wù)端沒收到最后一個ACK報文。(Maximum Segment Lifetime英文的縮寫,中文可以譯為“報文最大生存時間”)
了解了以上原因,那總結(jié)下來原因是:
1、連接請求量過大
2、TIME_WAIT時間太長(4分鐘),導(dǎo)致端口不能及時被釋放
3、端口占用過多,導(dǎo)致本機(jī)端口數(shù)量不夠
然而在結(jié)束執(zhí)行程序(即結(jié)束全部的TCP連接)后,?再次進(jìn)行代碼執(zhí)行時,發(fā)現(xiàn)請求次數(shù)還是有時沒達(dá)10個就報錯,可能是本機(jī)端口數(shù)量不夠
所以最終解決方案:
1、減少TIME_WAIT時間, 修改TcpTimedWaitDelay
使用 regedit 命令訪問 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters 注冊表子鍵并創(chuàng)建名為 TcpTimedWaitDelay 的新 REG_DWORD 值。 將此值設(shè)置為十進(jìn)制 30,其為十六進(jìn)制 0x0000001e。該值將等待時間設(shè)置為 30 秒。 停止并重新啟動系統(tǒng)。 缺省值:0xF0,它將等待時間設(shè)置為 240 秒(4 分鐘)。 建議值:最小值為 0x1E,它將等待時間設(shè)置為 30 秒。
2、增加本機(jī)端口數(shù)量,修改MaxUserPort
MaxUserPort是一臺主機(jī)向外連接使用端口數(shù)量的限制,這個數(shù)配置的,可能默認(rèn)值才5000
使用 regedit 命令訪問 HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/TCPIP/Parameters 注冊表子鍵并創(chuàng)建名為 MaxUserPort 的新 REG_DWORD 值。 重啟系統(tǒng)。 該值的范圍是從5000到65534,缺省值為5000,建議將該值設(shè)置為65534。
?文章來源:http://www.zghlxwxcb.cn/news/detail-409508.html
關(guān)于MaxUserPort參考: socket跟TCP/IP 的關(guān)系,單臺服務(wù)器上的并發(fā)TCP連接數(shù)問題 - smile_lg - 博客園文章來源地址http://www.zghlxwxcb.cn/news/detail-409508.html
到了這里,關(guān)于python request大批量發(fā)送請求調(diào)用接口時,報錯:[WinError 10048] 通常每個套接字地址(協(xié)議/網(wǎng)絡(luò)地址/端口)只允許使用一次。的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!