http://blog.ci123.com/wobushizhanghua/entry/246311

先后查看了haproxyl7swlighttpd的 相关源码,无一例外,他们一致认为多路复用是性能最好的服务器架构。事实也确实应该如此,进程的出现一方面就是为了保存任务的执行上下文从而简化应用程序 设计,如果程序的逻辑结构不是很复杂,那么用整个进程控制块来保存执行上下文未免有些大材小用,加上进程调度和其他的一些额外开销,程序设计上的高效很可 能会被执行时的低效所抵消。代价也是有的:程序设计工作将更加具有挑战性。

体系结构选定之后,我们就要考虑更加细节的部分,比如说用什么操作系统,用操作系统提供的那些API。在这方面,前辈们已经做过很多,我们只需要简单的“拿来”即可,如果再去枉费唇舌,简直就是浪费时间,图财害命。High-Performance Server Architecture从根本上分析了导致服务器低效的罪魁祸首:数据拷贝、(用户和内核)上下文切换、内存申请(管理)和锁竞争;The C10K Problem列举并分析了UNIX、Linux甚至是部分Windows为提高服务器性能而设计的一些系统调用接口,这篇文档的难能可贵之处还在于它一致保持更新;Benchmarking BSD and Linux更是通过实测数据用图表的形式把BSD和Linux的相关系统调用的性能直观地陈列在我们眼前,结果还是令人激动的:Linux 2.6的相关系统调用的时间复杂度竟然是O(1)。

简单的总结如下:

  1. 操作系统采用Linux 2.6.x内核,不仅因为它的高性能,更因为它大开源(这并不是说其他的UNIX或者是BSD衍生物不开源)给程序设计带来的便利,我们甚至可以把服务做到内核空间。
  2. 多路复用采用epoll的“电平触发”(Level Triggered)模式,必要时可以采用“边缘触发”(Edge Triggered),但要注意防止数据停滞。
  3. 为避免数据拷贝可以采用sendfile系统调用发送小文件,或者是文件的小部分,注意避免sendfile因磁盘IO而导致的阻塞。
  4. 如果服务操作设计大量磁盘IO操作,应选用Linux内核提供的异步IO机制,其对应的用户空间库为libaio,注意:这里提到异步IO库并非目前glibc中附带的异步IO实现。
  5. 如果同时有多个数据需要传输,采用writev/readv来减少系统调用所带来的上下文切换开销,如果数据要写到网络套接字文件描述符,这也能在一定程度上防止网络上出现比较小帧,为此,还可以有选择地开启TCP_CORK选项。
  6. 实现自己的内存管理,比如说缓存数据,复用常用数据结构等。
  7. 用多线程替代多进程,线程库当然选择nptl。
  8. 避免进程/线程间非必要的同步,保持互斥区的短小。

上面这些琐碎的细节在ESR看来可能都是过早优化,他 可能又会建议我们等待硬件的升级。哈哈,提醒还是不无道理的,算法的设计部分,我们更要下大力气,因地制宜地降低算法的时间复杂度。为什么不提空间复杂度 呢?内存的价格还是相对低廉吧,不过还是不要忘记现在的计算机瓶颈多在内存的访问。

有一点需要提醒一下,目前SMP系统和多核心CPU比 较常见,如果还是仅采用单进程(线程)的多路复用模型,那么同一时间将只有一个CPU为这个进程(线程)服务,并不能充分发挥CPU的计算能力,所以需要 至少CPU(CPU核心)数目个进程(线程)来分担系统负担。有一个变通的解决方案:不用修改源码,在服务器上运行两个服务程序的实例,当然这个时候服务 端口应该是不同的,然后在其前端放置负载均衡器将流量和连接平均分配到两个服务端口,可以简单的通过DNAT来实现负载均衡。其实,这个时候我们已经把多 CPU或者是多核系统看成了多个系统组成的集群。

为了提高服务器的性能,单纯的依靠提高单个服务器的处理能力似乎不能奏效,况且配置越高 的服务器花销也就越高,为此人们经常采用服务器集群的方式,通过把计算尽可能地分配到相对比较廉价的机器上单独完成,籍此来提升服务器的整体性能,事实证 明,这种体系结构不仅是切实可行的,而且还能提高服务器的可用性,容错能力也较强。在网络服务器方面,Linux内核中的由国人章文嵩先生设计的IP层负载均衡解决方案LVS比较有名,还有就是工作于应用层的haproxy和刚刚起步的l7sw。

