Socket上Accept连接的速率及影响因素

网络编程时大家一致比较关注连接上的数据传输速率,但很少有人关心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

你可能感兴趣的:(linux,windows,socket,网络,server,测试)