Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1592939
  • 博文数量: 317
  • 博客积分: 10283
  • 博客等级: 上将
  • 技术积分: 3566
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-04 11:38
个人简介

哥使用Linux

文章分类

全部博文(317)

分类: 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的工作原理
  如果不用“–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翻译的中文手册:

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文件
# 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的访问速度有了显著提高,看来优化的效果是很明显的。 ^ ^

原文出处:http://qtutu.com/blog/?p=104

阅读(2445) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~