平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

ICOP的一些结论 -- 仅是我的实践结论

对同一个连接连续调用多次WSASend是安全的,不需要等到前一个WSASend的操作完成,数据将按调用WSASend的调用顺序发送(当然,前提是没有人笨到用多线程对一个同一个连接连续调用多次WSASend).

但对同一个连接连续调用多次WSASend是一种不稳定的方案,因为可能出现WSAENOBUFS错误(实现总是如此丑陋),对于服务器而言,可能出现就是必然爆发. 由于没有机制可以量化多少个WSASend之后才会出现该错误,所以只能等出现了错误,再做错误处理,这样的逻辑很危险.

实践证明,多个WSASend不会提高发送速率,但会提高CPU占用率和WSAENOBUFS出现的几率,因为每个WSASend都要有一个完成处理流程,得不断地查问那么多的WSASend完成了没有,并作出处理.

对一个连接保持同时只有一个WSASend在运作,发送速率不会慢. 因为服务器不是服务于一个socket,而是服务于上千个socket,不要把IOCP下单个socket的得失看得太重.

一个连接保持同时只有一个WSASend是没错的,当然,也不要像我一样笨到每次WSASend只发送十几个字节数据,然后去责怪单次WSASend的低能,要知道WSASend接收的是一个缓冲区数组. 可以但不能浪费,不要走极端.

当SO_SNDBUF不为0, WSASend的数据被拷贝到底层缓冲区(AFD.sys)等待发送,出现WSAENOBUFS表示缓冲区不足.
当SO_SNDBUF为0, WSASend的数据被内核直接锁定,不可交换页面,这种资源是稀缺的,出现WSAENOBUFS表示物理页面数不足.

线程是个好东西,但越少越好.IOCP已经开了CPU*2个线程.

理论很完美,实现却要面对丑陋的现实.以上结论仅供参考.

posted on 2007-11-28 18:48 linghuye 阅读(2457) 评论(3)  编辑 收藏 引用 所属分类: 编程札记

评论

# re: ICOP的一些结论 -- 仅是我的实践结论  回复  更多评论   

多CPU多工作线程同tcp socket多WSARecv如何保证顺序?
2008-02-14 10:40 | Felix Kwo

# re: ICOP的一些结论 -- 仅是我的实践结论  回复  更多评论   

当然,前提是没有人笨到用多线程对一个同一个连接连续调用多次WSASend
=================================================
这种是笨人么?是牛人!!!
2008-03-16 07:31 | Feiler

# re: ICOP的一些结论 -- 仅是我的实践结论[未登录]  回复  更多评论   

我同意不要对同一个socket投递多个wsarecv,因为iocp是服务多个socket(几千)的,不是为几个socket,所以你对同一个socket投递多个没什么意义
2010-01-04 11:49 | justin
只有注册用户登录后才能发表评论。