在写任何一个东西的时候都想知道实现后的性能到底怎样,一般情况下可以通过一个简单的计时来确定性能是好是坏。但对于编写网络应用来说确定这东西性能怎样相对比较复杂一些,有的人会用是否能达到某个带宽值或是否支持多少连接来确定这性能好不好。在和很多朋友交流的过程发现他们对这方面的了解存在一些误区,误认为只要把千兆带宽跑满或都支持多少个连接接入就行;其实通这两值来确定一个服务的性能好不好是否可靠呢?下面通过一些测试来看这两个指标值来衡量性能的可靠性。
带宽
对于.NET程序来说跑满千兆带宽可以说是一件容易的事情,也可以说是一件非常困难的事情。
以下是100个连接从服务端获取不同数据块的测试结果。
分别测试了获取不同大小的数据块,可以看到只要把发送的数据块加大把千兆带宽跑满相信是一件非常简单的事情。但如果每次请求获取的数据大小在几个byte或几十个byte,通过.NET程序想把千兆带宽跑满基本是不太可能的事情,不过服务器配置好的话也许是可以的....有兴趣的朋友可以试下。
连接数
连接数这个指标在和一些朋友交谈过程似乎也被神化了,其实在.net的机制中连接数量的多少似乎对整体性能没有多大的影响.通过以下这个测试结果可以看到:
从以上测试情况来看,1000连接和20000连接在处理相同接收和发送量的情况其CPU资源似乎看不到损耗上有多大的差异,这也许是IOCP的强大之处。
总结
从以上两个测试结果来看可以得到的答案是,评测.net编写网络通讯应用效能的一个非常重要的指标是IO处理能力,即对应Socket对象的读和写操作。在测试的过程这两个操作会引起操作系统中断处理,如果这些操作的量很大的情况那中断的损耗也会增长,所以应用允许的情况下裁剪这两个IO操作的次数会对程序效能有着极大的提高(当一段时间内发向某一连接的消息合成一个发送)。
那.NET的IO量处理能力大概多少呢?对于一台装有WIN2008的E3 1230V2的机器,单核大概可以处理量是(10W发送+10W接收)/秒。当然不能通过这个基数来乘上核数,随着并发的提升存在正常的损耗外,对应线程的增加和系统中断也会增加,这些开销增长都是非线性的。