请教一个大流量的服务器模型设计

8 views
Skip to first unread message

十七

unread,
Nov 11, 2009, 10:07:48 PM11/11/09
to dev4s...@googlegroups.com
现在有一个服务器模型的需求,要主动监听某个端口,然后由客户端主动连接上来发送一个请求,之后上层分析该请求,向客户端的这个连接发送大量数据。
 
服务器的并发数并不高,能同时处理300左右的连接就可以了,但是每个连接的流量都比较大,峰值每个可能会有4~5Mbyte每秒。
 
之前使用的IOCP模型,但是设计比较简陋,总共开了一个Listen线程,CPU数*2+2个工作线程,使用异步投递,上层调用Send方法将要发送的数据挂在每个套接字上下文的发送链上,然后工作线程处理完一个发送的Buffer后再投递下一个。
 
但是实际使用中,如果套接字的发送链长度不加限制,则内存占用有可能一下涨很高,但是如果加了限制,则上层调用Send太快,很可能超过该长度,之后的数据就丢掉了。
 
请问有没有其他更好的模型适用于这种需求呢?

--
曾梦想仗剑走天涯,看一看世界的繁华.

qiaojie

unread,
Nov 11, 2009, 10:11:36 PM11/11/09
to dev4s...@googlegroups.com
300个连接用同步调用就可以了,一个连接一个线程。


 
2009/11/12 十七 <onlyy...@gmail.com>

阿杜

unread,
Nov 11, 2009, 10:33:36 PM11/11/09
to dev4s...@googlegroups.com
没看太明白,就算用IOCP自己实现一个OnSend回调就好了。

2009/11/12 qiaojie <qia...@gmail.com>

十七

unread,
Nov 11, 2009, 11:36:29 PM11/11/09
to dev4s...@googlegroups.com
那线程会不会太多了呢?
 
刚接触网络编程这方面,还不太熟,呵呵。

2009/11/12 qiaojie <qia...@gmail.com>

十七

unread,
Nov 11, 2009, 11:41:39 PM11/11/09
to dev4s...@googlegroups.com
现在用的就是IOCP实现的Send,客户端调用一次Send方法,我就将需要发送的buffer挂在等待发送的链上,然后当工作线程从IOCP受信后,从发送链上取出一个Buffer,调用WSASend发送之。
 
只是IOCP在处理WSASend的时候,是一个连接只投递一个Send请求,这样就导致了在连接数上来了之后,工作线程处理不过来挂在发送链上的Buffer,如果不对这个链做数量限制,内存就会在短期内涨很高,如果做了限制,则超过数量后,上层的Send方法就会失败。

2009/11/12 阿杜 <leaber...@gmail.com>

SpriteRay

unread,
Nov 12, 2009, 12:24:34 AM11/12/09
to 高性能服务器研发与运营邮件列表
客户端之前的数据交换不是很多, 实时性要求很高, 连接数不是很高的情况下 我建议使用一连接一进程的架构

qiaojie

unread,
Nov 12, 2009, 1:14:01 AM11/12/09
to dev4s...@googlegroups.com
线程多了当然会有overhead,不过300个线程实在算不了什么,1000个线程我都开过。关键是大大简化了编程模型,缩短了开发周期和成本,节省下来的钱可以多买很多服务器。


 
2009/11/12 十七 <onlyy...@gmail.com>

spriteray

unread,
Nov 12, 2009, 1:29:27 AM11/12/09
to 高性能服务器研发与运营邮件列表
尽管线程间切换多了,但上层逻辑实现简单很多的话,效率肯定不会低,
可以想像的,一进程一连接,至少少了很多内存复制。

On 11月12日, 下午12时36分, 十七 <onlyyoul...@gmail.com> wrote:
> 那线程会不会太多了呢?
>
> 刚接触网络编程这方面,还不太熟,呵呵。
>

> 2009/11/12 qiaojie <qiao...@gmail.com>
>
>
>
> > 300个连接用同步调用就可以了,一个连接一个线程。
>
> > 2009/11/12 十七 <onlyyoul...@gmail.com>


>
> >> 现在有一个服务器模型的需求,要主动监听某个端口,然后由客户端主动连接上来发送一个请求,之后上层分析该请求,向客户端的这个连接发送大量数据。
>
> >> 服务器的并发数并不高,能同时处理300左右的连接就可以了,但是每个连接的流量都比较大,峰值每个可能会有4~5Mbyte每秒。
>
> >> 之前使用的IOCP模型,但是设计比较简陋,总共开了一个Listen线程,CPU数*2+2个工作线程,使用异步投递,上层调用Send方法将要发送的数据挂在每个套接字上下文的发送链上,然后工作线程处理完一个发送的Buffer后再投递下一个。
>
> >> 但是实际使用中,如果套接字的发送链长度不加限制,则内存占用有可能一下涨很高,但是如果加了限制,则上层调用Send太快,很可能超过该长度,之后的数据就丢掉了。
>
> >> 请问有没有其他更好的模型适用于这种需求呢?
>
> >> --
> >> 曾梦想仗剑走天涯,看一看世界的繁华.
>

> --
> 曾梦想仗剑走天涯,看一看世界的繁华.

十七

unread,
Nov 12, 2009, 2:07:21 AM11/12/09
to dev4s...@googlegroups.com
有道理。多谢指点了哈,马上去研究一下。

