哥使用Linux
分类: LINUX
2008-01-12 19:28:28
前几天qtutu访问起来慢得不行,于是我开始找原因。
首先用ab测试qtutu首页,发现失败率奇高,10个请求失败9个。而且很慢。用ab测试一个静态页面,居然用了10s。
后来定为到ZendPlatform上,装了没怎么用,似乎过期了。干脆把系统升级下,于是升级到apache2.2和php5.1.4。
Apache2和Apache1有很大的不同,引入了MPM,默认采用prefork方式工作,对于访问压力比较大的网站,有明显的效果。
prefork的工作原理 from - 让用Apache的网站速度更快 http://exdream.blogchina.com/2447583.html |
php5.14多了一个函数,hash,和我自定义的函数重名了,改掉。
然后正式开始对系统的优化。
1 加缓存 - 缓存是动态网站静态化的解决方案之一,具有良好的可控制性。
1.1 添加页面缓存
用pear::cache_lite代替了原来的缓存,cache_lite 6月刚刚发布了新版本,用起来很是不错。这里有rainx翻译的中文手册:
1.2 添加数据库缓存
所谓数据库缓存,就是把sql查询的数据缓存起来。这里我们用到了memcached。memcached的资料,nio同学有整理过
memcached启动后时一个类似于mysqld的后台程序,我们只需要用memcached-client.php 去连接和放置数据就可以了,和cache_lite比较像。
1.3 缓存的进一步加速
为了进一步提高缓存速度,减少文件io操作,我把cache_lite的cache目录mount成了tmpfs。所谓tmpfs,就是一个放在内存中的分区,可以像文件一样操作它。
这里有关于 tmpfs的详细说明 http://www-128.ibm.com/developerworks/cn/linux/filesystem/l-fs3/
#mount -t tmpfs -o size=20m tmpfs /mnt/tmp |
2 分目录
由于开始设计时偷懒,很多数据都放到一个目录下,当一个目录的文件数多于2000时,访问的速度就会慢很多。
2.1 session文件分目录
qtutu的用户认证前几天从cookie改为session,并支持两周以内的免登陆,这样就需要将session的gc时间延长,所以在/tmp/目录下聚集了大量的session文件。
要实现session的分目录存放,先要修改php.ini中的session.save_path选项为N;/tmp/(其中N是目录层次);然后在指定的session目录下建立多级目录,因为php自己是不会做这个事情的,php源代码中自带了一个脚本生成,在ini的注释上有详细说明,可以用来生成目录。
2.2 缓存文件分目录
同样的,cache文件也是需要分目录存放的,好在cache_lite本身就支持多级目录,只要在Option中加上这行就可以了:
‘hashedDirectoryLevel’ => 3, |
2.3 对正在使用的数据目录分级
还需要对签名和头像进行和分目录,这两个目录由于都是正在使用的数据,所以不能改变访问路径,在进行多目录化后,我们用apache的rewrite来保证原有路径依然有效。
apache rewrite 需要编译和加载so。
# PATH=/usr/local/bin:/usr/sfw/bin:/usr/ccs/bin:$PATH # export PATH # which gcc # which make # find ./ -name mod_rewrite.c //在apache的安装目录中寻找mod_rewrite.c文件 |
比较郁闷的是,apxs会自己帮你把LoadModule那行加到httpd.conf文件,但是它加的是错的,多写了一个mod_。应该改成这样:
LoadModule mod_rewrite_module modules/mod_rewrite.so >>> LoadModule rewrite_module modules/mod_rewrite.so |
然后就是重启apache,最好用stop / start吧,比较放心。用restart不是那么好。
做完这些后,Qtutu的访问速度有了显著提高,看来优化的效果是很明显的。 ^ ^