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

解决方案 »

  1.   

    Talk is cheap, show me the code.
      

  2.   

    1. 为windows平台上的IOCP是成品,linux上的epoll是半成品,相对于功力不是那么深厚的coder来说,使用成品比使用半成品要简单,而且稳定,容易出成果。但是功力深厚的coder相对而言都比较喜欢半成品,因其可定制性较强,性能的好坏一定程度上可以取决于自己设计的架构和coder水平。2. 写高质量的服务器,内存管理是必须要自己重定制的,一方面是为了提升速度,另一方面是为了防止出现问题。但是往往IOCP的问题多处在内存管理上(我也是其中之一)。3. ClientContext用什么锁其实倒是次要的,主要的要提供多种快速查找的手段(比如根据名称,IP和端口,句柄和特定关键字等来查找)。所以我个人觉得用变形的MAP可能比用纯链表要好一点。4. 错误处理,这个也比较头疼。针对一个连接可以有很多次的recv和send,那么一旦这个连接关闭,必然会出现很多次的错误,需要特别处理(其实这里也体现了快速查找ClientContext的必要性)。5. 心跳检查确实很有必要,在大规模连接和关闭的处理中,可以节省很多系统资源。6. 架构设计,好的架构可以容忍大规模的突发流量,使其可以平滑整个应用处理流;不好的架构,在遇到突发流量是,可能就会出现丢包或者PPS下降的情况。我也就总结这么多吧,都是些心得,有些是实践中总结出来的结果,有些是期望的结果。
      

  3.   

    错误处理,这个也比较头疼。针对一个连接可以有很多次的recv和send,那么一旦这个连接关闭,必然会出现很多次的错误,需要特别处理(其实这里也体现了快速查找ClientContext的必要性)。这个问题建议使用楼主推荐的每个Socket只投递一个,发送完了再投递接收。
      

  4.   

    IOCP服务器,缓存很重要,好的做法是根据应用场景使用一些固定分配的内存,最好是能做到运行过程中不需要再次分配内存。
      

  5.   


    学习了!!
    只是有一点,不理解:
    搜索,都得要遍历所有的客户端Context,MAP为什么比 双连表快呢? 
      

  6.   


    同意,因为服务器程序不是【商品】,不需要太多顾及太多运行环境,是自己用的,有时侯,简单,稳定,实用最好。
    固定内存还可以发现不必要的BUG,内存泄漏。
    当然,程序一启动,就占用个2GB内存也是不行的,在PC机上都不好调试了,
    我准备分几个阶梯来申请新的内存,即在内存池管理时,超过标尺时,增加一大块新的内存池。
      

  7.   


    多个线程,对一个链表操作,如果要用表其中一个Node时,要把整个链表锁定,这样就会大大增加锁死的可能性,那样IOCP的最大优势【多个Worker线程】,可能会变得和单线程无异。
    大部分高频率发生的对单个Node操作,来自于IOCP完成事件,即WorkerThreads,而我上面说过了,是投放单个IO,每次事件来,直接操作单个Node,即与整个链表无关,也不存在多个任务对Node同起访问的问题。管理链表时,需要遍历整个链表,也不要让它锁定整个链表,也就是不要妨碍到高频的IO事件对Nodes的操作,所以,头一个锁,尾一个锁,然后,你懂了吧。。
      

  8.   

    楼主不了解linux epoll吧,主流的分布式技术,windows完败
      

  9.   


    这句话不是很客观,为什么主流的分布式要用linux,因为它开源,一整套(如apache,nginx等)都开源。
    为什么不用windows,因为它不开源,一套服务器操作系统就要不少钱了,在买几个配套软件,可想而知。如果你有足够的money,windows平台下,也可以搭建一套很不错的分布式系统。而且管理起来至少比linux要方便。
      

  10.   


    epoll没有写过,但有了解,当初也有想过选择Linux,选择可能还是跟多年的MS奴隶经验有关,
    不是说VC王者归来吗,何必王者不当,去Linux那边重新摸索呢您说的【主流的分布式技术】完败Windows,是否能拿出点证据?我认为:
    1. Windows服务器的内核,无疑能更大的发挥出新的服务器硬件的最佳性能,MS是一个商业性的公司,而这新的硬件的支持,需要一个公司来快速跟上。2、Windows用户基础,根深蒂固,管理成本也低很多。3. 网络瓶颈,RAM瓶颈,存储设备瓶颈,
    都可以用扩充,或其它的架构,缓冲等方法来弥补,
    而CPU处理瓶颈是最不好解决的,例如8个CPU核处理10万个SOCKET,就是需要IOCP这种东西,用与CPU个数相仿的线程数量,操作系统切换减少,能发挥出最大的CPU处理性能,接下来,我们要做的事情,就是怎样让这8个线程满负荷地工作了,我自己也写单片机操作系统,我很认同IOCP这种架构。
    在Linux上,我相信有高手能做到,是熟悉Linux脾气与性能的人,但就算做到了,我也会认为,这活儿太难,太没意义了。4. 说到稳定性,没见过服务器OS死的,只有自己的程序死,说到底,还是自己的问题。5. 要说到【钱】上,你租Linux服务器还不得出钱?当然,如果懂得使用Linux这把刀,那更好!!我是不会。
      

  11.   


    这句话不是很客观,为什么主流的分布式要用linux,因为它开源,一整套(如apache,nginx等)都开源。
    为什么不用windows,因为它不开源,一套服务器操作系统就要不少钱了,在买几个配套软件,可想而知。如果你有足够的money,windows平台下,也可以搭建一套很不错的分布式系统。而且管理起来至少比linux要方便。流量大的网站或游戏服务器没有几个用windows服务器吧,windows服务器管理起来太麻烦了,那补丁打的蛋都碎了,经常重启server这对于目前的nosql类的服务器是灾难性的麻烦
      

  12.   

    1. 成本
    2. 还是成本。试想,你要开一个小公司,要部署一个服务器,你是花钱买windows server,还是装个red hat?
    从成本考虑,假设你选择了red hat,那么你在上面开发程序,跑服务器。
    一步一步的,你的公司变大了,你会在花大价钱来废掉之前的代码,在windows上重写一遍么?
    所以,继续使用red hat。不要说什么补丁不补丁的,linux下就没有补丁了?
    记得早些年有个内核漏洞,能够获取shell 的root权限,这个也不算小问题吧?
    linux下更新一个补丁,有时还需要重新编译内核的多了去了,这个不是“蛋碎”的理由当然,这里并不是说linux不好,或者windows好之类的。
    我想表达的是,只选对的,不选贵的。
      

  13.   

    诚然,现在互联网上的确linux服务器多于windows服务器,
    究其原因,可能有以下几个原因:
    1. 成本
    2. 源于传统思想,linux比windows "更"稳定。
    3. windows吃硬件,linux在任何破旧的机器上都能跑。
    4. 跟风+装B。
      

  14.   

    备注:
    我是做基于linux内核的。
    目前我做的产品是基于X86架构的网络防火墙
      

  15.   

    好的吧,我用的boost库,目前来说,很好用,
    都是c++ 模块化设计,到时候真出问题了,出一块换一块,换好为止
    ,--
    我自己之前写的一个iocp,不依赖任何库,就想楼主说的那样,
    c/s一台机器上,s投递5w   wsaaccept,客户端并发连接,基本上cpu20-30%左右,内存占比总的好像,在1g左右(有一个内存管理器,应该是有很大没用的内存被保留了),
    时间隔个把月了,忘记了,
    最后有望达到10w,可是郁闷的是出问题了,2w都打不到了,还死机,哪怕服务器关了,过不了多久还是死机了,我估计资源耗尽了,电脑没有蓝屏,就那样直接死了。这几天做其他服务器,突然发现线程锁的一个问题,回想一下,我擦,10有89,我那个服务器就是被锁死的,而且内存管理也是非常麻烦的,可能我设计的有问题
    --
    做服务器最怕锁了, 我觉得
      

  16.   


    red hat server版比windows server贵,一般linux系统级漏洞这几年没见过,最多是你装的软件有问题,大多数新的技术都是基于linux,虽然过去我是写过windows内核驱动,但感觉windows这几年已经一年不如一年了,微软能保住桌面用户就可以了。
      

  17.   

    red hat server版比windows server贵 —— 贵的是技术支持,不是版权;你只装他的系统,不要它技术支持,貌似它不会来找你麻烦。大多数新的技术都是基于linux —— 是啊,谁叫它开源呢。windows这几年已经一年不如一年了 —— 这个不好做出评论,但是感觉是MS高层决策失误
      

  18.   

    log  monitorx批量写入文件毕竟也可以,但你考虑到如果进程遇外终止时,如果LOG缓冲区如果还数据,不是就丢失了一些LOG了吗,
    还有既然都IOCP了,为什么LOG也不IOCP呢,这样LOG写入也不会阻塞线程.
      

  19.   


    没有序列号装不了Red Hat Enterprise Linux吧,有版权的,开源不等于免费啊。你查查,上次买的公司花了6w多,要是包含JBoss之类的,你30万也那不下来吧,windows server最多3w
      

  20.   


    求楼上各位大神给些学IOCP的资料,入门的,进阶的,都可以,谢了
      

  21.   


    不明白,是怎样实现?请细说下! 
    同楼主,只会Window,Linux玩不转
      

  22.   


    这句话不是很客观,为什么主流的分布式要用linux,因为它开源,一整套(如apache,nginx等)都开源。
    为什么不用windows,因为它不开源,一套服务器操作系统就要不少钱了,在买几个配套软件,可想而知。如果你有足够的money,windows平台下,也可以搭建一套很不错的分布式系统。而且管理起来至少比linux要方便。支持。用linux的多半是出于资金上的考虑,至于性能或者稳定性,个人觉得都是鬼扯,从Win NT起,就已经够稳定了,性能至少桌面系统Win是完胜的,服务器上没有比较,不好说。
      

  23.   


    red hat server版比windows server贵,一般linux系统级漏洞这几年没见过,最多是你装的软件有问题,大多数新的技术都是基于linux,虽然过去我是写过windows内核驱动,但感觉windows这几年已经一年不如一年了,微软能保住桌面用户就可以了。
    没有序列号装不了Red Hat Enterprise Linux吧,有版权的,开源不等于免费啊。你查查,上次买的公司花了6w多,要是包含JBoss之类的,你30万也那不下来吧,windows server最多3w
    没有序列号装不了Red Hat Enterprise Linux吧,有版权的,开源不等于免费啊。你查查,上次买的公司花了6w多,要是包含JBoss之类的,你30万也那不下来吧,windows server最多3w
    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
    自己去看价格,然后再跟微软的报价比比,看看哪个贵。
      

  24.   


    这句话不是很客观,为什么主流的分布式要用linux,因为它开源,一整套(如apache,nginx等)都开源。
    为什么不用windows,因为它不开源,一套服务器操作系统就要不少钱了,在买几个配套软件,可想而知。如果你有足够的money,windows平台下,也可以搭建一套很不错的分布式系统。而且管理起来至少比linux要方便。流量大的网站或游戏服务器没有几个用windows服务器吧,windows服务器管理起来太麻烦了,那补丁打的蛋都碎了,经常重启server这对于目前的nosql类的服务器是灾难性的麻烦你真以为生产服务器是一有补丁就立马打上?知道Patch Window不?另外,别人没有备份服务器,没有负载均衡?
    用window一样可以做到服务0中断,当然代价可能比linux大。但是维护的成本只怕比linux要低得多。
      

  25.   


    red hat server版比windows server贵,一般linux系统级漏洞这几年没见过,最多是你装的软件有问题,大多数新的技术都是基于linux,虽然过去我是写过windows内核驱动,但感觉windows这几年已经一年不如一年了,微软能保住桌面用户就可以了。
    没有序列号装不了Red Hat Enterprise Linux吧,有版权的,开源不等于免费啊。你查查,上次买的公司花了6w多,要是包含JBoss之类的,你30万也那不下来吧,windows server最多3w
    没有序列号装不了Red Hat Enterprise Linux吧,有版权的,开源不等于免费啊。你查查,上次买的公司花了6w多,要是包含JBoss之类的,你30万也那不下来吧,windows server最多3w
    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
    自己去看价格,然后再跟微软的报价比比,看看哪个贵。
    少年,你看下https://www.redhat.com/wapps/store/allProducts.htmlRed Hat Enterprise Linux for IBM System z
    Standard Subscription (1 year) $15,000USD
    Premium Subscription (1 year)$18,000USD2w刀了快,10几万RMB了吧, 这还不算其他组件。 
      

  26.   


    这句话不是很客观,为什么主流的分布式要用linux,因为它开源,一整套(如apache,nginx等)都开源。
    为什么不用windows,因为它不开源,一套服务器操作系统就要不少钱了,在买几个配套软件,可想而知。如果你有足够的money,windows平台下,也可以搭建一套很不错的分布式系统。而且管理起来至少比linux要方便。流量大的网站或游戏服务器没有几个用windows服务器吧,windows服务器管理起来太麻烦了,那补丁打的蛋都碎了,经常重启server这对于目前的nosql类的服务器是灾难性的麻烦你真以为生产服务器是一有补丁就立马打上?知道Patch Window不?另外,别人没有备份服务器,没有负载均衡?
    用window一样可以做到服务0中断,当然代价可能比linux大。但是维护的成本只怕比linux要低得多。遇到0day时你还等patch吗,很多漏洞windows都没有补丁的,不开源很危险的。你见过google或apple的server跑windows server吗,它们真的不差钱。windows这种全靠微软的系统,很危险啊,微软管不过来时你就是肉鸡啊。
      

  27.   


    不明白,是怎样实现?请细说下!不至于writefile 有异步重叠模式都不知道吧,异步写文件是不会阻塞的,且这样就基本不存丢失缓存LOG的问题,在频繁写LOG时会多用一些CPU时间而也,但log数据写入的可靠性要高得多
      

  28.   

    windows server 、 red hat谁贵谁便宜,谁更nb,把口水吐完也没结果。我们这些程序猿都不写代码的时候,它们应该依然会一直存在,也一直都会有人会买。
    大家还是聊聊技术性的东西,看了各位大神的讨论,对ClientContext的部分,觉得自己的工程里可以试着去改改。我是直接用的STL::list<ClientContext*>。这些实际工作的经验和想法,比windows server 、 red hat谁贵谁便宜,谁更nb有含量多了。
      

  29.   

    有个问题想问问各位大神,对于ClientContext、IOContext这些对象,一般的简单做法是用个双向链(freeList)表来管理,就是申请时,判定freeList里是否有,没有就申请,有就直接拿来用,删除时不是直接delete,而是插入freeList链表头。
    好奇各位都是怎么做的?
      

  30.   


    不明白,是怎样实现?请细说下!不至于writefile 有异步重叠模式都不知道吧,异步写文件是不会阻塞的,且这样就基本不存丢失缓存LOG的问题,在频繁写LOG时会多用一些CPU时间而也,但log数据写入的可靠性要高得多你有试验过异步WriteFile崩溃后,还是会写完内容吗?
    异步操作很复杂,需要有一个Overlap实例传入并传出,如果狂写入,怎样开销这些资源?在heap中?完成了再free?那估计一个Log()要花上50ms吧(在我的电脑上)。那还不如同步写入,本身操作系统、磁盘硬件也会有自己的缓冲,但是频度不是自己可以控制的。Log只是一个小小的配角,不想让它去频繁地操作磁盘,当然你说的实时记录,更安全。
    当然,看你的选择了,把Log作为查看网络安全与特殊事件,还是找到进程崩溃Bug的救命稻草。我实现这个环形Buffer,一举三得:
    1、批量写操作,减少磁盘的负担。
    2、让写Log()返回的时间最短。(比调用那个异步WriteFile还要短很多),多个线程写入达到最快速。
    3、在GUI上需要Monitor时,滚动显示达到最快速,这个也是很费时的操作,
    我用的是Edit控件,目前我只知道这个方法,SetWindowText(),不可能把巨长Text刷新,那样会巨慢,而拥有自己的Buffer后,你可以手动刷新,或定时刷新,只需要指定最未端的文本来SetWindowText()显示,来减少CPU资源的耗费,不要小看这个。当然,如果有更好的解决方案Monitor Log,请指点!
      

  31.   


    我是【批量申请】,不足时,增加一批。
    【一次申请一个】Heap会有很多碎片,效率会低很多,而且还会产生一些浪费。大神们继续。
      

  32.   


    94,94!
    STL List,我觉得会比自己定的List慢一些,而且在操作锁的时候比较不合用,还是 指针List,不是实例List。
    用实例List,初始化,新增插入时都会产生一些额外不必要的工作,所以,还是用C语言吧。
      

  33.   


    不明白,是怎样实现?请细说下!不至于writefile 有异步重叠模式都不知道吧,异步写文件是不会阻塞的,且这样就基本不存丢失缓存LOG的问题,在频繁写LOG时会多用一些CPU时间而也,但log数据写入的可靠性要高得多你有试验过异步WriteFile崩溃后,还是会写完内容吗?
    异步操作很复杂,需要有一个Overlap实例传入并传出,如果狂写入,怎样开销这些资源?在heap中?完成了再free?那估计一个Log()要花上50ms吧(在我的电脑上)。那还不如同步写入,本身操作系统、磁盘硬件也会有自己的缓冲,但是频度不是自己可以控制的。Log只是一个小小的配角,不想让它去频繁地操作磁盘,当然你说的实时记录,更安全。
    当然,看你的选择了,把Log作为查看网络安全与特殊事件,还是找到进程崩溃Bug的救命稻草。我实现这个环形Buffer,一举三得:
    1、批量写操作,减少磁盘的负担。
    2、让写Log()返回的时间最短。(比调用那个异步WriteFile还要短很多),多个线程写入达到最快速。
    3、在GUI上需要Monitor时,滚动显示达到最快速,这个也是很费时的操作,
    我用的是Edit控件,目前我只知道这个方法,SetWindowText(),不可能把巨长Text刷新,那样会巨慢,而拥有自己的Buffer后,你可以手动刷新,或定时刷新,只需要指定最未端的文本来SetWindowText()显示,来减少CPU资源的耗费,不要小看这个。当然,如果有更好的解决方案Monitor Log,请指点!

    异步写文件不复杂,比如写LOG,Overlap只是传个指针,也不需要等待完成端口的完成通知,这是关键,只要写入就完事(应该是在ns级别,不可能支ms级别),也就是说不需要把文件句柄和IOCP关联.