写出最好的IOCP服务器,关键的几个问题。

hugeplan 2014-07-16 02:31:21
加精
观点1:我觉得Windows服务器上的IOCP能比Linux更能发挥出服务器的CPU效率
观点2:Windows云服务器的份额也在未来会对Linux有压倒性的胜利

以下我对IOCP实现的见解,大胆写出来,希望大神们拍正。

---既然是Windows Server上,就得用MS VC++,别用其它的什么 Boost ASIO,太花哨,其它的IOCP框架库也别用,最后可能不知道自己怎么死的,如果你还在选型用哪个库,我劝你别想了,非得自己调用API写才行。

---既然是Windows Server上,就别用C/C++库函数,直接全部调用Windows API,例如ReadFile,AllocHeap()...

---使用效率最高的技法,只用C,别用Template,甚至别用C++那些高级特性,例如实现ClientContext链表时……

---ClientContext使用双向链表,不要用锁锁定整个链表,而是头用一个【锁】,尾用一个 【锁】,每个节点一个【锁】,用以提高多线程操作ClientContext链表的效率。

---自己实现内存池,避免AllocHeap()太多碎片,与提高使用效率,同时解决了关闭的Context上有未完成的IO问题。

---对一个Client只需要同时Post单个SWASend和SWAReceive,如果你用多个,我不会认为你的选择不好,而是认为你错了!

---注意每一个效率(时间)细节,注意测量每一个API函数的返回时间。

---注意对每一个API的错误处理,对所有的异常有处理。

---注意好每一个内存用量,根据自己的需求,设置小一点的,SWABuffer大小,根据自己的需求,设置小一点的,Socket Snd/Rcv Buffer。

---对服务器的监控和Log,要在RAM中缓冲后,由Monitor线程批量写入文件系统,以避免在Worker线程中写文件时,靠成ms级阻塞,而造成客户端处理延时。

---注意用Monitor线程,又不发数据的Client,以确保不占用过多的Accept IO。

---其实没有必要要ListenSocket上增补AcceptEx IO,这是我的选择,我选择的是一开始就多投几个就可以了,快一点踢掉不发数据的连接即可。

---应用处理,由 【应用线程】+【IOCP事件】中完成,要合理地分配【应用线程】与【IO Worker线程】的工作能力。

---尽量地在【RAM】中设计应用层数据结构,不要直接去访问【数据库】、【文件系统】等,数据库使用连接池。


先写这么多
...全文
15638 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
kwer 2015-11-03
  • 打赏
  • 举报
回复
#21楼:做服务器最怕锁了, 我觉得 -------- 还有不管什么鸟池,IO处理不过来也都是白搭,搞不好鸟池混乱了程序就崩溃了。
jhxuehao 2015-09-28
  • 打赏
  • 举报
回复
是容易跑飞,后来操作IO BUFFER时,就用了全局的数组,这个简单,快。用NEW,GlobalAlloc之类,老是容易出问题。VLD检测不出来。连接量没有所谓,我试过,200万都没有问题。你可以使用短连接,也可以将SOCKET HANDLE保持。真正内存和CPU占用不高,关键是,有一个致命问题,就是一个IO反应时间,如果太快,快到1ms以内,那很容易操作系统挂掉,出现DPC或者KERNEL错误。原因就是一般网卡的流控呀,IO处理能力跟不上。主要是连接量大时,这是一个很难处理的问题。有人说过,抢票峰值,一天可以高达276亿PV,一般的系统,直接就挂掉了,对这Windows挑战实在是大。就目前水平,一台8核,可以在10小时内,冲上1.6-2亿,是没有问题的。真要处理海量数据,那大机构,真要想想,20亿,甚至100亿的级的连接。刷票,肯定1S内,都启用上千线程,冲击量,比银行数据中心大太多了,不是那么容易的事。只要接入了,后面NOSQL处理,用分布式,就简单了。有想过F5所谓的超高端设备,可能要200万RMB一台,也只能支持到8000万并发,这就不如自己设计一台服务器了。在网络层,是有必要,优化TCP/IP协议和操作系统内核,F5收购的软件公司,肯定在这方面,有研发专门的一个操作系统。不然,无法处理这么高要求的请求量。我的想法是,怎么在IOCP上,将接入时间,控制在更低的粒度上,诸如600us以内,那容量,肯定提升10倍。不过,稍有其它EVENT操作,程序容易挂掉。有时,用进程查看器,查看详细数据时,就突然异常退出了。
羽毛乱发 2014-09-13
  • 打赏
  • 举报
