TCP客戶端Socket如何立即釋放端口?
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
在做一個(gè)關(guān)于web負(fù)載均衡的壓力測(cè)試的時(shí)候碰到一個(gè)問(wèn)題。
測(cè)試采用的是單機(jī)測(cè)試,web服務(wù)器+3個(gè)負(fù)載均衡節(jié)點(diǎn)服務(wù)+客戶端 都在同一臺(tái)4核工作機(jī)上。 由于測(cè)試邏輯簡(jiǎn)單,1024個(gè)http客戶端4s左右會(huì)吃光6W個(gè)端口,繼續(xù)訪問(wèn)就會(huì)出現(xiàn)錯(cuò)誤:由于系統(tǒng)緩沖區(qū)空間不足或隊(duì)列已滿,不能執(zhí)行套接字上的操作。錯(cuò)誤的原因是Socket占用的端口沒(méi)有被釋放,需要等待20+s才能進(jìn)行下一輪測(cè)試,很浪費(fèi)時(shí)間。 需要說(shuō)明的是,釋放客戶端端口不像服務(wù)器端口那樣關(guān)閉Socket就可以了。客戶端端口在Socket關(guān)閉之后處于Close_Wait狀態(tài),這個(gè)狀態(tài)時(shí)間應(yīng)該是由HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下的TcpTimedWaitDelay鍵值決定的,但是這個(gè)值最小值是30s。 另外可以使用API函數(shù)SetTcpEntry強(qiáng)行關(guān)閉連接釋放端口,但是某些操作系統(tǒng)由于UAC的原因需要提升為管理員權(quán)限,如果通過(guò)app.manifest設(shè)置管理員身份運(yùn)行,會(huì)彈出一個(gè)提升權(quán)限的對(duì)話框,作為一個(gè)性能測(cè)試的Demo彈出這樣一個(gè)框感覺(jué)有點(diǎn)嚇人。 希望高人指點(diǎn),如何在不需要用戶參與的情況下把端口釋放掉。需要具體測(cè)試代碼的話可以到這里下載https://fastcsharp.codeplex.com/,測(cè)試項(xiàng)目為demo.loadBalancingTcpCommandWeb。 該文章在 2017/4/12 1:29:55 編輯過(guò)
|
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |