LAMP系统的优化实例
时间:2006-06-15 来源:jingzhi
前几天qtutu访问起来慢得不行,于是我开始找原因。
首先用ab测试qtutu首页,发现失败率奇高,10个请求失败9个。而且很慢。用ab测试一个静态页面,居然用了10s。
后来定为到ZendPlatform上,装了没怎么用,似乎过期了。干脆把系统升级下,于是升级到apache2.2和php5.1.4。
Apache2和Apache1有很大的不同,引入了MPM,默认采用prefork方式工作,对于访问压力比较大的网站,有明显的效果。
prefork的工作原理
如果不用“–with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。
prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。
from - 让用Apache的网站速度更快
http://exdream.blogchina.com/2447583.html
php5.14多了一个函数,hash,和我自定义的函数重名了,改掉。
然后正式开始对系统的优化。
1 加缓存 - 缓存是动态网站静态化的解决方案之一,具有良好的可控制性。
1.1 添加页面缓存
用pear::cache_lite代替了原来的缓存,cache_lite 6月刚刚发布了新版本,用起来很是不错。这里有rainx翻译的中文手册:
http://rainx.phpmore.com/manual/cache_lite.html
1.2 添加数据库缓存
所谓数据库缓存,就是把sql查询的数据缓存起来。这里我们用到了memcached。memcached的资料,nio同学有整理过
http://nio.infor96.com/php-memcached/
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文件
# cd PATH/to/mod_rewrite.c //进入包含mod_rewrite.c文件的目录
# apxs -c mod_rewrite.c //apxs请指定绝对路径,在你当前正在使用apache的bin目录里
# apxs -i -a -n mod_rewrite mod_rewrite.la
比较郁闷的是,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的访问速度有了显著提高,看来优化的效果是很明显的。 ^ ^
相关阅读 更多 +