Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

LAMP 架构服务器性能优化建议(03/11/2004,R1版)

[复制链接]
paulgao 发表于 2004-3-12 00:14:01 | 显示全部楼层 |阅读模式
LAMP 架构服务器性能优化建议
        (03/11/2004,R1版)

  出处:http://www.paulgao.com.cn,欢迎转载。

  维护“手机之家”(http://www.imobile.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>”部分设置为“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(因为内核升级,所以一些老版本内核的方法已经不能再使用了:)。我也会进一步更新这篇文章,让大家能够更好的进行服务器的性能提升工作~

  另外欢迎来访问国内数一数二的手机网站,手机之家,地址见下,呵呵~

        高春辉
        mailto:paulgao@yeah.net
        手机之家网站(http://www.imobile.com.cn)

[ Last edited by paulgao on 2004-3-12 at 03:52 PM ]
cqfanli 发表于 2004-3-12 08:14:23 | 显示全部楼层
文章不錯的﹐大家在優化時不要死搬硬套﹐要根據自己的硬件環境和用途﹐適當調整某些地方~~ 優化本來就是一個需要花費較長時間的過程~~
還有一點﹐請密切注意一些軟件的更新﹐新的技朮總比舊技朮要好﹐不過在升級前在三思﹐因為有些新東西未必穩定﹐SERVER是以穩定為重﹐速度其次的~~
回复

使用道具 举报

liunx 发表于 2004-3-12 14:37:21 | 显示全部楼层
很有启发
回复

使用道具 举报

Crossday 发表于 2004-3-12 21:46:31 | 显示全部楼层
呵呵 大家一起来写作文啊 :)
大部分参数和我依据实地环境得出的差不多
有些有再讨论的可能 如mysql wait_timeout 那个值设置大了没用 做10左右就可了
回复

使用道具 举报

 楼主| paulgao 发表于 2004-3-13 00:27:39 | 显示全部楼层
我有些程序是长期执行的,而且只在开始做连接操作,所以mysql timeout 设短了不行:)
回复

使用道具 举报

Crossday 发表于 2004-3-13 16:45:43 | 显示全部楼层
wait_timeout是使用长久连线时 空闲进程的控制 只要数据库在连接状态 他是不进行干预的 不管是否有查询或更新操作 把这个设置小一点 再使用pconnect就比较理想了 ;)
回复

使用道具 举报

 楼主| paulgao 发表于 2004-3-13 16:54:00 | 显示全部楼层
Originally posted by Crossday at 2004-3-13 04:45 PM:
wait_timeout是使用长久连线时 空闲进程的控制 只要数据库在连接状态 他是不进行干预的 不管是否有查询或更新操作 把这个设置小一点 再使用pconnect就比较理想了 ;)

好像不行:(
回复

使用道具 举报

cqfanli 发表于 2004-3-15 09:19:47 | 显示全部楼层
timeout的時間﹐我的經驗值是5-20﹐看你的SERVER的訪問量了~~
回复

使用道具 举报

Crossday 发表于 2004-3-15 23:53:45 | 显示全部楼层
访问量越大 这个值就应该越小 否则留出的空闲进程太多 会占用不必要的内存
在一个15分钟在线3000人的论坛上 设置为3比较合适 同时打开pconnect
回复

使用道具 举报

 楼主| paulgao 发表于 2004-3-21 10:13:29 | 显示全部楼层
我是和你们想的一样,但是不行:(我connect之后,做一个长时间的操作,再去执行SQL,就显示断开了:(郁闷~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-23 06:24 , Processed in 0.028216 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表