写出最好的IOCP服务器,关键的几个问题。
观点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】中设计应用层数据结构,不要直接去访问【数据库】、【文件系统】等,数据库使用连接池。
先写这么多