在win2003下iis6+php跑php论坛出现卡的现象分析及解决办法
DISCUZ官方合作伙伴,中国教程网DISCUZ论坛的解决方案,如转载请注明 [url=http://www.jcwcn.com/][color=#800080]中国教程网[/color][/url] 出处========[b]序[/b]========
由于以前教程网的这个学习论坛出现卡的很严重情况,苦求解决方法的时候我在discuz官方论坛上发了一个求助帖子,如下:
[url=http://www.discuz.net/viewthread.php?tid=459736&highlight=%2B%D2%FA%C9%FA]http://www.discuz.net/viewthread ... ght=%2B%D2%FA%C9%FA[/url]
一直讨论到最后也没有个结果,直到后来自己经过反复的测试结合数据结果分析,终于找到原因并解决了这个问题!最近有不少人遇到了同样的问题,过来问我解决方法。我觉得有必要把前因后果都写在这里,希望能帮上正在痛苦中挣扎([i]这样来形容一点都不过分[/i])的朋友。
=====================
首先说一下[b]现象[/b]
这个问题直接表现出来的现象就是论坛出现假死的样子,帖子发出去,连接点不开,没有任何响应。观察服务器上的进程会看到论坛这个应用池进程(w3wp.exe)的内存使用量飙升,直到耗尽内存或者程序反应过来。如果你在iis的应用池中设置了内存回收的最大内存数,这个消耗量达到你的设定值时iis会自动为这个他新建一个进程,原进程内存占用量不动,新进程内存消耗量接着攀升。
卡死时间几分钟到几十分钟不等,如果你坚持不管它,到最后他也能反应过。
=====下面我把在这卡的期间需要观测的数据和观测方法罗列一下。
[quote]1、论坛的w3wp进程内存消耗量
[attach]261423[/attach]
我们可以看到进程里可能有很多w3wp进程,通常这个进程是和iis的应用程序池相对应的.所以我们首先要做的就是为论坛单独的分配一个应用程序池.方法是先新建一个应用程序池,设置应用默认的(后面会说到这个设置中需要注意的问题) 名字取个比如bbs.然后在论坛这个站点的属性>>主目录>>应用程序池,选择你刚才新建的那个.
[attach]261424[/attach]
然后需要确定哪个w3wp进程是论坛的,打开任务管理器>>查看>>选择列>>选中PID进程标示符.让进程中显示出pid列.
[attach]261425[/attach]
然后我们开始>>运行cmd>>iisapp -all.第一次执行可能会弹出警告框,此脚本不能与wscript工作,我们直接确定,会问你是否注册cscript,点是.然后就注册成功了,我们再在命令行下输入iisapp -all就会显示出应用池对应的进程pid.记住论坛应用池进程的pid.就可以到任务管理器中去观察论坛进程的活动情况了
[attach]261426[/attach]
[attach]261427[/attach]
[attach]261428[/attach]
2、mysql服务进程的内存消耗量
[attach]265052[/attach]
这个就是对应进程里的mysqld-nt这个进程活动情况
3、论坛程序运行时间和数据库查询次数
在论坛后台可以打开这个选项。在基本设置>>论坛功能里
[attach]265021[/attach]
设置后数据显示在论坛底部,类似如:[color=red][/color]Processed in 0.037979 second(s), 5 queries.
处理时间和请求数,通常的浏览,执行时间要低于0.1秒,感觉比较流畅.超过的话就会明显的感觉到顿.这个值根据论坛的数据量和在线人数的不同略有不同.但是在卡的时候这个数据会达到十几秒或者更长.注意,这里就是分析问题的关键.卡就卡在这里了.后面会分析为什么是卡在了数据库执行时间上.
4、mysql的一些变量参数
声明一下,我是在本地机器上截的图,所以很多状态都是0,这里旨在说明怎么察看这些状态或者参数。调整参数的方法可以直接修改my.ini文件或者在mysql管理工具(如phpmyadmin,mysql administrator等),参数的影响,和调整尺度请看3楼。调整后重新启动mysql.
察看参数的方法:
第一种:直接在命令行下,用root登陆mysql,输入相应的show命令察看
[attach]265001[/attach]
[attach]265002[/attach]
第二种:还可以直接在phpmyadmin下查看:
[attach]265007[/attach][attach]265008[/attach]
第三种:当然还可以用mysql administrator来查看,会更直观一些,而且还可以直接用动态图标观察运行情况。
[attach]265027[/attach][attach]265028[/attach]
[/quote]
[[i] 本帖最后由 肥鱼 于 2007-4-23 11:18 编辑 [/i]] 结合上面的观察得到的数据,我们再看一下自己的硬件指标
主要是服务器的cpu处理能力和内存容量,还有接入带宽!
如果卡的原因是用pIII机器,256M内存,接入方式是adsl或者n多人共享10M的话,不在此讨论之列。解决办法自己想#@jcwcn^@@#
下面是discuz产品说明书里提到的一些负载能力的标准,你可以对比自己的参考一下
[quote]Discuz! 从创立之初即以提高产品效率为突破口,随着编译模板、语法生成内核、数据缓存和自动更新机制等独创或独有技术的应用,以及坚固的数据结构与最少化数据库查询设计,使得 Discuz! 可以在极为繁忙的服务器环境下快速稳定运行,切实节约企业成本,提升企业形象。依据实际应用案例,在 P4 2.4G,1G RAM,IDE 硬盘的入门级服务器上,Discuz! 可以容纳 150 万篇帖子并稳定负载 2500 人/30 分钟在线的流量,最高可达 5000 人/30 分钟在线。在硬件配置稍好的环境中,如双 Xeon 2.4G,2G RAM,万转 SCSI 硬盘的服务器上,以上数字均实现了翻番,即容纳 300 万篇以上帖子,稳定负载 5000~8000 人/30 分钟在线,最高可超过 10000 人/30 分钟。如果采用 Web 和数据库分离的方式负载,并采用 RAID-5,各项指标可达到上述的二至三倍,即实现约 30000人/30 分钟在线。这样的负载能力完全可以满足中大型网站乃至门户网站的应用需求。[/quote]
我们注意一下,这里的
[quote]在 P4 2.4G,1G RAM,IDE 硬盘的入门级服务器上,Discuz! 可以容纳 150 万篇帖子并稳定负载 2500 人/30 分钟在线的流量,最高可达 5000 人/30 分钟在线。[/quote]
我们论坛卡的时候服务器配置
intel 7320主板
双至强2.8
1G内存
普通串口硬盘
根据上面说的最起码要负载:150 万篇帖子 3000 人/30 分钟在线。可是我们当时几百人的时候都卡的要死。
就因为这个“误导”,让我坚信服务器硬件负载能力绝对没有问题,要坚决从软件及配置环境入手,所以就开始了下面的软件优化之旅!这可是个痛苦的过程。
[[i] 本帖最后由 寅生 于 2007-4-23 11:19 编辑 [/i]] 这里说一下软件的搭配和环境的配置和优化!
首先是软件版本的搭配
推荐:
[color=Green]php5.20+zend optimizer3.20+mysql5.0.x[/color]
如果想安装加速软件的话,推荐[color=Blue]eAccelerator095.dll for php5.2[/color]
这些软件都可以去:
[url]http://download.jcwcn.com/soft/server/[/url]
下载
在这个环境配置上我走了很多弯路,开始一直都怀疑是环境配置的不好。各个版本的软件都组合尝试。先升级,再“降级”,再升级。连IIS6都卸载重装好几遍,一个参数一个参数的调整。后来觉得上面推荐的整套组合版本都比较新,而且比较稳定。
环境的优化参考如下:
[b]mysql优化[/b]
下面的优化方法需要调整很多运行参数,如果你对这些东西实在是头疼和不解。可以直接用mysql提供的设置向导,一步一步的根据自己的情况选择,他会自动给你一个配置。具体的方法可以看这个视频教程
[url]http://www.jcwcn.com/swf/flashplay2.asp?url=guanwei/005[/url]
[quote]首先看一下官方说明书提供的优化方法
常规优化方案
建议使用的版本
通常情况下,Unix 类操作系统用户可以直接使用 MySQL 官方提供的已经编译好的软件包,可以避免可能的兼容性问题。如果对一些特殊参数有要求,也可以自行编译源码,但仅建议有丰富经验的用户使用,如果发现有不稳定或不兼容现象,请检查相关的编译参数是否存在问题。
目前我们建议使用的 MySQL 版本为 4.0.x 版,相对 3.23 系列,4.0.x 同样稳定和安全,不仅提供了更多的功能、更好的兼容性,而且修复了很多 3.23 系列的 BUG。在 Windows 系统中,请使用 mysqld-nt(NT/2000/2003 系统)作为服务器,mysqld-max-nt 只有在需要用到 bdb 等功能的时候才需要。
数据库的常规优化
MySQL 本身的配置文件 my.cnf(或 my.ini)中的相关参数,对整个数据库系统来说尤为重要。针对不同的服务器内存容量,MySQL 程序包中提供了 my-small.cnf、my-medium.cnf、my-large.cnf、my-huge.cnf 四个分别适用于服务器内存不低于 64M、256M、512M、1G 情况下的参数设置,您可以根据自身机器的实际情况,数据库应用所占比重,在上述四个文件中提供的参数基础上对配置文件进行修改。Unix 类系统用户,建议将配置文件命名为 my.cnf 放置于 /etc 中。Windows 系统用户直接在 Winmysqladmin.exe 中对 my.ini 进行修改即可。
除了以上默认的配置文件提供的参数以外,通常情况您还需要在 [mysqld] 后修改或增加以下的参数以适应大部分 web 应用程序的需要:
最大连接数为 600,以满足一般应用对连接数的需要:增加 max_connections = 600。根据我们的经验,500~1000 是较为合适的数值,没必要将其设置为超过 1000,那只会造成对资源的浪费。
不使用 innodb 和 bdb:增加两行内容,分别是 skip-innodb 和 skip-bdb。Discuz! 和大部分 web 应用程序不需要使用此两项功能,因此将其关闭以节约内存和磁盘空间,提高效率。
连接超时时间 5,避免空闲进程过多的内存占用:增加 wait_timeout = 5。通过减少超时时间,使得使用 pconnect(长期连接)的用户在利用其不需反复验证用户名和密码的同时,避免打开过多的空闲进程,减少内存消耗。
禁止端口连接:增加 skip-networking。如果使用 Unix 类操作系统,数据库和 httpd 在同一台服务器,且不需要远程读取数据库,可增设此项参数,关闭默认的 3306 端口,有效提禁止外部网络未经授权的访问,避免端口被用以进行 DDoS 攻击。Windows 系统不需要(不能)增加这个参数。
其他参数的配置在此不详述,如果您对服务器及 MySQL 数据库有相当的了解,可以通过数据库的日常运行情况,有针对性的进行修改。
数据表优化(Optimize Table)
当您的库中删除了大量的数据后,您可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。Discuz! 在系统数设置界面提供了数据表优化的功能,可以去除删除操作后留下的数据文件碎片,减小文件尺寸,加快未来的读写操作。您只要在做完批量删除,或定期(如每一两个月)进行一次数据表优化操作即可。
[/quote]
[quote]
[b]MySQL优化经验[/b]
这篇文章相信帮助了不少人,摘录到这里,大家仔细看一下
同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。
安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境,当然需要有不同的配制文件了。
一般的情况下,my-medium.cnf这个配制文件就能满足我们的大多需要;一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的参数,有3个配置参数是最重要的,即key_buffer_size,query_cache_size,table_cache。
key_buffer_size只对MyISAM表起作用,
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点 这个数字是远远不够的,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql,以下的状态值都是本人通过phpmyadmin获得的实例分析:
这个服务器已经运行了20天
key_buffer_size – 128M
key_read_requests – 650759289
key_reads - 79112
比例接近1:8000 健康状况非常好
另外一个估计key_buffer_size的办法 把你网站数据库的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。
从4.0.1开始,MySQL提供了查询缓冲机制。使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。
通过调节以下几个参数可以知道query_cache_size设置得是否合理
Qcache inserts
Qcache hits
Qcache lowmem prunes
Qcache free blocks
Qcache total blocks
Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。
Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲
我设置:
query_cache_size = 32M
query_cache_type= 1
得到如下状态值:
Qcache queries in cache 12737 表明目前缓存的条数
Qcache inserts 20649006
Qcache hits 79060095 看来重复查询率还挺高的
Qcache lowmem prunes 617913 有这么多次出现缓存过低的情况
Qcache not cached 189896
Qcache free memory 18573912 目前剩余缓存空间
Qcache free blocks 5328 这个数字似乎有点大 碎片不少
Qcache total blocks 30953
如果内存允许32M应该要往上加点
table_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
对于有1G内存的机器,推荐值是128-256。
笔者设置table_cache = 256
得到以下状态:
Open tables 256
Opened tables 9046
虽然open_tables已经等于table_cache,但是相对于服务器运行时间来说,已经运行了20天,opened_tables的值也非常低。因此,增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache。
如果你不需要记录2进制log 就把这个功能关掉,注意关掉以后就不能恢复出问题前的数据了,需要您手动备份,二进制日志包含所有更新数据的语句,其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。另外,如果做同步复制( Replication )的话,也需要使用二进制日志传送修改情况。
log_bin指定日志文件,如果不提供文件名,MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引,每次启动服务时,都会重新生成一个新的二进制文件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定记录的数据库;使用binlog-ignore-db可以指定不记录的数据库。注意的是:binlog-do-db和binlog-ignore-db一次只指定一个数据库,指定多个数据库需要多个语句。而且,MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,否则不会起作用。
关掉这个功能只需要在他前面加上#号
#log-bin
开启慢查询日志( slow query log ) 慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过long_query_time的查询,如果需要,还可以记录不使用索引的记录。下面是一个慢查询日志的例子:
开启慢查询日志,需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。
log_slow_queries指定日志文件,如果不提供文件名,MySQL将自己产生缺省文件名。long_query_times指定慢查询的阈值,缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的参数,它指示记录不使用索引的查询。笔者设置long_query_time=10
笔者设置:
sort_buffer_size = 1M
max_connections=120
wait_timeout =120
back_log=100
read_buffer_size = 1M
thread_cache=32
interactive_timeout=120
thread_concurrency = 4
参数说明:
back_log
要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。
max_connections
并发连接数目最大,120 超过这个值就会自动恢复,出了问题能自动解决
thread_cache
没找到具体说明,不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的
thread_concurrency
#设置为你的cpu数目x2,例如,只有一个cpu,那么thread_concurrency=2
#有2个cpu,那么thread_concurrency=4
skip-innodb
#去掉innodb支持
代码:
# Example MySQL config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
# other programs (such as a web server)
#
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /var/lib/mysql) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
#socket = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
#socket = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 1M
net_buffer_length = 16K
myisam_sort_buffer_size = 1M
max_connections=120
#addnew config
wait_timeout =120
back_log=100
read_buffer_size = 1M
thread_cache=32
skip-innodb
skip-bdb
skip-name-resolve
join_buffer_size=512k
query_cache_size = 32M
interactive_timeout=120
long_query_time=10
log_slow_queries= /usr/local/mysql4/logs/slow_query.log
query_cache_type= 1
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 4
#end new config
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
# Replication Master Server (default)
# binary logging is required for replication
#log-bin
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1
# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
# the syntax is:
#
# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,
# MASTER_USER=, MASTER_PASSWORD= ;
#
# where you replace , , by quoted strings and
# by the master's port number (3306 by default).
#
# Example:
#
# CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
# MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
# start replication for the first time (even unsuccessfully, for example
# if you mistyped the password in master-password and the slave fails to
# connect), the slave will create a master.info file, and any later
# change in this file to the variables' values below will be ignored and
# overridden by the content of the master.info file, unless you shutdown
# the slave server, delete master.info and restart the slaver server.
# For that reason, you may want to leave the lines below untouched
# (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id = 2
#
# The replication master for this slave - required
#master-host =
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user =
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port =
#
# binary logging - not required for slaves, but recommended
#log-bin
# Point the following paths to different dedicated disks
#tmpdir = /tmp/
#log-update = /path-to-dedicated-directory/hostname
# Uncomment the following if you are using BDB tables
#bdb_cache_size = 4M
#bdb_max_lock = 10000
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql/
#innodb_log_arch_dir = /var/lib/mysql/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
补充
优化table_cachetable_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。对于有1G内存的机器,推荐值是128-256。
案例1:该案例来自一个不是特别繁忙的服务器table_cache – 512open_tables – 103opened_tables – 1273uptime – 4021421 (measured in seconds)该案例中table_cache似乎设置得太高了。在峰值时间,打开表的数目比table_cache要少得多。
案例2:该案例来自一台开发服务器。table_cache – 64open_tables – 64opened-tables – 431uptime – 1662790 (measured in seconds)虽然open_tables已经等于table_cache,但是相对于服务器运行时间来说,opened_tables的值也非常低。因此,增加table_cache的值应该用处不大。案例3:该案例来自一个upderperforming的服务器table_cache – 64open_tables – 64opened_tables – 22423uptime – 19538该案例中table_cache设置得太低了。虽然运行时间不到6小时,open_tables达到了最大值,opened_tables的值也非常高。这样就需要增加table_cache的值。优化key_buffer_sizekey_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。对于1G内存的机器,如果不使用MyISAM表,推荐值是16M(8-64M)。
案例1:健康状况key_buffer_size – 402649088 (384M)key_read_requests – 597579931key_reads - 56188案例2:警报状态key_buffer_size – 16777216 (16M)key_read_requests – 597579931key_reads - 53832731案例1中比例低于1:10000,是健康的情况;案例2中比例达到1:11,警报已经拉响。
取自"http://kb.discuz.com/index.php?title=MySQL%E4%BC%98%E5%8C%96%E7%BB%8F%E9%AA%8C"
[/quote]
[b]php 及其环境的优化[/b]
[quote]可以参考穆亦风写的这篇文章:
[url=http://www.discuz.net/thread-207021-1-3.html]win2000/2003 Discuz生存环境搭建及基础优化 攻略[/url][/quote]
[b]IIS里的设置[/b]
[quote]
我的建议是:只设置一个空闲后关闭进程。其他的不要做任何自动回收进程的设置,这样可以避免很多不必要的错误。
如:
事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到。
PHP has encountered an Access Violation
为应用程序池 'XX' 提供服务的进程关闭时间超过了限制。进程 ID 是 '2808'。
等等这些经典的错误都是因为不正常的回收进程造成的。说实在的设置几个小时回收,内存占用多少后回收等等不能起到任何实质性的作用,只能带来麻烦和错误。就像我上面说的,卡的时候占用内存上升,如果你设置了占用多少内存回收进程,那么iis会自动重新建立一个新的进程,内存消耗量接着持续上升,论坛还是不会动,情况不会有任何改观。
如果有些时候真的需要回收进场了,我们可以去手工回收一下!
[attach]265106[/attach][attach]265107[/attach]
[/quote]
[b]论坛设置的优化[/b]
[quote]
这是dz产品说明书中的优化说明,关键是我们在设置的时候尽量少启用斜体字选项,因为这些都是会加重服务器负担的选项。
如何优化我的 Discuz! 让它运行更快?
由于 Discuz! 是使用数据库的应用程序,因此数据库的大小,也就是贴子数目,会员数目等直接影响到各项检索的速度。但您尽可以放心, D iscuz! 经过特别的耐高压设计,确保在任何时候都可以比功能或级别相近的其他产品容纳更多的文章和在线人数是我们始终追求的目标。除去贴子和在线人数的因素,您可以尝试从以下几个方面入手优化 Discuz! :
1.在系统设置中常规选项打开页面Gzip 压缩,在支持 Gzip 压缩的 PHP 系统上可以提高页面打开速度数倍;
2.将 config.inc.php 中 $tplrefresh 的值置 0 或调大(最大为 9)。这是个专家参数,关系到模板刷新的时间检查,如果您不完全了解原理,切勿修改;
3.定期优化数据表, 如每周或每三天;
4.选择装有 Zend Optimizer 的空间商, Zend Optimizer是免费软件,可以在一定程度上提高PHP代码的运行速度;
5.选择装有Zend Perf ormance Suite 的空间商(很少见),Zend Performance Suite 是商业软件,由于Discuz! 是代码与数据库并 重的论坛产品,该软件可以极为巨大的提高 Discuz! 的运行效率。
下面列出几个可能会影响 Discuz! 效率的功能,如果不必要,您可以在系统设置中将其关闭:
1。论坛统计功能;
2。贴子列表显示加点的图标;
3。过多的 Smilies 或词语过滤;
注意: 鉴于Discuz! 特别设计的体系结构,可能会和其他论坛产品有所不同,没有列出来的其他功能,作者都认为打开与关闭不会对程序效率产生大的影响,您可放心的使用。除了上述功能以外,建议您不要设置过多的"用户组","词语过滤"和"Smilies代码",因为过多的设置会导致检索和替换的过程变得缓慢。当然,如果您的设置内容数目在默认(初始安装)数目的 2 倍以内,都被认为是较合理的范围,不会耗费过多时间。
[/quote]
作了很多软件的测试和优化后,情况看起来有所改善。可并没有从此逃出卡的命运,问题依然存在并且严重!
[[i] 本帖最后由 寅生 于 2007-4-3 14:20 编辑 [/i]] 问题到这里很多人都开始迷茫了(包括我)。
硬件配置没有问题,两条百M光纤接入。软件环境作了最大的优化。论坛还是卡,
难道是discuz论坛程序的问题,那人家很多用dz论坛人流量很大的怎么没有问题?
操作体统的问题?服务器中毒了?但都一一排除了
软件环境没问题,硬件环境没问题,论坛程序没有问题。那问题出在那里了呢?
可以分析一下:
第一、在卡的时候论坛程序的执行时间变的很长甚至超时,数据库请求次数却没有变。
而且出现的错误是
[quote]Fatal error: Maximum execution time of 60 seconds exceeded in D:\www\web\include\db_mysql.class.php on line 65[/quote]
看一下这个65行
[quote] function query($sql, $type = '') {
global $debug, $discuz_starttime, $sqldebug;
$func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query') ?
'mysql_unbuffered_query' : 'mysql_query';
[color=Red]if(!($query = $func($sql)) && $type != 'SILENT') {[/color]
$this->halt('MySQL Query Error', $sql);
}
$this->querynum++;
return $query;
}[/quote]
执行的就是数据库查询。
下面我们再看一下这篇文章
[color=Blue]PHPer为什么被认为是草根?[/color]
[url]http://www.phpchina.com/?1/action_viewspace_itemid_2520.html[/url]
我截取中间的一段,大家看看,但并没有断章取义的意思啊
[quote]这种情况下,PHPer就成为了数据库使用者,他总是在操作数据库。而不是在做程序。一个最简单的PHP脚本就是,连接数据库,把数据取出来,然后用命令输出到浏览器。[/quote]
这里我们不是讨论phper是不是草根,而是我们看到了一个问题,就是数据库的查询时间是保证php论坛“飞速”运行的基础。因为php总是在操作数据库,特别是论坛这种交互性很强的系统。
然后我又返回头想了一个问题就是我的mysql数据库运行在硬盘分区上,还是独立的硬盘,这个硬盘是什么硬盘?想到这里我就在DZ官方作了一个调查:
[color=Blue]调查一下,大家的服务器用的什么硬盘?论坛和数据库是怎么放置的?[/color]
[url]http://www.discuz.net/viewthread.php?tid=470199&highlight=%2B%D2%FA%C9%FA[/url]
可遗憾的是当时这个调查并没有引起人们的重视,但从这为数不多的投票中我们已经可以看出问题,很多人跟我的情况一样:
[color=Red]普通,同一服务器同一硬盘不同分区[/color]
这种情况下,随着信息量和人流量的增加,i/o读写对数据库的操作绝对是一个瓶颈。如果在这种情况下你的论坛还没有出现卡的情况,说明你的人流量和信息量还没有达到这个瓶颈的限制。记得当时我在苦找原因的时候,有人就说他们的根本就没有这种情况,论坛飞快。然后我问他多少人在线,他说20。我当时就晕倒。
[[i] 本帖最后由 寅生 于 2007-4-3 14:56 编辑 [/i]] 根据以上的举证、分析,以及我实践的结果我们就可以得出结论:
[quote][color=Blue]论坛卡的解决之道,首先保证你的软件环境没有问题,版本的搭配,以及各方面的优化。如果软件方面确定没有问题,就需要考虑数据库运行的硬件环境的i/o瓶颈。而且在数据量和人流量不是“巨大”的时期这个瓶颈主要集中在硬盘上。
改善的方法就是为数据库单独弄一块硬盘,而且读写能力要高一些的硬盘,比如如果是ide或者串口硬盘的话,用缓存大一些的,是scsi硬盘的话更好,要是独立的数据库服务器最好!可以根据自己的情况而定。[/color][/quote]
如果你的服务器做了这些还卡的话,可以发帖来这里讨论一下!(^#@$%^
[[i] 本帖最后由 寅生 于 2007-4-3 15:15 编辑 [/i]] 不懂不懂。学习学习!呵呵呵! 晕,查看了400多次没人讨论。
是不是看完之后问题都解决了?嘿嘿 谢谢楼布,我正需要这个! 飘过
记号一下
还没遇过这个问题
2.将 config.inc.
2.将 config.inc.php 中 $tplrefresh 的值置 0 或调大(最大为 9)。这是个专家参数,关系到模板刷新的时间检查,如果您不完全了解原理,切勿修改;3.定期优化数据表, 如每周或每三天;
4.选择装有 Zend Optimizer 的空间商, Zend Optimizer是免费软件,可以在一定程度上提高PHP代码的运行速度;
5.选择装有Zend Perf ormance Suite 的空间商(很少见),Zend Performance Suite 是商业软件,由于Discuz! 是代码与数据库并 重的论坛产品,该软件可 还要努力学习啊,估计短期内弄不出来那么大的论坛 但我想问
论坛出现卡的时候,大约是多少人在线?
Mysql的数据库那时候大概多少G?
因为最近我自己也要做论坛,正好有2个硬盘。所以就问一下,希望你能回复这个菜鸟问题啊,这样对我怎么分区就有指导意义了。 当时大概500个在线用户,数据库不到1G。
但是当时的mssql数据库也在那个硬盘上 啊? 才这么点就不行了啊?看来不是自己做过还真不知道啊。
[[i] 本帖最后由 ideochina 于 2007-6-15 14:51 编辑 [/i]] 是啊,当时我也是非常郁闷!而且有很多人现在还在郁闷,经常还有人在问我这个问题 对了,问一下,你os系统盘用了多少G 用了20G,主要是考虑windows的升级和iis日至文件 我用的是集成环境#kt..jcwcn.com@ ipb论坛程序 现在感觉良好~ 出现了跟LZ一样的问题,解决方法就只能加个好的数据库硬盘吗? 我也是同样问题,具体可以看这个帖子:[url]http://www.discuz.net/thread-878494-1-1.html[/url]
我是初学者
版主做论坛租用空间后,需用安装那些软件啊。 看不懂呀?(^#@$ #@#$#%$ 很好很强大 支持 还要努力学习啊, 快乐学习,值得收藏页:
[1]