build high performance server 转载的更多相关文章

  1. wamp不能使用phpmyadmin,提示“You don't have permission to access /phpmyadmin/ on this server.” 转载

    换了win8之后wamp明显不怎么好用了,显示80端口被system占用,后是masql出现了403错误,多番百度谷歌找到了解决方案,这里与大家分享 当你安装完成wamp后,打开localhost或i ...

  2. Build Simple HTTP server

    1. The server just support POST&PUT method 2. It is a Python server, and save upload files in sp ...

  3. eclipse中java项目的build path详解(转载)

    BuildPath中只支持加入jar文件,具体方法如下:在eclips里在工程名上右键->build path->contigure bud path->java build pat ...

  4. 比较IBM MQSeries和BEA WebLogic JMS Server(转载)

    在面向消息的中间件(MOM)这个领域,IBM MQSeries (又称WebSphere MQ)一直是当仁不让的超级大哥,其它还有一些小兄弟,比如SwiftMQ.SonicMQ之类.但近年来随着J2E ...

  5. build模式入门,build模式理解(转载)

    问:为何要用? 普通做法: 1.创建pojo public class Person { private String name; private int age; private double he ...

  6. Build a ZenTao Server on Linux

    Download xampp for linux on Apache Friends, file name: xampp-linux-1.8.3-2-installer.run; Intallatio ...

  7. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path(Myeclipse添加Server Library)

    网上找练习的项目导入到myeclipse项目发现每个JSP 出现错误The superclass "javax.servlet.http.HttpServlet" was not ...

  8. B0BO TFS 安装指南(转载)

    TFS2008安装过几次,每次都遇到点麻烦,结合网上的一些经验总结一下: Windows SharePoint Services 安装 Windows SharePoint Services你有两个选 ...

  9. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path。问题

    JSP页面顶端出现“红色”的报错信息:The superclass "javax.servlet.http.HttpServlet" was not found on the Ja ...

随机推荐

  1. 八一八cvs vss svn和git比较

    特征 CVS Git Mercurial Subversion 是否原子提交 CVS: 没有. CVS提交不是原子的 Git: 是的. 提交都是原子的 Mercurial: 是的 Subversion ...

  2. 网易的Spark技术实践

    http://www.infoq.com/cn/news/2014/04/netease-spark-practice?utm_source=infoq&utm_medium=popular_ ...

  3. js获取对象值的方式

    js获取对象值的方式 var obj = {abc:"ss",nn:90}; var v1 = obj.abc;//使用点的方式 var v2 = obj["abc&qu ...

  4. SpringBoot添加对Mybatis的支持

    1.修改maven配置文件pom.xml,添加对mybatis的支持: <dependency> <groupId>org.mybatis.spring.boot</gr ...

  5. message sent to deallocated instance

    在XCode的以前版本中,如果遇到了 [代码]c#/cpp/oc代码: 1 message sent to deallocated instance 0x6d564f0 我们可以使用info mall ...

  6. ZH奶酪:PHP 执行时间Fatal error: Maximum execution time of...

    来源:http://stackoverflow.com/questions/5164930/fatal-error-maximum-execution-time-of-30-seconds-excee ...

  7. http-server使用

    https://segmentfault.com/q/1010000003926981

  8. webbrowser载入地图网页出现脚本错误解决

    对于这个问题.我整整花了一上午的时间来解决,网上关于此问题的解决差点儿找不到,于是我就尽能够能的从网上相关问题的答案中获取些灵感.功夫不负有心人.最终通过这些灵感的积累我最终攻克了此问题. 首先让我们 ...

  9. Win7安装golang开发环境--备忘录

    首次接触golang,非常多东西不熟悉,Git也没有安装. 1 安装golang 1.1 下载golang 我是在Golang中国的下载频道下载的golang1.6.链接例如以下: http://ww ...

  10. sudo 和环境变量

    https://askubuntu.com/questions/57915/environment-variables-when-run-with-sudo https://www.phusionpa ...