LAMP系统性能调优Word格式文档下载.docx
《LAMP系统性能调优Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《LAMP系统性能调优Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
系统调优对于不同的人有不同的含义。
本系列主要关注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.
3.0.081:
0.272:
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浏览器发出的每个请求,并显示每个请求所用的下载时间。
使用这个扩展的方法是,选择Tools>
TamperData来打开Ongoingrequests窗口。
装载要考察的页面,然后就会看到浏览器发出的每个请求的状态和装载每个元素所用的时间。
图1给出装载developerWorks主页的结果。
图1.用于装载developerWorks主页的请求细目
下载(45.27KB)
2008-7-2310:
49
每一行描述一个元素的装载情况。
显示的数据包括发出请求的时间、装载所用的时间、大小和结果。
Duration栏列出装载元素本身所用的时间,TotalDuration栏列出所有子元素所用的时间。
在图1中,装载主要页面所用的时间是516毫秒(ms),但是装载所有东西并显示整个页面所用的时间是5101ms。
TamperData扩展有一种有用的模式,将页面装载数据的输出绘制成图形。
右击Ongoingrequests窗口上半部分的任何地方,并选择Graphall。
图2显示图1中数据的图形化视图。
图2.用于装载developerWorks主页的请求的图形化视图
下载(97.54KB)
在图2中,每个请求的持续时间显示为深蓝色,并相对于页面装载的启始时间显示。
所以,可以看出哪些请求使整个页面的装载变慢了。
尽管关注的重点是页面装载时间和用户体验,但是也不要忽视核心系统指标,比如磁盘、内存和网络。
有许多实用程序可以捕获这些信息;
其中最有帮助的可能是sar、vmstat和iostat。
基本系统调节
在对系统的Apache、PHP和MySQL组件进行调优之前,应该花一些时间确保底层Linux组件的运行正常。
还应该对正在运行的服务进行缩减,只运行需要的那些服务。
这不但是一种良好的安全实践,而且可以节省内存和CPU时间。
一些快速的内核调优措施
大多数Linux发布版都定义了适当的缓冲区和其他TransmissionControlProtocol(TCP)参数。
可以修改这些参数来分配更多的内存,从而改进网络性能。
设置内核参数的方法是通过proc接口,也就是通过读写/proc中的值。
幸运的是,sysctl可以读取/etc/sysctl.conf中的值并根据需要填充/proc,这样就能够更轻松地管理这些参数。
清单2展示在互联网服务器上应用于Internet服务器的一些比较激进的网络设置。
清单2.包含较为激进的网络设置的/etc/sysctl.conf
1.#UseTCPsyncookieswhenneeded
2.net.ipv4.tcp_syncookies=1
3.#EnableTCPwindowscaling
4.net.ipv4.tcp_window_scaling:
=1
5.#IncreaseTCPmaxbuffersize
6.net.core.rmem_max=16777216
7.net.core.wmem_max=16777216
8.#IncreaseLinuxautotuningTCPbufferlimits
9.net.ipv4.tcp_rmem=40968738016777216
10.net.ipv4.tcp_wmem=40966553616777216
11.#Increasenumberofportsavailable
12.net.ipv4.ip_local_port_range=102465000
将这些设置添加到/etc/sysctl.conf的现有内容中。
第一个设置启用TCPSYNcookie。
当从客户机发来新的TCP连接时,数据包设置了SYN位,服务器就为这个半开的连接创建一个条目,并用一个SYN-ACK数据包进行响应。
在正常操作中,远程客户机用一个ACK数据包进行响应,这会使半开的连接转换为全开的。
有一种称为SYN泛滥(SYNflood)的网络攻击,它使ACK数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。
SYNcookie特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间(细节参见参考资料一节)。
大多数系统都默认启用这个特性,但是确保配置这个特性更可靠。
启用TCP窗口伸缩使客户机能够以更高的速度下载数据。
TCP允许在未从远