2009/11/12 spriteray <spri...@gmail.com>
Message has been deleted

十七

unread,
Nov 12, 2009, 8:58:14 PM11/12/09
to dev4s...@googlegroups.com
我的上层业务逻辑很简单。
 
首先服务器端监听某个端口,客户端连上来,发送命令,告诉服务器端需要某个数据,服务器端找到数据,然后发送给客户端。发送完毕后,关闭套接字。
 
如果最大的连接数能达到1000的话,那这种一个线程接收数据然后回调上层,上层用N个线程往发送缓冲区填数据,另外一个线程从发送缓冲区取数据发送的模式性能上能胜任吗?

2009/11/12 songlin luo <songl...@gmail.com>
一般而言,一个接收数据的线程,一个是发送数据的线程,业务逻辑处理的线程可以有n个,具体而定。接收数据的线程按照某个规则分发给不同的业务逻辑处理现场即可。发送数据的线程,里面有个数据队列,存放发送失败的数据,每隔一定时间查询下这个队列是否有数据,如果有的话,就立即发送。


Message has been deleted

十七

unread,
Nov 12, 2009, 11:32:23 PM11/12/09
to dev4s...@googlegroups.com
好的,多谢指点了。
 
:)

2009/11/13 songlin luo <songl...@gmail.com>
负载接收数据的线程,参与的运算很少,就是负责将数据分发给不同的逻辑单元处理。同理负责发送的线程。客户端与服务器交互的数据,一秒钟能到多少?服务器与客户端之间的网络带宽如何?还有之间的数据是如何定义的。服务器段发送缓冲区是如何设计的?这些决定了服务器占用的内存了。线程的创建是否基于线程池,缓冲区以及缓冲溢出的处理办法设计,IOCP的设计等等这些决定了性能。还是自己多做测试吧,具体情况具体分析了。


Eric Sheng

unread,
Nov 17, 2009, 5:02:24 AM11/17/09
to dev4s...@googlegroups.com
关注一下新浪的开源项目:
 
一套服务器开发框架

2009/11/13 十七 <onlyy...@gmail.com>

好的,多谢指点了。
 
:)

2009/11/13 songlin luo <songl...@gmail.com>

负载接收数据的线程,参与的运算很少,就是负责将数据分发给不同的逻辑单元处理。同理负责发送的线程。客户端与服务器交互的数据,一秒钟能到多少?服务器与客户端之间的网络带宽如何?还有之间的数据是如何定义的。服务器段发送缓冲区是如何设计的?这些决定了服务器占用的内存了。线程的创建是否基于线程池,缓冲区以及缓冲溢出的处理办法设计,IOCP的设计等等这些决定了性能。还是自己多做测试吧,具体情况具体分析了。





--
==========================================================
QQ:14163398
MSN:webm...@dpspace.com
GTalk:sheng...@gmail.com
Mail:sheng...@gmail.com
==========================================================

Tomt

unread,
Nov 17, 2009, 9:59:37 AM11/17/09
to dev4s...@googlegroups.com
看不明白你的描述,send 是根据可写事件来的,发送链长度又是根据send调用状况做调整。。。

Bo Yang

unread,
Dec 2, 2009, 12:27:01 AM12/2/09
to 高性能服务器研发与运营邮件列表

On 11月12日, 上午11时07分, 十七 <onlyyoul...@gmail.com> wrote:

> 现在有一个服务器模型的需求,要主动监听某个端口,然后由客户端主动连接上来发送一个请求,之后上层分析该请求,向客户端的这个连接发送大量数据。
>
> 服务器的并发数并不高,能同时处理300左右的连接就可以了,但是每个连接的流量都比较大,峰值每个可能会有4~5Mbyte每秒。
>

感觉这么大流量的系统,瓶颈多半在网络带宽吧。你的出口带宽保证够用吗?

十七

unread,
Dec 2, 2009, 1:08:35 AM12/2/09
to dev4s...@googlegroups.com
因为是局域网的服务器,所以带宽是够用的

2009/12/2 Bo Yang <strug...@gmail.com>



--
曾梦想仗剑走天涯,看一看世界的繁华.

njy zlm

unread,
Dec 5, 2009, 9:22:18 PM12/5/09
to dev4s...@googlegroups.com
试试nginx,因为核心和网络层都做好了,只是在上面扩展应用就行。公司做的"安全网关"就是用这个做的扩展,无论是性能还是稳定性等方面都非常好:)

2009/12/2 十七 <onlyy...@gmail.com>:

十七

unread,
Dec 6, 2009, 8:18:15 AM12/6/09
to dev4s...@googlegroups.com
好的,我找来研究研究。
:)

2009/12/6 njy zlm <zlm...@gmail.com>

yuliuxuanke

unread,
Dec 6, 2009, 9:47:51 PM12/6/09
to dev4s...@googlegroups.com
顺道问下有无nginx的实例,发现不好找,谢谢

2009/12/6 十七 <onlyy...@gmail.com>

njy zlm

unread,
Dec 7, 2009, 7:37:33 AM12/7/09
to dev4s...@googlegroups.com
网上有一篇nginx作者的模块开发指南可以看一看,还有你应该是重新扩展应用(跟我的工作一样:)),看这篇http://blog.csdn.net/kenbinzhang,应该对你用用处

2009/12/7 yuliuxuanke <yuliu...@gmail.com>:

Reply all
Reply to author
Forward
0 new messages