免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2456 | 回复: 6
打印 上一主题 下一主题

请教一个服务器模型 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-25 20:48 |只看该作者 |倒序浏览
有一个需求是,要同时维持几万个连接,每个连接上行流量较大,下行流量较小(服务器端需要向客户端传送大量的数据)。
不知道这种情况下应该采用哪种服务器模型好呢?

1> Reactor模型,主线程监听所有的fd(包括LISTEN和ESTABLISHED),将可读的fd,放入一个队列中;一堆工作线程,从队列中取出fd,进行处理,主要是发送数据。
2> 也是Reactor模型,主线程只监听LISTEN fd,将accept的fd,分别放入对应工作线程的epoll中(可以采用轮询)。工作线程检测分配给自己的ESTABLISHED fd,如果fd可读,就进行处理,发送数据。
3> 这个时候,有一个问题,发送数据,直接调用send好呢?还是使用一个缓冲区层,由一个专门的send线程,发送所有fd上的数据好呢?为什么?
专门的一个send线程进行发送能否满足大量上行流量的需求?

论坛徽章:
0
2 [报告]
发表于 2009-10-25 21:01 |只看该作者
....一个专门的线程发送数据?
感觉比较难啊。一是错误处理。
              二是 发送数据,对每个fd要均衡才好吧?
             一个线程占用的时间片,是否会少?

论坛徽章:
0
3 [报告]
发表于 2009-10-25 22:00 |只看该作者
现在版本的实现中,发现产生很多CLOSE_WAIT,通过抓包来看,三次握手之后到请求的数据开始传送有30S,说明线程处理能力不够。
同时,netstat查看很多连接的Send_Q存有很多数据,说明发送能力也不足。
实际上,现在是接收能力和发送能力都不足。

论坛徽章:
0
4 [报告]
发表于 2009-10-26 09:35 |只看该作者
,最近也在看unp的并发模型那一章,请问大家,是否有别的书介绍?
介绍下目前是否有新的技术和模型可探讨?

另外有没有通过调整线程数量,进行数据的发送呢? 可以测试下,一个线程的工作能力有多大?
单线程,流量很大的时候,又情况如何?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-10-26 10:53 |只看该作者
我发视频数据,单线程发一G流量,嘛事没有,

如果流量很大,建议你用单独的发送线程,下行的事件处理就在reactor里处理了得了,用异步方式

论坛徽章:
0
6 [报告]
发表于 2009-10-26 22:28 |只看该作者

回复 #5 cookis 的帖子

我发视频数据,单线程发一G流量,嘛事没有,

同时维持多少连接?

如果流量很大,建议你用单独的发送线程,下行的事件处理就在reactor里处理了得了,用异步方式

是不是可以这么设计这个模型:
reactor+buffer io,主线程监听所有的连接,一旦连接可读,将数据读入到recv buffer中,将fd添加到任务队列中;工作线程从任务队列中取出一个fd,处理fd对应的recv buffer中的数据,将需要发送的数据,写入到send buffer中。send线程侦听所有的ESTABLISHED的描述符,一旦可写,就将fd对应的send buffer中的数据写入fd中。

BTW: 1楼中,关于1>和2>的对比,在这种情况下哪个更优一些?

论坛徽章:
0
7 [报告]
发表于 2009-10-27 22:13 |只看该作者

回复 #5 cookis 的帖子

6楼中那个模型,BLOCK和NONBLOCK对程序的网络性能有很大影响吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP