目的:让服务器支持大量并发访问。
注意:以下内容 ASP/ASP.NET IIS 用不成。另外要精通Linux,TCP/IP。
摘要:本文主要介绍利用单台PC服务器来实现可支持百万级用户并发访问的WEB服务器的实践工作。意在提出一些手段来发掘设备的潜力,充分利用设备资源,以求达到降低硬件投入成本和维护成本的目的。
随着硬件技术的飞速发展,当前单台PC 服务器的性能得到了显著提升,反之,硬件成本却在快速下降。另一方面,多数门户网站、大型社区在建设WEB服务、邮件服务等网络服务时,仍然倾向于通过简单地扩充并行服务器数量、存储子系统来支持用户请求,而没有考虑深入挖掘服务器本身的性能潜力!即使单台硬件成本足够的低廉,数量巨大的基础硬件及其维护费用对任何企业而言仍然是一项沉重的负担!
如果能够在满足大量用户请求的同时,通过尽量提升服务器的整体性能,从而减少服务器的保有量,也同时减少了设备维护费用,企业是不是可以得到更大的收益呢?答案是肯定的!
就笔者看来,对于需要支持百万级用户并发访问的WEB 服务而言,确实没有必要采用多台服务器,单单一台普通的PC服务器就可以胜任! 个人认为当前许多WEB业务应用都是对硬件投资的极大浪费!为什么这样说呢?
第一,当前PC服务器多数带多个独立的CPU,而且每个CPU还带多个硬核,而许多WEB应用服务器、数据库服务器软件根本就没有对多核处理器进行支持和优化,基本上是一个CPU在工作,其它都在休息,没能充分发挥多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。(ASP/ASP.NET , IIS 用不成)
第二,提高系统网络IO性能。虽然Linux操作系统本身的网络处理能力相对Windows系统表现更好,但要做到千兆级别的网络吞吐还是力不从心。这一点可以通过Smartbits工具得到验证。要支持百万级的用户请求,首先要考虑提高服务器的网络吞吐能力!我们做过实验,通过精简内核协议栈的方法是无法达到要求的,原因很简单,网络接收包和发送包的过程都必须经历多次内核与用户空间的拷贝,这严重占用CPU的处理时间。因此,我们设计采用“零拷贝”技术,利用DMA机制和内存映射技术,实现网络报文在内核空间与用户空间之间的快速传递,这个过程彻底解放了CPU,使得数据收发与业务处理可以并行进行。
第三,建立用户空间TCP/IP协议栈,建立具有多级快速搜索能力的连接追踪池,以满足百万级用户并发访问的要求。这是性能得以提升的关键所在。如果采用原始的 Linux操作系统,单单打开百万个文件描述符就是个耗时的操作!我们设计仅实现1~7层中必要的协议处理过程,去除原内核中冗余的协议处理过程,实行 “精兵简政”策略。整个协议处理过程采用CPU亲和等手段实现多CPU、多核并行处理,提高多CPU的利用率。
第四,修改WEB应用服务器软件。设计采用开源的Apache服务器,在其基础上增加了对“零拷贝”网络IO的支持、用户请求的多CPU并行处理支持、静态页面临时文件系统存储、内存数据库支持等技术,充分利用“时间局部性原理和空间局部性原理”,显著提升WEB服务器软件的性能。
第五,提升服务器自身安全性。采用用户态协议栈后,我们实现了对网络报文的全面控制,自己解包自己打包,并加入对各种DDos攻击的防御,而且有针对性地对包进行了内容审查,其安全过滤标准远高于单纯的包过滤,完全做到了对业务内容的过滤。这样防火墙设备就显得多余了,毕竟基于应用软件漏洞的入侵才是当前黑客攻击的主要手段!而在这方面,包过滤防火墙基本上无所作为,反倒是一个网络瓶颈!当然,如果防火墙作为负载均衡设备来使用又另当别论。
第六,基于具体的业务应用进行优化。我们对应用系统的优化主要从磁盘IO、数据库访问、业务算法等方面进行。一个精心优化的业务系统,其性能也会得到显著提高。
由于我们采用了上述步骤,我们最终实现了利用一台PC 服务器支持百万WEB用户并行访问的要求。综合来看,我们设计的思路主要是尽量提升系统潜能,通过采取多核并发、网络吞吐优化、业务系统优化等手段,多管齐下来提升系统的整体性能,以求做到用好设备、用精设备的理念,最终达到在满足用户需求的前提下,减少设备投入,节约成本的目的。