IOCP伺服器開發常見問題

2021-07-04 15:48:09 字數 1159 閱讀 8100

iocp的工作執行緒的個數一般設定為processors *2+2,這是綜合考慮了工作執行緒可能是等待/掛起/正在執行的狀態。如果你測試出更好的結果,以你的為標準。

iocp的工作執行緒由系統排程和優化,不要去干預執行緒的排程,除非你自信能超越系統的排程。

在遇到奇怪的問題時,可以嘗試減少iocp工作執行緒數量,來定位問題所在。

應用層在處理收到的資料時,盡快將資料處理掉或是拷貝乙份,避免阻塞iocp工作執行緒。

在投遞i/o時,如果返回wsa_io_pending,意味著投遞操作成功,但是稍後才會處理完成。一般說來,投遞傳送或接收io請求可能是下面三種結果, 以呼叫wsasend為例:

i.如果操作錯誤碼是error_success,系統將程式緩衝區拷貝到核心緩衝區(也就是tcp/ip棧緩衝區)中,然後在網路適當的時候(比如符合nagle演算法的傳送條件),將資料拷貝到網絡卡緩衝區,進行真正的傳送;

ii.如果操作錯誤碼是wsa_io_pending,意味著此時核心緩衝區空間不夠,系統將鎖定程式緩衝區鎖定到非分頁記憶體中,直到核心緩衝區有足夠的空間來將資料拷貝走;

iii.如果操作結果是其他錯誤碼,根據具體原因,可以選擇釋放socket對應的資源。(該條目參考《windows網路程式設計第2版》)

盡量使i/o緩衝區的大小是系統頁面大小的倍數(32位是4k),這樣避免系統在拷貝程式緩衝區在不足一倍數時而占用整個頁面。

盡量投遞大型i/o操作,也就是每次傳送較大的資料報,而不是多次傳送一些小的資料報,且每次傳送資料都固定大小。

使用acceptex非同步接收的連線,如果要獲取本地/對端的位址,有兩種方式:

i.使用擴充套件api:getacceptexsockaddrs,可以同時獲取本地/對端位址,需要i/o結構的支援;

ii.使用標準api:getsockname/getpeername,由於對端socket尚未與監聽socket完全繫結,需要先設定so_update_accept_context 選項,然後才可以正常獲取到。(適用於winxp以後的版本)

在關閉socket時,注意處理未決的io請求,這些請求以失敗的結果(getqueuedcompletionstatus失敗)返回。

常見錯誤碼:

error_netname_deleted(64):對端關閉socket

error_operation_aborted(995):本端socket被關閉,操作取消

伺服器上tomcat mysql 常見問題

有時會遇到系統不能正常訪問,常見的幾個問題羅列一下.以下都是本人遇到的.原因可能有以下幾個方面.1.tomcat高cpu,用 tomcat probe 檢測,可以看到記憶體佔用率很高.這樣的問題大多數是由於 造成的,優先查詢 可以用eclispe的 find bugs外掛程式.2.mysql cpu...

svn伺服器配置常見問題

原因 svn服務沒有啟動 解決方法 svnservice d r opt svn repos opt svn repos是倉庫位址。問題描述 svnserve.conf 19 option expected 原因 svnserve.conf中有空格出現 解決方法 在anon access或者auth...

GIT 伺服器 安裝常見問題的排除

centos git 伺服器,的安裝。1,先裝git,有些廢話。yum install git 即可,版本沒有特別要求的話。2,建立乙個git 使用者名稱 adduser git 3,建立證書登入 收集所有需要登入的使用者的公鑰,就是他們自己的id rsa.pub檔案,把所有公鑰匯入到 home g...