回复
引用 5 楼 shenyi0106 的回复:
3. ClientContext用什么锁其实倒是次要的,主要的要提供多种快速查找的手段(比如根据名称,IP和端口,句柄和特定关键字等来查找)。所以我个人觉得用变形的MAP可能比用纯链表要好一点。
ClientContext锁 lock send ClientContext unlock ClientContext锁 lock rec ClientContext unlock 全局锁 lock close 全局锁 unlock 全局锁 lock accpet 全局锁 unlock 总感觉 accept ,close 的时候 ,和send,rec 不能有效配合,要出现内存泄露! 大神支招!
羽毛乱发 2014-09-13
  • 打赏
  • 举报
回复
引用 5 楼 shenyi0106 的回复:
3. ClientContext用什么锁其实倒是次要的,主要的要提供多种快速查找的手段(比如根据名称,IP和端口,句柄和特定关键字等来查找)。所以我个人觉得用变形的MAP可能比用纯链表要好一点。
我现在也在用map,请问你是怎么处理 send、receive、close之间的关系的,对同一个SOCKET对象而言,如果其中任何两种情况发生,请问如何处理最高效?? 如果搭配全局锁和ClientContext锁合理使用?
孟如庭 2014-09-11
  • 打赏
  • 举报
回复
---使用效率最高的技法,只用C,别用Template,甚至别用C++那些高级特性,例如实现ClientContext链表时…… ---ClientContext使用双向链表,不要用锁锁定整个链表,而是头用一个【锁】,尾用一个 【锁】,每个节点一个【锁】,用以提高多线程操作ClientContext链表的效率。 这段楼主的意思是,c实现一个双向链表存储客户表?每个节点加一个锁,意思是说,每个节点都有对应的一个锁,在操作某个节点的时候,使用对应节点的锁?我理解的对吗?
wushuang443 2014-09-05
  • 打赏
  • 举报
回复
楼主的见解领教了。谢谢。非常感谢分享这个主题。
DrSmart 2014-08-26
  • 打赏
  • 举报
回复
引用 76 楼 skyworth98 的回复:
[quote=引用 34 楼 DrSmart 的回复:] [quote=引用 32 楼 skyworth98 的回复:] [quote=引用 17 楼 DrSmart 的回复:] [quote=引用 14 楼 shenyi0106 的回复:] [quote=引用 13 楼 DrSmart 的回复:] 楼主不了解linux epoll吧,主流的分布式技术,windows完败
这句话不是很客观,为什么主流的分布式要用linux,因为它开源,一整套(如apache,nginx等)都开源。 为什么不用windows,因为它不开源,一套服务器操作系统就要不少钱了,在买几个配套软件,可想而知。 如果你有足够的money,windows平台下,也可以搭建一套很不错的分布式系统。而且管理起来至少比linux要方便。 [/quote] 流量大的网站或游戏服务器没有几个用windows服务器吧,windows服务器管理起来太麻烦了,那补丁打的蛋都碎了,经常重启server这对于目前的nosql类的服务器是灾难性的麻烦[/quote] 你真以为生产服务器是一有补丁就立马打上?知道Patch Window不?另外,别人没有备份服务器,没有负载均衡? 用window一样可以做到服务0中断,当然代价可能比linux大。但是维护的成本只怕比linux要低得多。[/quote] 遇到0day时你还等patch吗,很多漏洞windows都没有补丁的,不开源很危险的。你见过google或apple的server跑windows server吗,它们真的不差钱。windows这种全靠微软的系统,很危险啊,微软管不过来时你就是肉鸡啊。[/quote] 大部分公司不是google,它们没那个实力或者没那么多时间自己搞。 另外,linux或者bsd之类的都是开源的,代码您看了几行? OpenSSL也是开源的,为什么heartbleeding 漏洞藏了这么久?为什么闭源系统比如Windows上反而没有出现类似严重的问题? 开源的优势又在哪里? 重点在于,用什么系统,付出的代价跟获得的收益是不是对称,而不是软件是否开源。 [/quote] OpenSSL的漏洞很好利用吗,Windows服务器上的软件数量太少了,根本无法满足需求。就靠微软一家你就慢慢等吧
Kaile 2014-08-21
  • 打赏
  • 举报
