Home

zhangyiqun

Thoughts, stories and ideas.

Notes Blog Archives About
16 Apr 2009

对玩转apache之调优的补充之一(系统篇)

1、除特别说明外,本博客内容皆为原创,可以自由转载传播,但请署名及注明出处,不尊重别人劳动成果的不欢迎;

2、本博客内容遵守“署名-非商业性使用-禁止演绎 2.5 中国大陆”协议;

写在前面

计划补充三个部分,包括系统、php和mysql。因对系统底层不是很了解,故调优面可能比较片面,还望有经验的朋友能够多多指导,于我而言写文章的过程也是一个成长的过程。

安装 LAMP 软件是非常容易的。但是安装的简便性使人误以为这些软件会自行顺利地运行,虽然实际情况并非如此。最终,应用程序的负载会超出后端服务器的处理能力,应用程序的性能会降低。所以LAMP 安装需要不断监控、调优和评估。

LAMP架构

基于 LAMP 的应用程序是用 PHP 这样的脚本语言编写的,它们作为Apache Web 服务器的一部分运行。PHP 应用程序通过请求的 URL、所有表单数据和已捕获的任意会话信息从客户机获得信息,从而确定应该执行什么操作。如有必要,服务器会从 MySQL 数据库(也在 Linux 上运行)获得信息,将这些信息与一些 Hypertext Markup Language(HTML)模板组合在一起,并将结果返回给客户机。当用户在应用程序中导航时,这个过程重复进行;当多个用户访问系统时,这个过程会并发进行。但是,数据流不是单向的因为可以用来自用户的信息更新数据库,包括会话数据、统计数据(包括投票)和用户提交的内容(比如评论或站点更新)。除了动态元素之外,还有静态元素,比如图像、JavaScript 代码和层叠样式表(CSS)。

在研究 LAMP 系统中的请求流之后,就来看看可能出现性能瓶颈的地方。数据库提供许多动态信息,所以数据库对查询的响应延迟都会反映在客户机中。Web 服务器必须能够快速地执行脚本,还要能够处理多个并发请求。最后,底层操作系统必须处于良好的状态才能支持应用程序。

在进行实验之前需要先了解什么是吞吐率?

服务器在实际运行期间单位时间内处理的请求数

实验机

硬件方面

CPU

cat /proc/cpuinfo

processor : 0

vendor_id : GenuineIntel

cpu family : 6

model : 22

model name : Intel(R) Celeron(R) CPU 440 @ 2.00GHz

stepping : 1

cpu MHz : 2000.024

cache size : 512 KB

fdiv_bug : no

hlt_bug : no

f00f_bug : no

coma_bug : no

fpu : yes

fpu_exception : yes

cpuid level : 10

wp : yes

flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss tm pbe nx lm constant_tsc up pni monitor ds_cpl tm2 cx16 xtpr lahf_lm

bogomips : 4002.21

内存2G

total used free shared buffers cached<br /> Mem: 2065520 525144 1540376 0 32112 344888

硬盘

# dmesg | grep Vendor<br /> Vendor: ATA Model: Hitachi HDP72502 Rev: GM2O

# hdparm -t /dev/sda

/dev/sda:

Timing buffered disk reads: 268 MB in 3.00 seconds = 89.30 MB/sec

网卡

eth0: negotiated 100baseTx-FD, link ok

系统

RHEL5U1

服务&&程序

Apache 2.2.11(prefork), MySQL 5.1.30, PHP 5.2.8 & PEAR + SQLite 2.8.17/3.3.17 + multibyte (mbstring) support, Perl 5.10.0, ProFTPD 1.3.1, phpMyAdmin 3.1.1, OpenSSL 0.9.8i, GD 2.0.1, Freetype2 2.1.7, libjpeg 6b, libpng 1.2.12, gdbm 1.8.0, zlib 1.2.3, expat 1.2, Sablotron 1.0, libxml 2.7.2, Ming 0.3, Webalizer 2.01, pdf class 009e, ncurses 5.3, mod_perl 2.0.4, FreeTDS 0.63, gettext 0.11.5, IMAP C-Client 2004e, OpenLDAP (client) 2.3.11, mcrypt 2.5.7, mhash 0.8.18, eAccelerator 0.9.5.3, cURL 7.19.2, libxslt 1.1.8, phpSQLiteAdmin 0.2, libapreq 2.08, FPDF 1.6

