----------------------------------------------------------------
原贴内容:
----------------------------------------------------------------
原贴内容:
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个,服务器硬件环境同上次一样。请问大侠有什么建议没有?
原贴内容:
----------------------------------------------------------------
原贴内容:
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个,服务器硬件环境同上次一样。请问大侠有什么建议没有?
2:处理请求的复杂程序这个和服务器程序的CPU以及内存有关,于IOCP本身没有关系。如果你处理请求的过程很复杂,涉及到加密/数据库操作,这时用少量的客户端连接肯定测试不出来IOCP的效率,解决办法和上面是一样的,开大量的连接。
在测试环境理想的情况下,我写的那个IOCP程序除了受限于带宽以外,几乎别的对他没什么印象,一直可以稳定在 160-170M BPS/S上。之所以像你说的那样性能打折扣,那是因为你的CPU要对数据进行长时间的处理,处理的时候,IOCP是空闲的,在等你处理完,写IOCP程序就是要尽可能地不让IOCP闲下来。测试环境:服务器位于深圳网通的机房,100M专线。
测试客户机分别位于青岛铁桶,北京网通,福建国通(记得不是很清楚了),广州电信,上海(这个是什么的记不得了)。
服务器配置:P4 XEON 超线程 2.8G,双CPU, 1G内存。 RAID硬盘。
测试结果:40000“次”/秒!!!——(4万次/秒)真是惊人!!
如果不使用同步锁,数据会更惊人。
效率真的很高。
这说明的是“IOCP效率高”!!!我把IO的数据量加大,亦即加大客户端每次发送“包”的数据量,加大到72000字节,同样使用同步锁,1610“包”/168秒,因为包数据量大,所以每个包对应上百的Socket IO次数,“程序”效率仍很高。这样的效率,应付大多数的应用应该足够了。希望版主精华之,发扬之!
BTW:
希望有XDJM加入其他Socket IO模型的测试结果,如果有规范的约束就更好了;
哪里有官方的测试数据,请告诉兄弟们!
在带宽确定的前提下,不考虑CPU和内存因素(毕竟现在多加一个CPU多加512M内存不是什么大问题)每次IO数据的大小与IO次数成反比。