回复
赵老师的 例子不错。
hz张三 2014-08-19
  • 打赏
  • 举报
回复
留名。。学习
skyworth98 2014-08-04
  • 打赏
  • 举报
回复
引用 34 楼 DrSmart 的回复:
[quote=引用 32 楼 skyworth98 的回复:] [quote=引用 17 楼 DrSmart 的回复:] [quote=引用 14 楼 shenyi0106 的回复:] [quote=引用 13 楼 DrSmart 的回复:] 楼主不了解linux epoll吧,主流的分布式技术,windows完败
这句话不是很客观,为什么主流的分布式要用linux,因为它开源,一整套(如apache,nginx等)都开源。 为什么不用windows,因为它不开源,一套服务器操作系统就要不少钱了,在买几个配套软件,可想而知。 如果你有足够的money,windows平台下,也可以搭建一套很不错的分布式系统。而且管理起来至少比linux要方便。 [/quote] 流量大的网站或游戏服务器没有几个用windows服务器吧,windows服务器管理起来太麻烦了,那补丁打的蛋都碎了,经常重启server这对于目前的nosql类的服务器是灾难性的麻烦[/quote] 你真以为生产服务器是一有补丁就立马打上?知道Patch Window不?另外,别人没有备份服务器,没有负载均衡? 用window一样可以做到服务0中断,当然代价可能比linux大。但是维护的成本只怕比linux要低得多。[/quote] 遇到0day时你还等patch吗,很多漏洞windows都没有补丁的,不开源很危险的。你见过google或apple的server跑windows server吗,它们真的不差钱。windows这种全靠微软的系统,很危险啊,微软管不过来时你就是肉鸡啊。[/quote] 大部分公司不是google,它们没那个实力或者没那么多时间自己搞。 另外,linux或者bsd之类的都是开源的,代码您看了几行? OpenSSL也是开源的,为什么heartbleeding 漏洞藏了这么久?为什么闭源系统比如Windows上反而没有出现类似严重的问题? 开源的优势又在哪里? 重点在于,用什么系统,付出的代价跟获得的收益是不是对称,而不是软件是否开源。
dvlinker 2014-07-30
  • 打赏
  • 举报
回复
好帖子必须顶一下!!!
DrSmart 2014-07-28
  • 打赏
  • 举报
回复
这还需要回复吗,linux天生的网络操作系统,高级的东西就懂了,比如tcp这端口数65535就满了,你要用unix socket就不同了,这是本地的文件除了安全还有很多好的特性,很多高可用的方案,windows早就出局了。
nickwu1220 2014-07-26
  • 打赏
  • 举报
回复
没人回复?
nickwu1220 2014-07-24
  • 打赏
  • 举报
