网络编程时大家一致比较关注连接上的数据传输速率,但很少有人关心Server端通过Accept接收连接的速率及其影响因素,但后者在设计大型通讯服务器的容量以及Fail-Over策略时需要被认真考虑。
本篇将对最简单情形下基于Socket通信的这一基本能力进行一个基准测试,因为网络架构原因而在端到端通信中引入中间结点的情形(如Proxy),以及在TCP协议之上引入额外握手协议的情形(如SSL及应用级握手协议),将必然使这一能力有所下降,具体下降多少,则需根据实际情况进行类似测试。
本测试的基本条件是Client尽可能快的连接Server,Server尽可能快的Accept连接请求。
先给出测试结论如下:
Linux下连接接收速率最大可达17000/s左右(Client和Server在同一台机器的情形),实用最大接收速率在3000/s左右(Client和Server在不同Linux机器上),且Server CPU和Memory对该值影响不大,但当Client位于Windows上时,该值只有1000/s左右(可能受单个Windows Client的能力限制)。
socket函数listen的backlog参数对Linux Server的连接接收速率通常无明显影响,但有一个奇怪的例外,当Client端每次连接成功都向屏幕上打印一条信息,且与Server在同一台机器上时,该参数对连接接收速率影响很大,且较小的backlog会引起连接请求被“脉冲”式接收,即每接收一批连接请求会暂停三秒,然后接收下一批。目前尚不知该如何解释这样古怪的行为模式。
Client和Server都在Windows下时,最大接收速率约1000/s左右(和上面Server在Linux上,而Client在Windows上的结果很接近),而当Client在Linux上时该值则可达3800/s左右。可见,Windows Client的能力限制了Windows Server的表现。可见在最大连接接收速率上Windows Server的表现并不比Linux差,反而最好。
socket函数listen的backlog参数对Windows Server的影响则又和Linux Server不同,小的backlog会导致Client端连接请求大量失败(上述最大值都是在backlog=128时取得的),无论在Linux下还是在Windows下,更大的backlog意义都不大。
附:
测试方法:
Server端Listen指定端口并同步循环Accept,成功接收第一个连接时开始计时,至接收到指定数量的连接时结束计时,计算平均接收速率。
Client端循环同步Conneect。Client端提供两种选项,一种是connect每成功一次,就通过printf向屏幕打印一条信息。接收速率只计算Server端。
测试环境:
Linux Box1:
CPU:Intel(R) Pentium(R) D CPU 3.00GHz
Memory:1GB
OS:2.6.9-42.ELsmp #1 SMP
Linux Box2:
CPU:Intel(R) Xeon(R) CPU 5110 @ 1.60GHz
Memory:8GB
OS:2.6.9-42.ELsmp #1 SMP
WindowsXP Box:
CPU:Celeron(R) CPU 2.66GHz
Memory:1GB
OS WindowsXP Profession 2002,SP2
Case1--Server和Client都在Linux Box1上,Server侦听127.0.0.1,client显示连接信息。
backlog 平均连接速率(/s) 备注
1 2.165 Total:100条连接,每接收5条连接左右会停顿3秒左右
8 4.504 Total:100条连接,每接收13条左右停顿3秒
32 26.737 Total:1000,收若干条停顿3秒
64 164.231 Total:1000,收若干条停顿3秒
128 978.857-6071.645 Total:10000,有停顿,波动较大
256 774.174-2261.932 Total:10000,有停顿,波动较大
Case2--Client不显示连接信息,其它同Case1
backlog 平均连接速率(/s) 备注
1-256 16666.667 接收速率与backlog无关
Case3--侦听本机IP,其它同Case1
backlog 平均连接速率(/s)
1 1.629
8 4.761
32 323.102
64 6535.948
128 2379.253
256 2359.047
case4--侦听本机IP,其它同Case2
backlog 平均连接速率(/s) 备注
1-256 16666.667 接收速率与backlog无关
case5--Server在Linux Box1,Client从Linux Box2连过来, Client显示连接信息
backlog 平均连接速率(/s)
1 2439.024
8 2272.727
32 2380.952
64 2439.024
128 2564.103
256 2380.952
case6--Client不显示连接信息,其它同Case 5
backlog 平均连接速率(/s)
1 2564.103
8 2380.952
32 2564.103
64 2631.579
128 3030.303
256 2702.703
Case7--Server在LinuxBox2,Client在LinuxBox1,其它同Case 6
backlog 平均连接速率(/s)
1 2777.778
8 2777.778
32 3030.303
64 2702.703
128 3030.303
256 3225.806
Case8--Server在LinuxBox1,Client在WindowsXP,Client显示连接信息
backlog 平均连接速率(/s)
1 694.444
8 680.272
32 689.655
128 694.444
Case 9--Client不显示连接信息,其它同Case8
backlog 平均连接速率(/s)
1 1086.957
8 1063.830
32 1063.830
128 1063.830
Case 10--Server在WindowsXP,Client都在WindowsXP,Client显示连接信息
backlog 平均连接速率(/s)
1 85.397
8 714.286
32 641.026
128 641.026
Case 11--Client不显示连接信息,其它同Case 10
backlog 平均连接速率(/s)
1 909.091
8 1063.83
32 917.432
128 1063.83
Case 12--Server在WindowsXP,Client在Linux Box1,Client不显示连接信息
backlog 平均连接速率(/s) 备注
1 - 基本无法连接成功
8 9.051 连接失败率非常高
32 49.261 有一定的连接失败率
64 97.276 有一定的连接失败率
128 3846.154
256 3846.154