该网站系统结构说明
a.多台Web前端服务器, 配置都为单颗Xeon 3.0G CPU,4G内存,2块73G SCSI磁盘
b.CentOS 3.3
c.多台MySQL数据库服务器
d.基于PHP开发的应用
该应用的特点
a.大量内容基于数据库,需要频繁访问数据库,并且数据更新很快
b.采用页面cache机制缓解数据库压力,但页面cache只有5分钟有效期,需要频繁生成新的cache
c.Cache以文件形式存在磁盘上,都是小文件,最小不到1k,最大不超过128k
问题描述
a.访问高峰期时Web前端负载比较高,时常超过10
b.访问高峰期时Web前端响应很慢
性能分析
a.负载比较高,时常会超过10,CPU Idel经常会小于30%,有时Idel为0,CPU io wait 很大,经常超过30%,磁盘读每秒不超过100k,磁盘写每秒.5M左右,磁盘tps超过100
b.访问高峰期时内存也有部分空闲,用于buffer和cache的内存基本占总内存60%以上,没有使用交换内存
原因分析
a.分析该应用的特点后发现,访问高峰期时,要频繁生成新的cache文件,或者更新以及过期的cache文件,cache文件目录为256x256的哈希结构,因此读写文件时磁盘随机寻址非常频繁
b.该应用磁盘写远大于磁盘读的原因是系统cache命中率高,大量文件读过一次就cache住了,因此读的开销很小 .
c.写磁盘的量并不算很大,平均每秒1.5M,但都是随机写,因此写磁盘速度会稍微慢,也因此会消耗大量CPU时间
d.对比访问高峰期和访问量小时候的系统状态,磁盘写的tps提高了1倍以上,CPU io wait提高了3倍以上,因此认为主要性能瓶颈在磁盘写上
优化办法
a.减少磁盘写的次数,cache文件先写在内存中,超过一定访问次数时才写回磁盘,但由于要修改应用程序,因此执行难度大
b.减少磁盘随机写的次数,前端不使用255x255的哈希目录,而是把多个cache文件写在一个大的cache文件中,并且只作追加写,这样就能把随机写变成了顺序写,cache过期后,整个大的cache文件可以一次删除。但由于要修改应用,因此执行难度大
c.上面2个办法结合使用,听上去性能会更好,但是执行难度更大
d.使用tmpfs作cache磁盘(ramdisk也可以),这样写都在访问内存,没有磁盘IO消耗,缺点是cache的空间不会很大,不能超过2G(该服务器是4G内存),但是不用修改应用程序,执行容易:
i.Mount –bind /dev/shm /var/www/cache
ii.写一个清cache的脚本程序,配置在cron中,30分钟执行一次,检查/dev/shm的使用率超过70%时,使用find命令找出太旧的cache文件删除掉,最终采用了这个办法,高峰期系统负载小于5。
参考文章:
1.系统状态查看Sysstat
2.Web Site Test Tools and Site Management Tools
3.Linux Performance a