如今,使用LAMP(Linux®、Apache、MySQL和PHP/Perl)架构的应用程序不断被开发和部署。但是,服务器管理员对应用程序本身几乎没有控制能力,因为应用程序是别人编写的。这份共三部分的系列文章将讨论许多服务器配置问题,这些配置会影响应用程序的性能。第一篇文章讨论LAMP架构、一些性能度量技术以及一些基本的Linux内核、硬盘和文件系统调节。后续的文章将研究Apache、MySQL和PHP组件的调优。Linux、Apache、MySQL和PHP(或Perl)是许多Web应用程序的基础——从to-do列表到blog,再到电子商务站点。WordPress和Pligg是两个支持大容量Web站点的常用软件包。这种架构简称为LAMP。几乎每个Linux发布版都包含Apache、MySQL、PHP和Perl,所以安装LAMP软件是非常容易的。安装的简便性使人误以为这些软件会自行顺利地运行,但是实际情况并非如此。最终,应用程序的负载会超出后端服务器自带设置的处理能力,应用程序的性能会降低。LAMP安装需要不断监控、调优和评估。系统调优对于不同的人有不同的含义。本系列主要关注LAMP组件(Linux、Apache、MySQL和PHP)的调优。对应用程序本身进行调优是另一个复杂的问题。应用程序和后端服务器之间存在一种共生关系:未能适当调优的服务器甚至会使最好的应用程序在负载之下崩溃,而借助充分的调优,完全可以避免编写得很糟糕的应用程序使服务器缓慢如牛。幸运的是,正确的系统调优和监视可以指出应用程序中的问题。LAMP架构对任何系统进行调优的第一步都是了解它的工作原理。按照最简单的形式,基于LAMP的应用程序是用PHP这样的脚本语言编写的,它们作为Linux主机上运行的ApacheWeb服务器的一部分运行。PHP应用程序通过请求的URL、所有表单数据和已捕获的任意会话信息从客户机获得信息,从而确定应该执行什么操作。如有必要,服务器会从MySQL数据库(也在Linux上运行)获得信息,将这些信息与一些HypertextMarkupLanguage(HTML)模板组合在一起,并将结果返回给客户机。当用户在应用程序中导航时,这个过程重复进行;当多个用户访问系统时,这个过程会并发进行。但是,数据流不是单向的,因为可以用来自用户的信息更新数据库,包括会话数据、统计数据(包括投票)和用户提交的内容(比如评论或站点更新)。除了动态元素之外,还有静态元素,比如图像、JavaScript代码和层叠样式表(CSS)。在研究LAMP系统中的请求流之后,就来看看可能出现性能瓶颈的地方。数据库提供许多动态信息,所以数据库对查询的响应延迟都会反映在客户机中。Web服务器必须能够快速地执行脚本,还要能够处理多个并发请求。最后,底层操作系统必须处于良好的状态才能支持应用程序。通过网络在不同服务器之间共享文件的其他设置也可能成为瓶颈。LAMP的变体LAMP最初是指Linux、Apache、MySQL和PHP(或Perl)。但是,如果管理员不擅长Linux,那么可以在Microsoft®Windows®上运行Apache、MySQL和PHP,这并非一种少见的情况。同样,也可以将Apache换成别的系统,比如lighttpd,产生的仍然是LAMP风格的系统,但是首字母缩写不再是LAMP了。也可以改用另一种开放源码数据库(比如PostgreSQL或SQLite)、商业数据库(比如IBM®DB2®)或者免费的商业引擎(比如IBMDB2Express-C)。本文主要关注传统的LAMP架构,因为这种架构是最常见的,而且它的组件都是开放源码的。度量性能持续地对性能进行度量在两个方面有帮助。首先,度量可以帮助了解性能趋势,包括好坏两方面的趋势。作为一个简单的方法,查看一下Web服务器上的中央处理单元(CPU)使用率,就可以了解CPU是否负载过重。同样,查看过去使用的总带宽并推断未来的变化,可以帮助判断什么时候需要进行网络升级。这些度量最好与其他度量和观测结合考虑。例如,当用户抱怨应用程序太慢时,可以检查磁盘操作是否达到了最大容量。性能度量的第二个用途是,判断调优是对系统性能有帮助,还是使它更糟糕了。方法是比较修改之前和之后的度量结果。但是,为了进行有效的比较,每次应该只修改一个设置,然后对适当的指标进行比较以判断修改的效果。每次只修改一个设置的原因应该是很明显的:同时做出的两个修改很可能会相互影响。选择用来进行比较的指标比较微妙。选择的指标必须能够反映应用程序用户感觉到的响应。如果一项修改的目标是减少数据库的内存占用量,那么取消各种缓冲区肯定会有帮助,但是这会牺牲查询速度和应用程序性能。所以,应该选择应用程序响应时间这样的指标,这会使调优向着正确的方向发展,而不仅仅是针对数据库内存使用量。可以以许多方式度量应用程序响应时间。最简单的方法可能是使用curl命令,见清单1。清单1.使用cURL度量Web站点的响应时间1.$curl-o/dev/null-s-w%{time_connect}:%{time_starttransfer}:%{time_total}\2.:0.779复制代码清单1给出对一个流行的新闻站点执行curl命令的情况。输出通常是HTML代码,通过-o参数发送到/dev/null。-s参数去掉所有状态信息。-w参数让curl写出表1列出的计时器的状态信息:表1.curl使用的计时器计时器描述time_connect建立到服务器的TCP连接所用的时间time_starttransfer在发出请求之后,Web服务器返回数据的第一个字节所用的时间time_total完成请求所用的时间这些计时器都相对于事务的起始时间,甚至要先于DomainNameService(DNS)查询。因此,在发出请求之后,Web服务器处理请求并开始发回数据所用的时间是0.272-0.081=0.191秒。客户机从服务器下载数据所用的时间是0.779-0.272=0.507秒。通过观察curl数据及其随时间变化的趋势,可以很好地了解站点对用户的响应性。当然,Web站点不仅仅由页面组成。它还有图像、JavaScript代码、CSS和cookie要处理。curl很适合了解单一元素的响应时间,但是有时候需要了解整个页面的装载速度。用于Firefox浏览器的TamperData扩展可以在日志中记录Web浏览器发出的每个请求,并显示每个请求所用的下载时间。使用这个扩展的方法是,选择ToolsTamperData来打开Ongoingrequests窗口。装载要考察的页面,然后就会看到浏览器发出的每个请求的状态和装载每个元素所用的时间。图1给出装载developerWorks主页的结果。图1.用于装载developerWorks主页的请求细目每一行描述一个元素的装载情况。显示的数据包括发出请求的时间、装载所用的时间、大小和结果。Duration栏列出装载元素本身所用的时间,TotalDuration栏列出所有子元素所用的时间。在图1中,装载主要页面所用的时间是516毫秒(ms),但是装载所有东西并显示整个页面所用的时间是5101ms。TamperData扩展有一种有用的模式,将页面装载数据的输出绘制成图形。右击Ongoingrequests窗口上半部分的任何地方,并选择Graphall。图2显示图1中数据的图形化视图。图2.用于装载developerWorks主页的请求的图形化视图在图2中,每个请求的持续时间显示为深蓝色,并相对于页面装载的启始时间显示。所以,可以看出哪些请求使整个页面的装载变慢了。尽管关注的重点是页面装载时间和用户体验,但是也不要忽视核心系统指标,比如磁盘、内存和网络。有许多实用程序可以捕获这些信息;其中最有帮助的可能是sar、vmstat和iostat。基本系统调节在对系统的Apache、PHP和MySQL组件进行调优之前,应该花一些时间确保底层Linux组件的运行正常。还应该对正在运行的服务进行缩减,只运行需要的那些服务。这不但是一种良好的安全实践,而且可以节省内存和CPU时间。一些快速的内核调优措施大多数Linux发布版都定义了适当的缓冲区和其他TransmissionControlProtocol(TCP)参数。可以修改这些参数来分配更多的内存,从而改进网络性能。设置内核参数的方法是通过proc接口,也就是通过读写/proc中的值。幸运的是,sysctl可以读取/etc/sysctl.conf中的值并根据需要填充/proc,这样就能够更轻松地管理这些参数。清单2展示在互联网服务器上应用于Internet服务器的一些比较激进的网络设置。清单2.包含较为激进的网络设置的/etc/sysctl.conf1.#UseTCPsyncookieswhenneeded2.net.ipv4.tcp_syncookies=13.#EnableTCPwindowscaling4.net.ipv4.tcp_window_scaling:=15.#IncreaseTCPmaxbuffersize6.net.core.rmem_max=167772167.net.core.wmem_max=167772168.#IncreaseLinuxautotuningTCPbufferlimits9.net.ipv4.tcp_rmem=4096873801677721610.net.ipv4.tcp_wmem=4096655361677721611.#Increasenumberofportsavailable12.net.ipv4.ip_local_port_range=102465000复制代码将这些设置添加到/etc/sysctl.conf的现有内容中。第一个设置启用TCPSYNcookie。当从客户机发来新的TCP连接时,数据包设置了SYN位,服务器就为这个半开的连接创建一个条目,并用一个SYN-ACK数据包进行响应。在正常操作中,远程客户机用一个ACK数据包进行响应,这会使半开的连接转换为全开的。有一种称为SYN泛滥(SYNflood)的网络攻击,它使ACK数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。SYNcookie特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间(细节参见参考资料一节)。大多数系统都默认启用这个特性,但是确保配置这个特性更可靠。启用TCP窗口伸缩使客户机能够以更高的速度下载数据。TCP允许在未从远程端收到确认的情况下发送多个数据包,默认设置是最多64KB,在与延迟比较大的远程客户机进行通信时这个设置可能不够。窗口伸缩会在头中启用更多的位,从而增加窗口大小。后面四个配置项增加TCP发送和接收缓冲区。这使应用程序可以更快地丢掉它的数据,从而为另一个请求服务。还可以强化远程客户机在服务器繁忙时发送数据的能力。最后一个配置项增加可用的本地端口数量,这样就增加了可以同时服务的最大连接数量。在下一次引导系统时,或者下一次运行sysctl-p/etc/sysctl.conf时,这些设置就会生效。配置磁盘来提高性能磁盘在LAMP架构中扮演着重要的角色。静态文件、模板和代码都来自磁盘,组成数据库的数据表和索引也来自磁盘。对磁盘的许多调优(尤其是对于数据库)集中于避免磁盘访问,因为磁盘访问的延迟相当高。因此,花一些时间对磁盘硬件进行优化是有意义的。首先要做的是,确保在文件系统上禁用atime日志记录特性。atime是最近访问文件的时间,每当访问文件时,底层文件系统必须记录这个时间戳。因为系统管理员很少使用atime,禁用它可以减少磁盘访问时间。禁用这个特性的方法是,在/etc/fstab的第四列中添加noatime选项。清单3给出了一个配置示例。清单3.演示如何启用noatime的fstab示例1./dev/VolGroup00/LogVol00/ext3defaults,noatime112.LABE