谈自己对如何构造网络引擎粗浅的看法
2009-12-09 14:19
246 查看
首先说明,对于网络引擎的编写,我自己现在还是属于入门级阶段,所以下面的观点只是我自己的心得体会.
首先来谈下我对网络引擎的认识过程.相信很多人刚开始的时候都跟我一样,看了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直接写上层逻辑,但是这样的话,严密的考虑就是非常必要的了.而且开发时间和耗费都被脚本开发需要的时间长.
就说这么多了,最近准备自己做一个,哈哈
首先来谈下我对网络引擎的认识过程.相信很多人刚开始的时候都跟我一样,看了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直接写上层逻辑,但是这样的话,严密的考虑就是非常必要的了.而且开发时间和耗费都被脚本开发需要的时间长.
就说这么多了,最近准备自己做一个,哈哈
相关文章推荐
- 如何保护自己的无线网络
- 做网络的出路何在(网络这块,如何规划自己的职业生涯)
- 关于如何提取代码成为函数,自己浅薄的一些看法
- 如何封装自己的网络框架 -进阶封装 (RxJava+okHttp+Retrofit)
- Keras如何构造简单的CNN网络
- 关于如何提取代码成为函数,自己浅薄的一些看法
- 网络时代如何保护自己的隐私
- 如何在网络上宣传自己的产品?
- Image扩展,如何将网络图片显示在自己的程序中
- 网络管理员如何解放自己
- 如何建立自己的光纤网络来连接数据中心
- 如何用AWS(亚马逊云服务器)搭建一个自己的blog (3) – 如何登陆到AWS建立的网络服务器
- 如何用idhttp提交自己构造过的Cookie
- 在网络通讯中,如何自己分配可用的端口号和获取自己的ip地址
- 如何让自己的博客被搜素引擎收录
- 如何从0构造自己的系统?
- Keras如何构造简单的CNN网络
- 大家刚上线的新站如何做好seo站内优化,我谈谈自己的看法!
- 企业如何考虑自己的网络防护设备 推荐