測驗硬體:
64位 10 windows, 32 位程式(C/S)
I7 8 核
8G 記憶體
測驗場景:
C 也是同 S 一樣的 IOCP 核心, 共同占用了系統IO佇列, 當然, 是兩個獨立的程式。 只是我想即然都使用 IOCP 核心, 應該都占用系統 的IOCP 佇列
測驗業務:
C 對 S 建立 TCP/IP 長連接, 連接后, 每 10 秒發送一次心跳 , 連接不主動斷線
這是一個壓力測驗, 看看最大性能能達到何處:
先說說服務器狀態:
S 基本不怎么耗 CPU 和 記憶體, 低耗一直在 10% 以下, 記憶體慢慢上升到 100M 左右
根據我的性能統計: S 每秒處理 1500次 IO 業務, 1000~2500的波動
問題:
從開始, 一直到完全沒辦法回應(大約 9000 個鏈接就超時的不要不要的了)
[23:06:01(580)]連接 Socket 建立成功,執行緒ID:735c,SOCKET = 1276
[23:06:01(580)]連接 Socket 建立成功,執行緒ID:2ec8,SOCKET = 1256
[23:06:01(593)]連接服務器成功 192.168.0.101:39999,執行緒ID:735c , 本地連接資訊:192.168.0.101:32896,SOCKET = 1276,耗時:0.65ms
[23:06:01(594)]連接服務器成功 192.168.0.101:39999,執行緒ID:2ec8 , 本地連接資訊:192.168.0.101:32897,SOCKET = 1256,耗時:0.45ms
直到后來, 現在 8000 個連接
[23:56:41(146)]連接服務器成功 192.168.0.101:39999,執行緒ID:2d7c , 本地連接資訊:192.168.0.101:43193,SOCKET = 33380,耗時:16776.38ms
[23:56:41(146)]收接到 [ CHECKIN ] 耗時 22814.94ms
[23:56:41(147)]收接到 [ CHECKIN ] 耗時 22848.86ms
真是天差地別。。。 IOCP 是越用越慢的嗎?
因為現在大級別耗時, 服務器和客戶端的 CPU 都沒超過 5% , 倒是系統自占用一直都是 20%
我理解, 有投遞, 然后投遞被處理, 然后佇列會減少, 我不清楚怎樣去監視或取得 IOCP 的系統所在的佇列, 無法查看,就只能靠猜啊。
在 ProcXP 中, 看到 IO 處理的值如下(8000 個連接時)
S IO READS: 111
S IO WRITE 104,290
S IO OTHRE 1,857,981
C IO READS: 15
C IO WRITE 7,531,489
CIO OTHRE 1,933,050
我的理解是 READS 是 Recv, 為什么服務器才 111? 而 Write 卻這么大, 還有那個 OTHER 是什么鬼, 更加大
不知道是否有解決過種問題的大神, 希望賜教一下。
uj5u.com熱心網友回復:
好吧, 自己寫貼子也是重新的審視, 我知道為什么 S & C 的 IO WRITE 為什么這么高了, 因為是在玩命的寫日志, 不過依然不知道 OTHER 是什么, 有沒有什么辦法可以看 IOCP 佇列的, 我想知道為什么IOCP為什么越來越慢
uj5u.com熱心網友回復:
問題基本上是出在你的代碼上,記憶體申請困難、檔案沒有分塊處理、記憶體沒有及時釋放等等,都可能造成效率問題
uj5u.com熱心網友回復:
基本追蹤得到, 不是我回應慢, 是 IOCP 回應慢。 而程式對回發處理只需要低于 5ms 的回應時間。 但是完成埠堆積過多導致。 有沒有做過 IOCP 并發處理性能測驗的? 我的機器配置, 差不多并客戶端, 服務端占用系統并發處理為 5000次每秒(含少量業務)
uj5u.com熱心網友回復:
修正一下提問, 有沒有什么 API 可以查詢IOCP 佇列資訊的? 以便做出正確的處理。 連接數就不說了, 10W 靜態連接輕輕松松, 但是, 若是帶上業務處理, 那就麻煩了。 IOCP 說實在的, 有很蛋痛的點。 好的機器對不好的服務器, 分分鐘干翻對方。。。
uj5u.com熱心網友回復:
由于服務端程式并沒有滿負荷運行, 怎么就看出來我有 申請困難, 沒有釋放的問題呢? CPU 都沒轉動, 都處于等待中啊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/136574.html
標籤:網絡編程
上一篇:求cef3
下一篇:MFC 值傳遞問題