回复
有个问题想请教下各位,“包重新排序问题”,就是在缓冲区里添加序列号。到底需不需要这样做?看这本上是这么做的《[Windows网络与通信程序设计》
DrSmart 2014-07-23
  • 打赏
  • 举报
回复
引用 69 楼 chenandczh 的回复:
[quote=引用 68 楼 DrSmart 的回复:] 服务器来说windows就是免费的也没吸引力,为什么nginx、redis跑到windows上残疾了,还是系统不行啊。
其实根源是人类的浮躁。能在LIUNX下完美运行的东西,本质在WINDOWS下也不会有太大问题,因为硬件底层都是一样的。为什么做不好,最根源的是没有利益趋势,做出的东西没有回报,谁愿意花那么大力气去做。 该用什么系统,还是需求说了算。是要求快像吃快餐那样呢,还是要像军工那样严谨地做成碉堡式的产品?[/quote] 明明是系统架构问题,和浮躁不浮躁没关系,不是说什么东西windows都能实现的,linux也一样
krn 2014-07-22
  • 打赏
  • 举报
回复
有几个看过LINUX kernel 代码的,装B。实际上从 WINDOWS SERVER 2008 R2 开始,Windows性能就不错了,不差于LiNUX server ,我倒是觉得 NB 就借鉴 LINUX 自己写操作系统,自己写引导,网络模块等,未必性能就差,针对特定硬件,工作量未必就大。
绿领巾童鞋 2014-07-21
  • 打赏
  • 举报
回复
引用 68 楼 DrSmart 的回复:
服务器来说windows就是免费的也没吸引力,为什么nginx、redis跑到windows上残疾了,还是系统不行啊。
其实根源是人类的浮躁。能在LIUNX下完美运行的东西,本质在WINDOWS下也不会有太大问题,因为硬件底层都是一样的。为什么做不好,最根源的是没有利益趋势,做出的东西没有回报,谁愿意花那么大力气去做。 该用什么系统,还是需求说了算。是要求快像吃快餐那样呢,还是要像军工那样严谨地做成碉堡式的产品?
DrSmart 2014-07-21
  • 打赏
  • 举报
回复
服务器来说windows就是免费的也没吸引力,为什么nginx、redis跑到windows上残疾了,还是系统不行啊。
skyworth98 2014-07-20
  • 打赏
  • 举报
回复
引用 33 楼 DrSmart 的回复:
[quote=引用 31 楼 skyworth98 的回复:] [quote=引用 23 楼 DrSmart 的回复:] [quote=引用 18 楼 shenyi0106 的回复:] 1. 成本 2. 还是成本。 试想,你要开一个小公司,要部署一个服务器,你是花钱买windows server,还是装个red hat? 从成本考虑,假设你选择了red hat,那么你在上面开发程序,跑服务器。 一步一步的,你的公司变大了,你会在花大价钱来废掉之前的代码,在windows上重写一遍么? 所以,继续使用red hat。 不要说什么补丁不补丁的,linux下就没有补丁了? 记得早些年有个内核漏洞,能够获取shell 的root权限,这个也不算小问题吧? linux下更新一个补丁,有时还需要重新编译内核的多了去了,这个不是“蛋碎”的理由 当然,这里并不是说linux不好,或者windows好之类的。 我想表达的是,只选对的,不选贵的。
red hat server版比windows server贵,一般linux系统级漏洞这几年没见过,最多是你装的软件有问题,大多数新的技术都是基于linux,虽然过去我是写过windows内核驱动,但感觉windows这几年已经一年不如一年了,微软能保住桌面用户就可以了。[/quote]
引用 26 楼 DrSmart 的回复:
[quote=引用 24 楼 shenyi0106 的回复:] red hat server版比windows server贵 —— 贵的是技术支持,不是版权;你只装他的系统,不要它技术支持,貌似它不会来找你麻烦。 大多数新的技术都是基于linux —— 是啊,谁叫它开源呢。 windows这几年已经一年不如一年了 —— 这个不好做出评论,但是感觉是MS高层决策失误
没有序列号装不了Red Hat Enterprise Linux吧,有版权的,开源不等于免费啊。你查查,上次买的公司花了6w多,要是包含JBoss之类的,你30万也那不下来吧,windows server最多3w[/quote]
引用 26 楼 DrSmart 的回复:
[quote=引用 24 楼 shenyi0106 的回复:] red hat server版比windows server贵 —— 贵的是技术支持,不是版权;你只装他的系统,不要它技术支持,貌似它不会来找你麻烦。 大多数新的技术都是基于linux —— 是啊,谁叫它开源呢。 windows这几年已经一年不如一年了 —— 这个不好做出评论,但是感觉是MS高层决策失误
没有序列号装不了Red Hat Enterprise Linux吧,有版权的,开源不等于免费啊。你查查,上次买的公司花了6w多,要是包含JBoss之类的,你30万也那不下来吧,windows server最多3w[/quote] https://www.redhat.com/apps/store/server/rhel.html#storeTabWrap http://download.microsoft.com/download/F/3/9/F39124F7-0177-463C-8A08-582463F96C9D/Windows_Server_2012_R2_Licensing_Datasheet.pdf 自己去看价格,然后再跟微软的报价比比,看看哪个贵。 [/quote] 少年,你看下https://www.redhat.com/wapps/store/allProducts.html Red Hat Enterprise Linux for IBM System z Standard Subscription (1 year) $15,000USD Premium Subscription (1 year)$18,000USD 2w刀了快,10几万RMB了吧, 这还不算其他组件。 [/quote] 看不到lic term,看不到是linux的使用授权,还是服务收费。如果是仅仅是单机使用权收费,那么你赢了;如果是服务收费,你大可跟MSDN比比。 另外,能用System Z的,也不在乎那么20K$,而且,我也想不明白用System Z的为什么会用linux,用MVS或者说z/OS岂不是更安全?
skyworth98 2014-07-20
  • 打赏
  • 举报
回复
引用 34 楼 DrSmart 的回复:
[quote=引用 32 楼 skyworth98 的回复:] [quote=引用 17 楼 DrSmart 的回复:] [quote=引用 14 楼 shenyi0106 的回复:] [quote=引用 13 楼 DrSmart 的回复:] 楼主不了解linux epoll吧,主流的分布式技术,windows完败
这句话不是很客观,为什么主流的分布式要用linux,因为它开源,一整套(如apache,nginx等)都开源。 为什么不用windows,因为它不开源,一套服务器操作系统就要不少钱了,在买几个配套软件,可想而知。 如果你有足够的money,windows平台下,也可以搭建一套很不错的分布式系统。而且管理起来至少比linux要方便。 [/quote] 流量大的网站或游戏服务器没有几个用windows服务器吧,windows服务器管理起来太麻烦了,那补丁打的蛋都碎了,经常重启server这对于目前的nosql类的服务器是灾难性的麻烦[/quote] 你真以为生产服务器是一有补丁就立马打上?知道Patch Window不?另外,别人没有备份服务器,没有负载均衡? 用window一样可以做到服务0中断,当然代价可能比linux大。但是维护的成本只怕比linux要低得多。[/quote] 遇到0day时你还等patch吗,很多漏洞windows都没有补丁的,不开源很危险的。你见过google或apple的server跑windows server吗,它们真的不差钱。windows这种全靠微软的系统,很危险啊,微软管不过来时你就是肉鸡啊。[/quote] 呵呵,真的吗?你知道google有多少台服务器吗?前不久的新闻,google差不多有1M+台服务器,如果用M$的Windows Server,就算每台服务器2个lic,需要多少,你算过了吗?最少也要1 Billion$了吧。 还有,不要拿开源说事儿。linux是开源了,但是作为用户,你有多少精力去看那些代码?说了老实话,那上千万行代码,你看了几行?你买了RH的lic,出问题了,应该是有服务的。但是那些免费用户出问题了,服务在哪里?技术功底强大的公司,比如google,自然没问题,全部自己搞定,话说google连服务器也是自己制造的。换个技术不那么好的公司,行吗?说白了,选lin还是选win不是那个好,而是用户愿意出多少钱……一个权衡的问题
加载更多回复(64)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