LAMP 最初是指Linux 、Apache、MySQL 和PHP(或Perl)。

LAMP 环境调优

对任何系统进行调优的第一步都是了解它的工作原理。按照最简单的形式,基于LAMP 的应用程序是用PHP 这样的脚本语言编写的,它们作为Linux 主机上运行的Apache Web 服务器的一部分运行。


PHP 应用程序通过请求的URL、所有表单数据和已捕获的任意会话信息从客户机获得信息,从而确定应该执行什么操作。如有必要,服务器会从MySQL 数据库(也在Linux 上运行)获得信息,将这些信息与一些Hypertext Markup Language(HTML)模板组合在一起,并将结果返回给客户机。

当用户在应用程序中导航时,这个过程重复进行;当多个用户访问系统时,这个过程会并发进行。

但是,数据流不是单向的,因为可以用来自用户的信息更新数据库,包括会话数据、统计数据(包括投票)和用户提交的内容(比如评论或站点更新)。除了动态元素之外,还有静态元素,比如图像、JavaScript 代码和层叠样式表(CSS)。


在研究LAMP 系统中的请求流之后,就来看看可能出现性能瓶颈的地

方。数据库提供许多动态信息,所以数据库对查询的响应延迟都会反映

在客户机中。Web 服务器必须能够快速地执行脚本,还要能够处理多

个并发请求。最后,底层操作系统必须处于良好的状态才能支持应用程

序。通过网络在不同服务器之间共享文件的其他设置也可能成为瓶颈。


调优之前:

度量性能

首先,度量可以帮助了解性能趋势,包括好坏两方面的趋势。作为一个简单的方法,查看一下Web 服务器上的中央处理单元(CPU)使用率,就可以了解CPU 是否负载过重。同样,查看过去使用的总带宽并推断未来的变化,可以帮助判断什么时候需要进行网络升级。这些度量最好与其他度量和观测结合考虑。

这些度量最好与其他度量和观测结合考虑。例如,当用户抱怨应用程序太慢时,可以检查磁盘操作是否达到了最大容量。


第二点:

每次只修改一个值

性能度量的第二个用途是,判断调优是对系统性能有帮助,还是使它更糟糕了。方法是比较修改之前和之后的度量结果。但是,为了进行有效的比较,每次应该只修改一个设置。

最简单的方法可能是使用 curl 命令

curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total}\

http://www.canada.com


上面例子:给出对一个流行的新闻站点执行 curl 命令的情况。

输出通常是HTML 代码,通过 -o 参数发送到 /dev/null。-s 参数去掉所有状态信息。-w 参数让 curl 写出表1 列出的计时器的状态信息:

time_connect 建立到服务器的TCP 连接所用的时间

time_starttransfer 在发出请求之后,Web 服务器返回数据的第一个字节所用的时间

time_total 完成请求所用的时间


打开firefox 浏览器扩展


用于Firefox 浏览器的Tamper Data 扩展,可以在日志中记录Web 浏览器发出的每个请求,并显示每

个请求所用的下载时间。使用这个扩展的方法是,选择 Tools > Tamper Data 来打开Ongoing requests 窗口。装载要考察的页面,

然后就会看到浏览器发出的每个请求的状态和装载每个元素所用的时间。图1 给出装载developerWorks 主页的结果。



三 基本系统调节

1 修改参数对网络调优

在对系统apache ,php 和mysql 组件进行调优之前。应该花一些时间保证必要的服务运行。缩减不必要的服务。

大多数Linux 发布版都定义了适当的缓冲区和其他Transmission Control Protocol(TCP)参数。

可以修改这些参数来分配更多的内存,从而改进网络性能。设置内核参数的方法是通过 proc 接口,也就是通过读写 /proc 中的值。幸运的是,sysctl 可以读取

/etc/sysctl.conf 中的值并根据需要填充 /proc,这样就能够更轻松地管理这些参数。

将这些设置添加到 /etc/sysctl.conf 的现有内容中。


# Use TCP syncookies when needed  

net.ipv4.tcp_syncookies = 1 

 #第一个设置启用TCP SYN cookie。

当从客户机发来新的TCP 连接时,数据包设置了SYN 位,服务器就为这个半开的连接创建一个条目,并用一个SYN-ACK 数据包进行响应。在正常操作中,远程客户机用一个ACK 数据包进行响应,这会使半开的连接转换为全开的。有一种称为  SYN 泛滥(SYN flood) 的网络***,它使ACK 数据包无法返回,导致服务器用光内存空间,无法处理到来的连接。SYN cookie 特性可以识别出这种情况,并使用一种优雅的方法保留队列中的空间。大多数系统都默认启用这个特性,但是确保配置这个特性更可靠。

启用TCP 窗口伸缩使客户机能够以更高的速度下载数据。TCP 允许在未从远程端收到确认的情况下发送多个数据包,默认设置是最多64 KB,在与延迟比较大的远程客户机进行通信时这个设置可能不够。窗口伸缩会在头中启用更多的位,从而增加窗口大小。

# Enable TCP window scaling

net.ipv4.tcp_window_scaling: = 1

# Increase TCP max buffer size

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

# Increase Linux autotuning TCP buffer limits

net.ipv4.tcp_rmem = 4096 87380 16777216 

net.ipv4.tcp_wmem = 4096 65536 16777216

# Increase number of ports available

net.ipv4.ip_local_port_range = 1024 65000


