IOCP 性能问题,真的会越用越慢?
测试硬件:
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 是什么鬼, 更加大
不知道是否有解决过种问题的大神, 希望赐教一下。