单台服务器并发百万级配置

  随着硬件技术的飞速发展,当前单台PC 服务器的性能得到了显著提升,反之,硬件成本却在快速下降。另一方面,多数门户网站、大型社区在建设WEB服务、邮件服务等网络服务时,仍然倾向于通过简单地扩充并行服务器数量、存储子系统来支持用户请求,而没有考虑深入挖掘服务器本身的性能潜力!即使单台硬件成本足够的低廉,数量巨大的基础硬件及其维护费用对任何企业而言仍然是一项沉重的负担!

  如果能够在满足大量用户请求的同时,通过尽量提升服务器的整体性能,从而减少服务器的保有量,也同时减少了设备维护费用,企业是不是可以得到更大的收益呢?答案是肯定的!

  就笔者看来,对于需要支持百万级用户并发访问的WEB 服务而言,确实没有必要采用多台服务器,单单一台普通的PC服务器就可以胜任! 个人认为当前许多WEB业务应用都是对硬件投资的极大浪费!为什么这样说呢?第一,当前PC服务器多数带多个独立的CPU,而且每个CPU还带多个硬核,而许多WEB应用服务器、数据库服务器软件根本就没有对多核处理器进行支持和优化,基本上是一个CPU在工作,其它都在休息,没能充分发挥多CPU的能力;第二,虽然服务器安装有高性能网卡,但是所采用的操作系统没有对网络吞吐进行优化,无法支持巨大的网络IO请求,没能发挥出高性能网卡的优势;第三、服务器一般都支持4G或以上更大的内存,而且在x86平台下内存条的价格就像大白菜,非常低廉。即使如此廉价丰富的内存资源也没有得到好好利用,多数应用根本没有考虑基于内存的高速缓存方案,比如业务应用中最常见的数据库访问操作,通常都是直接连接到数据库进行SQL操作,其处理性能上不去是显而易见的了;第四,应用程序本身不够优化。不管存在何种原因,公认的一点是一个不优化的业务应用对系统整体性能表现有很大影响。高深的优化技术我们不谈,就举两个常见的优化处理来说明,例子一,对于系统中保证唯一而且又不经常变化的用户ID,是否可以考虑不采用链表而采用MAP表存储呢?后者比前者查询快多了!;例子二,对于判断一个表中是否存在某条记录,通常使用这样的SQL语句:“select * from xx_table where xx_id=xx”, 试问是否可以改成“select 1 from xx_table where xx_id=xx”?一字之差,在高频度数据查询过程中,后面的语句比前面的快很多呀。第五,一般服务器群前面都有一个或多个防火墙设备,用来进行包过滤和端口映射。如果服务器的自身安全性很强的话,这些防火墙设备也是可以被省略的。

  基于上述理由,笔者及同事设计并实现了一款只需要单台PC 服务器就可以支持百万级用户并发访问的WEB服务器(硬件采用MS-9188主板,带两颗Intel(R) Xeon(R) E5410 CPU,每个CPU含4个核, 8G内存, 320G SATA 硬盘, 板载8个Intel 82571EB 千兆网卡,一款非常普遍的PC服务器)。

  现就我们的工作做一简要介绍:

  第一, 选用64位版本的Linux对称多处理操作系统,以便支持超过4G的内存和多核心CPU。

  第二,提高系统网络IO性能。虽然Linux操作系统本身的网络处理能力相对Windows系统表现更好,但要做到千兆级别的网络吞吐还是力不从心。这一点可以通过Smartbits工具得到验证。要支持百万级的用户请求,首先要考虑提高服务器的网络吞吐能力!我们做过实验,通过精简内核协议栈的方法是无法达到要求的,原因很简单,网络接收包和发送包的过程都必须经历多次内核与用户空间的拷贝,这严重占用CPU的处理时间。因此,我们设计采用“零拷贝”技术,利用DMA机制和内存映射技术,实现网络报文在内核空间与用户空间之间的快速传递,这个过程彻底解放了CPU,使得数据收发与业务处理可以并行进行。

  第三,建立用户空间TCP/IP协议栈,建立具有多级快速搜索能力的连接追踪池,以满足百万级用户并发访问的要求。这是性能得以提升的关键所在。如果采用原始的 Linux操作系统,单单打开百万个文件描述符就是个耗时的操作!我们设计仅实现1~7层中必要的协议处理过程,去除原内核中冗余的协议处理过程,实行 “精兵简政”策略。整个协议处理过程采用CPU亲和等手段实现多CPU、多核并行处理,提高多CPU的利用率。

  第四,修改WEB应用服务器软件。设计采用开源的Apache服务器,在其基础上增加了对“零拷贝”网络IO的支持、用户请求的多CPU并行处理支持、静态页面临时文件系统存储、内存数据库支持等技术,充分利用“时间局部性原理和空间局部性原理”,显著提升WEB服务器软件的性能。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ppxxf.html