后面四个配置项增加TCP 发送和接收缓冲区。这使应用程序可以更快地丢掉它的数据,从而为另一个请求服务。还可以强化远程客户机在服务器繁忙时发送数据的能力。最后一个配置项增加可用的本地端口数量,这样就增加了可以同时服务的最大连接数量。

在下一次引导系统时,或者下一次运行 sysctl -p /etc/sysctl.conf 时,这些设置就会生效。


配置磁盘来提高性能

磁盘在LAMP 架构中扮演着重要的角色。静态文件、模板和代码都来自磁盘,组成数据库的数据表和索引也来自磁盘。对磁盘的许多调优(尤其是对于数据库)集中于避免磁盘访问,因为磁盘访问的延迟相当高。因此,花一些时间对磁盘硬件进行优化是有意义的。

首先要做的是,确保在文件系统上禁用 atime 日志记录特性。atime 是最近访问文件的时间,每当访问文件时,底层文件系统必须记录这个时间戳。因为系统管理员很少使用 atime,禁用它可以减少磁盘访问时间。禁用这个特性的方法是,在 /etc/fstab 的第

四列中添加 noatime 选项。


演示如何启用 noatime 的fstab 示例

/dev/VolGroup00/LogVol00 / ext3 defaults,noatime 1 1

pdfcrowd.com open in browser PRO version Are you a developer? Try out the HTML to PDF API

LABEL=/boot /boot ext3 defaults,noatime 1 2

devpts /dev/pts devpts gid=5,mode=620 0 0

tmpfs /dev/shm tmpfs defaults 0 0

proc /proc proc defaults 0 0

sysfs /sys sysfs defaults 0 0

LABEL=SWAP-hdb2 swap swap defaults 0 0

LABEL=SWAP-hda3 swap swap defaults 0 0


上面例子中只修改了ext3 文件系统,因为 noatime 只对驻留在磁盘上的文件系统有帮助。为让这一修改生效,不需要重新引导;只需重新挂装每个文件系统。例如,为了重新挂装根文件系统,运行 mount / -o remount。有多种磁盘硬件组合,而且Linux 不一定能够探测出访问磁盘的最佳方式。


Linux 磁盘读写测数

可以使用 hdparm 命令查明和设置用来访问IDE 磁盘的方

法。hdparm -t /path/to/device 执行速度测试,可以将这个测试结果作为性能基准。为了使结果尽可能准确,在运行这个命令

时系统应该是空闲的。清单4 给出在 hda 上执行速度测试的结果。

清单4. 在 /dev/hd 上执行的速度测试

# hdparm -t /dev/hda

/dev/hda:

Timing buffered disk reads: 182 MB in 3.02 seconds = 60.31 MB/sec


hadparm 常用设置:


-vi 向磁盘查询它支持的设置以及它正在使用的设置。

-c 查询/启用(E)IDE 32 位I/O 支持。hdparm -c 1 /dev/hda 启用这个设置。

-m 查询/设置每中断多扇区模式。如果设置大于零,设置值就是每个中断可以传输的最大扇区数量。

-d

1 -启用直接内存访问(DMA)传输并设置IDE 传输模式。hdparm 手册页详细说明了在  -X 后面可以设置的数字。只有1 -X

在  -vi 说明目前并未使用最快速的模式的情况下,才需要进行这个设置。

不幸的是,对于Fiber Channel and Small Computer Systems Interface(SCSI)系统,调优依赖于具体的驱动器。

必须将有帮助的设置添加到启动脚本中,比如 rc.local。



网络文件系统调优

网络文件系统(NFS)是一种通过网络共享磁盘的方法。NFS 可以帮助确保每个主机具有相同数据的拷贝,并确保修改反映在所有节点上。但是,在默认情况下,NFS 的配置不适合大容量磁盘。

每个客户机应该用 rsize=32768,wsize=32768,intr,noatime 挂装远程文件系统,从而确保:

使用大的读/写块(数字指定最大块大小,在这个示例中是32KB)。

在挂起时NFS 操作可以被中断。

不持续更新 atime。



可以将这些设置放在 /etc/fstab 中,如果使用自动挂装器,那么应该将这些设置放在适当的 /etc/auto.* 文件中。

在服务器端,一定要确保有足够的NFS 内核线程来处理所有客户机。在默认情况下,只启动一个线程,但是Red Hat 和Fedora 系

统会启动8 个线程。对于繁忙的NFS 服务器,应该提高这个数字,比如32 或64。可以用 nfsstat -rc 命令评估客户机,了解是

否有阻塞的现象,这个命令显示客户机远程过程调用(RPC)统计数据。清单5 显示一个Web 服务器的客户机统计数据。

 显示NFS 客户机的RPC 统计数据

# nfsstat -rc

Client rpc stats:

calls retrans authrefrsh

1465903813 0 0 

第二列 retrans 是零,这表示从上一次重新引导以来没有出现需要重新传输的情况。如果这个数字比较大,就应该考虑增加NFS 内

核线程。设置方法是将所需的线程数量传递给 rpc.nfsd,比如 rpc.nfsd 128 会启动128 个线程。任何时候都可以进行这种设

置。线程会根据需要启动或销毁。同样,这个设置应该放在启动脚本中,尤其是在系统上启用NFS 的脚本。

关于NFS,最后要注意一点:如果可能的话,应该避免使用NFSv2,因为NFSv2 的性能比v3 和v4 差得多。在现代的Linux 发行版

中这应该不是问题,但是可以在服务器上检查 nfsstat 的输出,了解是否有任何NFSv2 调用。