谈自己对如何构造网络引擎粗浅的看法

来源:互联网 发布:qq imap服务器 端口 编辑:程序博客网 时间:2024/06/06 00:58

首先说明,对于网络引擎的编写,我自己现在还是属于入门级阶段,所以下面的观点只是我自己的心得体会.

 

首先来谈下我对网络引擎的认识过程.相信很多人刚开始的时候都跟我一样,看了socket就觉得自己已经大概知道如何进行网络编程了,以为网络很简单,就是简单的收与发.但是在这个阶段,你真的去下手,就会发现,你的想象完全只是一个想象.想编写一个服务器,仅知道socket和基本的一些知识是远远不够的.

 

服务器本身而言,是一个状态自动机,接受到请求,并返回处理结果.是的,说起来就是这么简单.但是一个好的服务器,需要考虑的东西要多的多,比如,如何去支持同时能够处理的连接数量,如何加快处理速度,如何使其结构更加合理,以加快上层的开发等.并且,对于目前而言,服务器系统经常可能是一个服务器组而不是单一的服务器.所以,不可能只是去简单的编写一个状态机.

 

一个网络引擎,首先要考虑的就应该是他的数据收发机制,或者说是要采用什么样的IO模式.我目前而言感觉,比较好的IO模式对于windows而言就是IOCP(完成端口),而对于LINUX而言就是epoll了.IOCP用起来感觉比EPOLL麻烦一些,IOCP需要用到重叠IO,EPOLL用起来更像SELECT.这两种方式的性能差不多,只是平台不同.

 

使用了高效率的IO模式,同一台服务器就可以管理较多的连接了,但是,对数据包如何处理对于服务器的性能也是十分重要的.当数据到达接收缓存后,我们需要把它拆成一个一个有意义的数据包传给程序上层.但是上层如何处理这些数据包,却直接决定着服务器的性能.例如,可以先将数据包缓存在一个队列中,然后在对这个队列中,然后用一个单线程的处理模块去顺序的处理这些数据包.不过这样的话,可想而之,用户数量对服务器的性能的影响非常大,一般到8000左右的连接就到极限了,但是很显然,这样的处理不容易出错,而且控制相对容易.当然,也可以让处理模块是一个多线程的,这样显然可以增多最大连接数,因为可以不被会挂起一定时间的逻辑浪费时间.

 

但是并不是说线程越多越好,线程越多,就会造成越多的上下文切换,这样事实上会影响性能.在理想状态下,应该保证机器有几个CPU就创建几个线程,这样可以进行并行的处理,达到最高的效率,但是如果上层逻辑有阻塞的情况的话,则应适当的多开一些线程,以便在某些线程挂起的时候有别的任务补上,以充分了利用CPU的能力.

 

接下来一个非常重要的问题就是内存管理.

 

为何要使用内存管理,我是这样理解的.使用系统自带的默认内存管理的话,可能回造成过多的换页进而影响了效率,浪费了系统的时间(也就是说用new,delete,calloc,malloc,free这些)

 

不过到底用何种内存管理对性能的提升比较高,这个我还没有仔细研究过~~

 

最后一点就是服务器的容错性问题.作为一个服务器,容错性肯定是非常关键的,不然,一出错就down,那肯定是不行了.如何提供良好的容错性呢.我感觉首选就是借助于脚本语言.我们可以用脚本语言封装低层引擎,例如用python,LUA这类语言.这样即可以提高开发效率,有可能提升服务器的容错性,一举两得.不过使用脚本也是有一些缺点的,肯定会占用一些额外的资源.速度问题等.不过毕竟是得有所取舍的.

 

当然,也可以直接用C++或者C直接写上层逻辑,但是这样的话,严密的考虑就是非常必要的了.而且开发时间和耗费都被脚本开发需要的时间长.

 

就说这么多了,最近准备自己做一个,哈哈