利用线程池技术和内存池,SOCKET池技术,基本能够处理一千五百个左右的SOCKET链接,但咱们通常使用的机器大约有两M内存,而在不改变线程堆栈的大小状况下,咱们至多能够建立一千七八百个线程,不过也就基本动不了了。咱们测试基本到一千个线程左右,机器就很慢了。
还有在WIN-XP-SP2中,对单进程中的线程的并发作了处理,默认是10个,修改的方法网上多的是。
二、SELECT模型(同步非阻塞)
这个模型在单线程的状况下默认是64个最大SOCKET链接。你能够修改WINSOCK2.h这个文件中的FD_SETSIZE,但不得超过底层WINSOCK的限制(1024),但若是采用多线程的话,能够处理更多,其实际的最大数量,在单线程里建议不超过1000个,至于多线程,应该也要控制线程切换的效率和数据处理的时间。应该几千个没有什么问题。
三、WSAASYNCSELECT模型
这个模型利用的是消息机制,建议不超过1000个。
四、WSAEVENTSELECT模型
这个模型利用的是事件驱动方式,单个线程不超过64个(WSAWaitForMultipleEvents最多等待64个事件),若是多SOCKET并发宜采用线程池技术,应该几千个没什么问题。
五、重叠IO
应该几千个没问题。这个毕竟是下面IOCP的一个技术基础。
六、IOCP完成端口+重叠IO
这个是解决SOCKET通讯的终极武器,惋惜只用在WIN上和2000以上,LINUX上好象有一个相似的EPOLL,并且好象比这个还好用,没具体用过。这个东东解决几万个SOCKET并发应该是很轻松,固然你得编程水平和技术得跟上。
从网上查看说这个东西若是使用的服务器版的操做系统和机器最大可到一百W,太恐怖了吧,那家伙本身在XP上最大达到了五万,但不断出现内存溢出的BUG。他最高到了9W。 算法
顺道把NET下的SOCKET通讯并发搞一下,是从别人的BLOG上摘来的:
.NET平台下几种SOCKET模型的简要性能供参考
这个内容在cnblogs中也讨论过不少次了,这两天大概看了一些资料,看到一些简单的性能指标拿出来和你们讨论一下。
Socket + Threads/ThreadPool
大概性能:小于1500个链接
实现:Accept一个Socket,就交给一个线程去管理,比较笨,但也比较有效,由于是同步方式,控制起来很方便。高级点的,就是交给一个线程池去管理,线程池由系统自动托管,省去了开销线程的时间。通常小型项目,用这个彻底足够,开发也简单。但要注意,若是若干Socket长时间占用线程池中的线程,同时其它链接数又比较多,很容易出现提示说你没有足够的线程供使用。呵呵,让Socket少作点事,少占用时间,换一个快点的CPU是不错的方式。另外,若是有一些比较好的第三方线程池组件,也能够选择使用,好比SmartThreadPool。
Socket + Select
大概性能:大于1500个链接后性能降低
实现:Select是很经常使用的一种模型。是在阻塞功能中轮询一个或多个Socket,将要处理的Socket放到一个IList中,当Select轮询结束后,而后咱们再本身处理这个IList中的Socket。具体的用法能够看一下MSDN。Select的效率并不能说是高的,由于当队列中待处理的Socket比较多的时候,处理最后几个Socket至关于要遍历全部前面的Socket,很是不划算的。
Socket + Asynchronous
大概性能:约7500个客户端链接
实现:BeginXXXX,EndXXXX,再熟悉不过了吧。异步Socket归根到底,仍是用的线程池技术,用线程池来处理异步IO。这就又引出个问题,.NET的线程池又是用的什么实现方式,之前看过有人说,.NET的线程池是用的完成端口来实现的,我不知道这样的说法是否是正确,从查到的资料中也没有办法确认(但愿这点有朋友能够告诉我)。异步Socket对于程序的处理流程来讲比同步复杂了许多,异步回调函数的控制不如同步方式那样直观。但有一点我想应该是要注意的,就是回调函数应该轻装上阵,不该该处理过多的事务,对传递数据的处理,应该交给其它线程进行处理。 编程
IOCP(完成端口)
大概性能:约20000~50000个客户端链接
实现:如今.NET下有一些伪IOCP,你们能够去搜索一下,尚未见过开放出来的用这些伪IOCP来实现的SOCKET例子。我说的20000~50000个客户端链接,是指在C++下开发的状况,这样的状况下,须要用到的基本技术还包括内存池、查询算法等。 服务器
伪IOCP能实现多少最大链接,没有资料能够查,若是有朋友知道,能够讨论一下。另外上面提到的许多数据,是从一些资料上摘抄下来的,我没有本身试过,仅仅是拿出来和你们讨论一下。我想,一个高性能的服务端程序,可能须要的技术不只仅是采用什么模型,还有许多细节须要注意,好比内存的处理,采用什么算法等等,固然,这仅仅是软件成本上的,硬件上确定也是须要投入的。 多线程