该网站系统结构说明
a. 1台Dell2650服务器, 单颗Xeon 3.0G CPU,1G内存,2块72G SCSI磁盘
b. 操作系统 CentOS 3.3
c. 应用基于LAMP架构,所有服务都在一台服务器上分析和优化的过程
a.初期性能问题及处理
i.表现:早晨和下午访问高峰时,服务器频繁宕机,重启后的一段时间内能正常服务,过一会以后又变的响应缓慢,然后又宕机。
ii.检查:发现宕机前系统负载高,
Apache httpd.conf 配置最大用户数为1024。
iii.处理:修改 httpd.conf 配置文件,降到最大 512 个用户数,仍然频繁宕机,又降到 256 个用户数,系统不宕机了,但是负载很高,站点访问极慢。
b.初次优化
深入分析系统资源使用情况(vmstat,top,ps)
i.结论:
CPU资源时常耗尽,因此造成响应缓慢或者长时间没有响应,主要是用户进程消耗资源严重。
ii.原因:
PHP程序没有使用代码加速,网站首页是个PHP程序,每次用户访问都要多次查询数据库,其他程序也没有Cache机制,数据库查询负荷过高。
iii.处理:安装配置
turck-mmcache代码加速器,改写网站首页以及部分频繁访问的程序增加cache机制,减少数据库访问。
c. 第二次优化
一段时间后,系统又开始不稳定,访问高峰时站点无法正常访问
i. 分析系统资源使用状况,发现仍然是CPU耗尽后引起问题,但这次系统IO等待消耗的CPU资源比较大。
ii. 原因:上次解决了CPU资源容易耗尽的问题,目前网站访问量增加了,apache进程数时常达到256个,导致内存使用殆尽,频繁使用交换内存,最终仍然导致CPU资源耗尽
iii.处理:把Apache配置中的 KeepAlive 特性关闭,进程数大量减少,基本保持在80个进程以内,还是会使用交换内存,但是服务正常了。
d.第三次优化
一段时间后,系统又开始不稳定,访问高峰时站点无法正常访问
i.分析发现还是CPU资源耗尽导致的原因。
ii.原因:程序频繁访问数据库,大量的SQL语句中有 where, order by 等子句,而大量的表没有建索引,导致MySQL数据库负荷过高,消耗CPU资源过高。
iii.处理:优化程序中的SQL语句,where和order by子句上的字段建索引,程序增加Cache机制,再次使服务恢复正常。
e.第四次优化
一段时间后,系统又开始不稳定,访问高峰时站点无法正常访问
i. 分析系统资源使用状况,发现还是CPU耗尽造成的。
ii.原因:数据库查询过多,大部分都是复杂查询,时常需要遍历全表。
iii.处理:优化程序中的SQL语句,增加where子句上的匹配条件,减少遍历全部的查询。
f.网站结构优化
i.鉴于程序的优化空间越来越小,避免以后仍然出现问题,增加了一台专用数据库服务器。
ii.在后来的使用过程中,又陆续增加了1台Web前端服务器,和一台只用于读的MySQL数据库服务器。