lamp 架构服务器性能优化建议
(
03/11/2004
,r1版)
出处:http://www.paulgao.com.cn,欢迎转载。
服务器配置如下:redhat linux 9.0、apache
1.3.29
、php 4.3.4、mysql
3.23.58,以下建议均在以上平台上跑的很好,当然也跟你的应用有关系,具体实施要根据实际效果来进行。
1、众所周知的方法就是使用 zend optimizer(简称 zo,最新版本为 2.5.1) 或者 zend
performance suite(简称 zps,其中包含 zo,最新版本为 3.6.0)对 php
进行加速。相关软件可到张微波的主页来下载哦,地址为:http://www.5ilinux.com/blog/archives/000093.html。
2、apache配置优化(httpd.conf)
1)修改“timeout”的值为 30-60,如果你得程序没有执行时间需要很长的话,可以修改到 10-15;
2)修改“keepalive”的值为“off”,这个很有效果,也很有争议,我自己的看法是很有效果,而且并没有影响速度,大家可以自行试验;
3)修改“maxrequestsperchild”的值为“2048”,这个还在试验中,一是因为怕有内存泄漏,二是因为
apache 进程会因为随着服务时间的延长,会变得越来越胖(我这里的实际情况是某些 apache
进程会狂吃内存到18mb,晕啊:),不过这设置有没有效果,还在试验中;
4)在不使用 .htaccess 的情况下,将其“<files
.htaccess[/img]”部分设置为“none”方式,如果你使用 phpmyadmin 进行管理的话,可以使用
phpmyadmin 的 cookie 权限控制方式。
3、卸载不必要的模块,不管是静态编译还是 dso 模式,以便节省内存占用。具体模块可以参照 apache
的手册,这里就不多说了。php 也是同样,我基本上已经把不用的模块都卸载了:)
4、使用 mod_gzip 进行加速,很简单,就不多说了。
5、如果你的服务器还是负载很高的话,更极端的方式就是在 httpd.conf 里面将日志停掉了,不过一般要保留
errorlog 才好,以便排错,而且要记得,不是把“customlog”注释掉就行了,而要使用“customlog
/dev/null common”这样的方式才好。
6、如果你的 php 程序使用 session 对话的话,可以在 php.ini
里面将“session.save_path”设置为“session.save_path = /dev/shm”,因为
/dev/shm 是 linux 系统独有的 tmpfs 文件系统,是以内存为主要存储方式的文件系统,比 ramdisk
要好,因为可以使用 diskswap
作为补充,而且是系统自带,不需要另行配置,想想吧,从磁盘io操作到内存操作,速度会快多少?:)你也可以把你所需要的临时文件都写在
/dev/shm 下,只是别忘了,重启就没有啦,我是只存放目标文件的,呵呵。额外的说明资料请看“使用虚拟内存(virtual
memory,vm)文件系统和绑定安装”(http://www-900.ibm.com/developer ...
m/l-fs3/index.shtml)。
7、mysql 的优化(/etc/my.cnf)
1)确认在“[mysqld]”部分加入了“skip-innodb”和“skip-bdb”参数;
2)确认在“[mysqld]”部分加入了“skip-name-resolve”和“skip-locking”参数;
3)如果不需要的话,可以将二进制日志(binlog)停掉,方法是将“log-bin”注释掉;
4)在内存允许的情况下,对一些参数进行重新配置,目标在于将大部分操作集中于内存中,尽量不进行磁盘操作,对于我的 mysql
服务器我是如下修改的,基于 2g 内存情况:
[mysqld]
set-variable = key_buffer=512m
set-variable = max_allowed_packet=4m
set-variable = table_cache=1024
set-variable = thread_cache=64
set-variable = join_buffer_size=32m
set-variable = sort_buffer=32m
set-variable = record_buffer=32m
set-variable = max_connections=512
set-variable = wait_timeout=120
set-variable = interactive_timeout=120
set-variable = max_connect_errors=30000
set-variable = long_query_time=1
set-variable = max_heap_table_size=256m
set-variable = tmp_table_size=128m
set-variable = thread_concurrency=8
set-variable = myisam_sort_buffer_size=128m
你可以根据“show status”命令返回的状态进行微调。我主要注意以下变量的数值,越小越好,最好为零:)
created_tmp_disk_tables
created_tmp_tables
created_tmp_files
slow_queries
8、在启动脚本中使用“--log-slow-queries=/home/logs/mysql_slow.log”参数,以便进行
sql 语句的优化工作,这个其实是很很重要的工作。记得一定要在 my.cnf 中设置“set-variable =
long_query_time=1”才行。
9、另外可以使用 4.0.xx 版本的 mysql,4.0.xx 版本除了一些性能提升以外,还有 querycache
方法,就是在 sql 语句查询结果没有变动之前,将其结果进行缓存,下次再进行同样的 sql
语句查询就可以直接反回结果,当然也是以牺牲内存为前提:)
10、额外的,对于 linux ext3 文件系统还有一个小技巧可用,就是在修改 /etc/fstab
中的参数,比如“/dev/sdb2 /home ext3 defaults 1 2”改为“/dev/sdb2 /home
ext3 noatime 1 2”,“noatime”的意思就是不修改
accesstime,对于磁盘文件读写频繁的服务器也应该可以降低一些效果。不过最好不要远程操作,不然因为修改失误,服务器不能启动了,可别怪我:)
好了,基本上我用过的方法已经说过一遍了,有些方法是取自于一些很好的文章,由于未作保留,所以无法写出出处,只能泛泛的表示感谢了。其中有些方法也适用于
windows 平台,大家可以根据自己的服务器、应用情况去进行应用,大家也可一说说自己的办法,比如改用 zeus 来做
webserver,我也在找更多的办法来提升服务器性能,比如基于 linux kernel v2.4
以上内核的一些性能优化方法,从 network 到
swap(因为内核升级,所以一些老版本内核的方法已经不能再使用了:)。我也会进一步更新这篇文章,让大家能够更好的进行服务器的性能提升工作~