先后查看了
haproxy
,
l7sw
和
lighttpd
的相关源码,无一例外,
他们一致认为多路复用是性能最好的服务器架构
。
事实也确实应该如此,进程的出现一方面就是为了保存任务的执行上下文从而简化应用程序设计,如果程序的逻辑结构不是很复杂,那么用整个进程控制块来保存执
行上下文未免有些大材小用,加上进程调度和其他的一些额外开销,程序设计上的高效很可能会被执行时的低效所抵消。代价也是有的:程序设计工作将更加具有挑
战性。
体系结构选定之后,我们就要考虑更加细节的部分,比如说用什么操作系统,用操作系统提供的那些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。
分享到:
相关推荐
高性能服务器架构设计和调优
探讨linux下高性能软件服务器的开发技术
高性能服务器的架构、选型、集群等
高性能服务器程序设计
高性能服务器底层网络通信模块的设计方法,内容是关于通信模块设计
一种高性能网络游戏服务器架构设计,对于游戏服务器设计的简单介绍。
高性能Linux网络服务器设计与实现(毕业论文).caj
主要讲解了目前高性能服务器的高并发和大流量应对的服务端开发注意事项。
很早之前开始收集整理的网站架构及高性能并发服务器设计的一些好的案例及实际优化经验。 实际优化经验: 初创网站与开源软件 6 谈谈大型高负载网站服务器的优化心得! 8 Lighttpd+Squid+Apache搭建高效率...
Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。 Nginx是一款轻量级的Web服务器/反向代理服务器以及电子邮件代理服务器,并在一个BSD-like协议下发行。由俄罗斯的程序设计师lgor ...
《Linux高性能服务器编程》是Linux服务器编程领域的经典著作,资深Linux软件开发工程师撰写,从网络协议、服务器编程核心要素、原理机制、工具框架等多角度全面阐述编写高性能Linux服务器应用的方法、技巧和思想,...
一种高性能可靠服务器的设计与实现(毕业论文)
基于Linux构建Hadoop高性能服务器集群.pdf
高性能海上船舶定位服务器设计与实现,岳超,潘维民,目前海上船舶定位的主流解决方案是AIS定位。AIS 全称船舶自动识别系统,是安装在船舶上的一种导航设备,这种设备可以在海事VHF 频段�
Linux下高性能网络服务器的设计.pdf
基于Linux系统的构建高性能服务器的研究(毕业论文).caj
最近有项目要做一个高性能网络服务器,决定下功夫搞定完成端口(IOCP),最终花了一个星期终于把它弄清楚了,并用C++写了一个版本,效率很不错。 但,从项目的总体需求来考虑,最终决定上.net平台,因此又花了一天...
第6章 epoll实现高性能服务器 第7章 libevent实现高性能网络服务器 第8章 TCP/IP详解 第9章 UDP/RTP/RTCP 详解 第10章 WebRTC协议 第11章 SDP协议与WebRTC媒体协商【需花大力气牢牢掌握】 第12章 各流媒体服务器的...