IOCP的工做線程的個數通常設置爲processors *2+2,這是綜合考慮了工做線程多是等待/掛起/正在執行的狀態。若是你測試出更好的結果,以你的爲標準。算法
IOCP的工做線程由系統調度和優化,不要去幹預線程的調度,除非你自信能超越系統的調度。編程
在遇到奇怪的問題時,能夠嘗試減小IOCP工做線程數量,來定位問題所在。網絡
應用層在處理收到的數據時,儘快將數據處理掉或是拷貝一份,避免阻塞IOCP工做線程。app
在投遞I/O和收到該I/O完成通知(無論成功失敗)期間,注意保存好Overlapped I/O結構,以避免出現奇怪的內存問題。異步
在投遞I/O時,若是返回WSA_IO_PENDING,意味着投遞操做成功,可是稍後纔會處理完成。通常說來,投遞發送或接收IO請求多是下面三種結果, 以調用WSASend爲例:
I.若是操做錯誤碼是ERROR_SUCCESS,系統將程序緩衝區拷貝到內核緩衝區(也就是TCP/IP棧緩衝區)中,而後在網絡適當的時候(好比符合Nagle算法的發送條件),將數據拷貝到網卡緩衝區,進行真正的發送;
II.若是操做錯誤碼是WSA_IO_PENDING,意味着此時內核緩衝區空間不夠,系統將鎖定程序緩衝區鎖定到非分頁內存中,直到內核緩衝區有足夠的空間來將數據拷貝走;
III.若是操做結果是其餘錯誤碼,根據具體緣由,能夠選擇釋放socket對應的資源。(該條目參考《Windows網絡編程第2版》)socket
儘可能使I/O緩衝區的大小是系統頁面大小的倍數(32位是4k),這樣避免系統在拷貝程序緩衝區在不足一倍數時而佔用整個頁面。測試
儘可能投遞大型I/O操做,也就是每次發送較大的數據包,而不是屢次發送一些小的數據包,且每次發送數據都固定大小。優化
使用AcceptEx異步接收的鏈接,若是要獲取本地/對端的地址,有兩種方式:
I.使用擴展API:GetAcceptExSockaddrs,能夠同時獲取本地/對端地址,須要I/O結構的支持;
II.使用標準API:getsockname/getpeername,因爲對端socket還沒有與監聽socket徹底綁定,須要先設置SO_UPDATE_ACCEPT_CONTEXT 選項,而後才能夠正常獲取到。(適用於winxp之後的版本)spa
在關閉Socket時,注意處理未決的IO請求,這些請求以失敗的結果(GetQueuedCompletionStatus失敗)返回。線程
常見錯誤碼:ERROR_NETNAME_DELETED(64):對端關閉socketERROR_OPERATION_ABORTED(995):本端socket被關閉,操做取消