WordPress.v2.7.Incl.Simp.Chinese.Pack.v2-wpcng

为了让整个实验更加严谨,本次使用了5台真实的机器,配置相同。2台为web服务器,其余3台为客户端。

使用了带有27000条数据的wordpress博客。

使用ab进行测试。这是我最不满意的地方,如果可以用Jmeter或者LoadRunner等专业工具,提供的数据将更加全面,没用是因为我没接触过。

测试

1.关闭不需要的服务后,服务器处理能力前后的变化

默认配置的ab结果

A

B

C

关闭不需要服务后的ab结果

A

B

C

结论:调优后的连接数是未调前的一倍以上,主要原因是未调前其他服务占用了过多的内存。所以如果一个小型网站想提高连接数,增加内存即可。但是连接数增加所带来的另一个问题就是访问速度变得慢了许多(50%以上)。

我所开启的服务如下

crond crond是Unix下的一个传统程序,该程序周期地运行用户调度的任务。比起传统的Unix版本,Vixie版本添加了不少属性,而且更安全,配置更简单

irqbalance 仅当服务器CPU为S.M.P架构或支持双核心、HT技术时,才需开启,否则关闭

microcode_ctl 可以编码以及发送新的微代码到kernel以更新Intel IA32系列处理器

mysql 一个快速高效可靠的轻型SQL数据库引擎

network 激活/关闭启动时的各个网络接口网络。

random 保存和恢复系统的高质量随机数生成器,这些随机数是系统一些随机行为提供的。

sendmail 邮件服务器

sshd 是 OpenSSH守护进程。用于在不可信网络上提供安全的连接通道。

Syslog syslog是操作系统提供的一种机制,守护程序通常使用这种机制将各种信息写到各个系统日志文件。通常应该启动该服务

2.配置磁盘来提高性能:调前 VS 调后

磁盘在 LAMP 架构中扮演着重要的角色。静态文件、模板和代码都来自磁盘,组成数据库的数据表和索引也来自磁盘。对磁盘的许多调优(尤其是对于数据库)集中于避免磁盘访问,因为磁盘访问的延迟相当高。因此,花一些时间对磁盘硬件进行优化是有意义的。首先要做的是,确保在文件系统上禁用 atime 日志记录特性。atime 是最近访问文件的时间,每当访问文件时,底层文件系统必须记录这个时间戳。因为系统管理员很少使用 atime,禁用它可以减少磁盘访问时间。禁用这个特性的方法是,在 /etc/fstab 的第四列中添加 noatime 选项。

A

B

C

调后

A

B

C

结论:调前和调后几乎没差别。因为网络带宽是100mbps,那么目前所使用的硬盘永远不会成为瓶颈,除非不是网络应用。

关闭atime的方法

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

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

3.对内核的优化,这里面的水很深,目前我还没有融汇贯通,只能发上来一些东西供大家参考。不懂的话最好不要搞,对内核调节危险很大。

vi /etc/sysctl

# Use TCP syncookies when needed

net.ipv4.tcp_syncookies = 1

# 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

本次不光完成了实验而且知道了:

解除phpMyAdmin 导入大型MySQL数据库文件大小限制

  1. 修改 php.ini 文件中下列3项的值:

upload_max_filesize, memory_limit 和 post_max_size

upload_max_filesize,上传文件大小

memory_limit 设置内存

post_max_size 提交数据的最大值

为你想改的大小值.

  1. 在 phpMyAdmin 的配置文件中修改或加入这个设置:

这个文件一般是在phpMyAdmin目录下的config.inc.php文件

$cfg[‘ExecTimeLimit’] = 0; // maximum execution time in seconds (0 for no limit)

默认为300秒钟,改为0表示不受限制

参考文献

Tuning LAMP systems, Part 1: Understanding the LAMP architecture

Notes Blog Archives About