博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.NET平台下几种SOCKET模型的简要性能供参考(转)
阅读量:5998 次
发布时间:2019-06-20

本文共 1240 字,大约阅读时间需要 4 分钟。

这个内容在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能实现多少最大连接,没有资料可以查,如果有朋友知道,可以讨论一下。另外上面提到的许多数据,是从一些资料上摘抄下来的,我没有自己试过,仅仅是拿出来和大家讨论一下。我想,一个高性能的服务端程序,可能需要的技术不仅仅是采用什么模型,还有许多细节需要注意,比如内存的处理,采用什么算法等等,当然,这仅仅是软件成本上的,硬件上肯定也是需要投入的。

转载自:

你可能感兴趣的文章
基于Swiper 2.7.6实现的带缩略图功能的轮播图
查看>>
SAP Netweaver的负载均衡消息服务器 vs CloudFoundry的App Router
查看>>
在张学友演唱会的6万观众中,AI锁定了一名逃犯
查看>>
马斯克重提跨美自动驾驶演示项目,计划未来3至6个月内完成
查看>>
Ubuntu 16.04配置JDK
查看>>
区块链项目 | ArcBlock CEO 冒志鸿:所谓区块链3.0的真正所指
查看>>
hadoop-env.sh配置
查看>>
Oracle 表空间与数据文件
查看>>
RestTemplate发送请求并携带header信息
查看>>
不该建索引及不走索引的原因
查看>>
easyui datagrid扩展功能:筛选
查看>>
Missing Indexes in SQL Server 2005
查看>>
前端工程化概述
查看>>
奇淫怪巧之在Delphi中调用不申明函数
查看>>
人工智能,科技大咖眼中的未来趋势
查看>>
Fresco的使用及注意事项
查看>>
Trap mouse events outside of my application
查看>>
关于刷Sylvain/burst_ind分支的一些问题解答
查看>>
VMware vSphere Client无法连接ESXi虚拟主机解决的方法
查看>>
ctime、mtime、atime
查看>>