----------------------------------------------------------------
原贴内容:
----------------------------------------------------------------
原贴内容:
to IFoo(我不是色盲,但我的世界却是黑白的):
iocp的通讯操作和线程管理都是由windows内核来完成的,减少了上下文切换的消耗,这是它最特殊的地方。有很多资料都说iocp只适用于几百上千的连接,但msdn并没有这么说,我的实际经验也表明并非如此。对于网络通讯,实际上只要是单位时间内发生的通讯io次数够多,iocp就适用。我试过在20个连接的情况下比较iocp和WSAAsyncSelect模型的效率,仍然差一倍:在普通pc上频繁收发小数据,iocp能达到每秒收发数据各27000次,而消息模型则一万都不到。另外要说一下,对于大块数据传输,瓶颈是在网络或网卡上,iocp对此没什么帮助。对于小数据的频繁通讯,瓶颈通常在cpu上,用iocp很好。
以上我在msdn里没看到,算是抛砖引玉吧。提问:您好!看到您的评书很困惑,我最近也写了一个IOCP服务,但是与 您说说的每秒27000各读写的速度相差10万8000里啊,我是按照标准的服务器模型来的:接收线程+处理线程+发送线程,但是速度感觉不是很快,基本上1秒大概处理60个左右请求已经很不错了。我的测试环境在P4 2.0G * 2 CPU + 4G内存回复:请确认一下,在你处理请求的时候,没有界面处理,没有文件读写,没有数据库操作,没有线程互锁。这些都会极大的降低效率。提问:的确线程之间存在互锁,因为个线程之间使用可以回收的内存节点,他们都从一个池中开辟,用完后要返回池中,所以之间肯定必须要有锁。现在还未加入数据库的操作在里面,服务器收到1个请求后,就是简单的返回一个回应包。昨天经过调整,性能已经比较大的提高,50个连接,每个连接100个请求,服务器超不多用了27秒左右,比原来80秒有了很大的提高。 我开辟的完成断口读线程为4个,事务处理线程为6个,发送回应线程为4个,服务器硬件环境同上次一样。请问大侠有什么建议没有?

解决方案 »

  1.   

    补充一下,这个50个连接是我用一个测试程序模拟生成50个线程来完成的,我想考虑的Context Switch对性能的影响,实际可能要比27秒的数据要块一些。可尽管如此离很多人每秒动则几千上万的请求处理数我还是很不解,他们真的有这么快吗??接收线程+处理线程+发送线程之间有没有什么好的比例关系设置,这对系统的性能影响是否有? 另外我把send与recv的缓冲区都通过setsockopt设置为0 。
      

  2.   

    我可以肯定地说,在100M的带宽下,to IFoo(我不是色盲,但我的世界却是黑白的)的测试数据是非常可信的,而且他的数据还有点保守,实际可以达到更高。至于基本上1秒大概处理60个左右请求,这是自己程序写得有问题。
      

  3.   

    IOCP也是我一直困惑不敢用的模型!
      

  4.   

    IOCP的测试方式不同可能导致不同测试结果. 比如测试程序采取异步的读写肯定要比同步读写的测试速度快,处理请求的复杂程度不同也可以导致测试结果不同,如果数据流中还涉及到加解密/数据库的话,性能也要大打折扣. 根据这几天的测试我发现对IOCP SERVER性能影响最大的就是线程之间的同步锁,这个鬼东西让IOCP的性能急剧下降,性能居然与线程数成反比,所以在设计架构的时候首先应该考虑的是尽量避免线程间互锁,万一互锁是必须的,就要考虑如何减少一个锁竞争的线程数,可以通过添加层来解决. 经过这次调试,我的服务器从最初的50连接,每连接执行100请求共5000请求 花费80多秒,到 27秒 到现在的几秒. 而且我试验过,从50连接到500连接,各连接执行100请求,所花费的时间并没有增加,所以我估计在1000连接下,应该每秒执行的请求要至少大于1000以上. 说名一下:我的请求测试方式是同步的,即发出一个请求后等到处理结果为止,之间并不是异步的,这是因为我当前开发的系统的特殊性所决定的.(所以没有发挥IOCP的所有威力),我想如果是使用异步请求机制,测试的数据可能还要高出很多
      

  5.   

    IOCP的测试方式不同可能导致不同测试结果. 比如测试程序采取异步的读写肯定要比同步读写的测试速度快,处理请求的复杂程度不同也可以导致测试结果不同,如果数据流中还涉及到加解密/数据库的话,性能也要大打折扣.-----------------------------------------------------------------------1:测试程序采用异步还是同步与服务器端没有关系,测试程序采用同步读写肯定要慢一些,但是这时候瓶颈不在服务器端,你只要多开一些测试程序多开一些连接同样可以测试出来和异步读写一样的效果。
    2:处理请求的复杂程序这个和服务器程序的CPU以及内存有关,于IOCP本身没有关系。如果你处理请求的过程很复杂,涉及到加密/数据库操作,这时用少量的客户端连接肯定测试不出来IOCP的效率,解决办法和上面是一样的,开大量的连接。
    在测试环境理想的情况下,我写的那个IOCP程序除了受限于带宽以外,几乎别的对他没什么印象,一直可以稳定在 160-170M BPS/S上。之所以像你说的那样性能打折扣,那是因为你的CPU要对数据进行长时间的处理,处理的时候,IOCP是空闲的,在等你处理完,写IOCP程序就是要尽可能地不让IOCP闲下来。测试环境:服务器位于深圳网通的机房,100M专线。
    测试客户机分别位于青岛铁桶,北京网通,福建国通(记得不是很清楚了),广州电信,上海(这个是什么的记不得了)。
    服务器配置:P4 XEON 超线程 2.8G,双CPU, 1G内存。 RAID硬盘。
      

  6.   

    有点意思,有点关于I/OCP 的代码就更好了
      

  7.   

    呵呵,俺昨天用完成端口做了一个小应用,测试结果惊人!!服务端配置:(PC)赛扬2G、128M、40G测试设置:每次Socket IO使用同步锁将Socket IO数据写入本地硬盘;每次IO数据量在200字节左右。
    测试结果:40000“次”/秒!!!——(4万次/秒)真是惊人!!
    如果不使用同步锁,数据会更惊人。
    效率真的很高。
    这说明的是“IOCP效率高”!!!我把IO的数据量加大,亦即加大客户端每次发送“包”的数据量,加大到72000字节,同样使用同步锁,1610“包”/168秒,因为包数据量大,所以每个包对应上百的Socket IO次数,“程序”效率仍很高。这样的效率,应付大多数的应用应该足够了。希望版主精华之,发扬之!
    BTW:
        希望有XDJM加入其他Socket IO模型的测试结果,如果有规范的约束就更好了;
        哪里有官方的测试数据,请告诉兄弟们!
      

  8.   

    我在另外一个帖子里说过:
    在带宽确定的前提下,不考虑CPU和内存因素(毕竟现在多加一个CPU多加512M内存不是什么大问题)每次IO数据的大小与IO次数成反比。