环境:windows2003系统,dell 1u服务器,phpnow集成环境:apache2.2+php5.2+mysql-5.0

问题:用一段时间后httpd进程会占用过多内存,有时候占1.5G,CPU使用率100%,网站访问提示PHP超时,有时web服务错误,80端口无法访问等。

从网上找到两个解决办法先贴在这里,效果后续写上。

解决方法:

一、优化apache

1、http-mpm.conf设置

Apache 的线程数控制文件为http-mpm.conf,在conf/exrtra目录下面,要使该配置文件起作用需要在httpd.conf中 将 Include conf/extra/httpd-mpm.conf前#去掉,以使得http-mpm.conf生效。

在Windows系统中,起作用的是Winnt mpm段,

ThreadsPerChild      150

MaxRequestsPerChild    0

以上是缺省的配置,一般情况下够用了,但负荷较大的网站就需要修改了,否则访问网站会变慢或没有响应。实际设置中可以根据apache-status查看apache实时连接状态,查看其中线程占用数目情况来进行相应的调整,我的服务器最后设置如下:

ThreadsPerChild    350

ThreadLimit     350

MaxRequestsPerChild    10000

其中ThreadLimit是占用系统线程数限制,修改后会在apache-status中直接看到效果(查看方法),就是对应的最大的可用线程数(如图所示-转载的,不知道图片在哪,大家看自己的status吧)。

MaxRequestsPerChild 是进程的最大的请求数目,既指网站收到请求的缓存数。设置太小了会影响服务器性能,因为会占用较多cpu时间,太大了则会占用内存资源。一般大型的网站文 件个数都是成千上万,所以管理员应该根据网站情况自己设定,只要不为0(无限制)就可以,以防止内存溢出。

ThreadsPerChlid 是Apache进程的子线程数,意思是服务器开了这么多的线程数来等待响应客户端请求。该参数需要根据apache-status实时的监控情况来调节, 太大会导致内存增长过快,直到服务器当机,太小会导致服务器连接队列在高峰期时占满,从而导致网站连接慢。同时我们应该修改另一个配置文件httpd- default.php中的超时设置来配合这个参数。

(这个方法经测试效果不大)

2、httpd-default.conf设置

在httpd.conf中去掉Include conf/extra/httpd-default.conf前的#以使httpd-default.php生效。我们需要调节以下参数:

Timeout 15

该参数为连接超时,缺省的300秒显然太大,缩小该参数就会减少同时连接数,即用户实际占用的线程数,这样就可以起到配合上面ThreadsPerChlid参数的作用。

KeepAlive On

该参数为是否保持活连接,目前网站中一个页面一般会包含多个文件,所以相应用户访问时会有多个请求,因此开启可以提高服务器性能。(有人说keepalive在windows下开了没效果)

MaxKeepAliveRequests 50

该参数为最大的活连接请求数,可以根据网页实际包含的文件数目自行调节。

KeepAliveTimeout 5

该参数为活连接的超时时间,一般只要设置成小于Timeout即可。

这个方法的效果也不大

 

这 样设置后,Apache在响应请求和防止恶意攻击方面就取得较为平衡的效果,当然由于内存回收机制和进程管理不同,Windows下长期运行Apache 还是不如Unix稳定,因此我们可以让Apache在每天凌晨访问人数少时自动重启一次,以回收资源。用Windows自带的计划任务就可以简单的实现。 这样,我们就使Apache在Windows平台下像Unix一样长期稳定的提供服务了。

—————————————————x————————————————–

上面的方法我都试过,效果不是很明显。现在来看看第二篇文章讲的吧。(此处写于2012年8月20日)

 

二、优化mysql

。。开始回头分析再php设计里面有不合理的查询,用下面的方法可以找出慢的mysql查询:修改my.ini文件再重启服务

log-slow-queries slow.log  //windwos下直接写这句,不带路径时候自动生成到 mysql的data目录下

long_query_time  //超过5秒的查询都记录日志(这其实是优化php的,这个开启mysql日制的方法值得备忘一下)

通过这个方式,确实找到了几个慢查询,清理了几个垃圾,效果要好多了,但还是有点慢

在这个快要崩溃的时候,重新看了一下《MySql故障排除》,发现排除故障时还是这种案例解决的最有参考价值,照着做了下(my.ini):

  #取消文件系统的外部锁

   skip-locking

  #不进行域名反解析,注意由此带来的权限/授权问题

  skip-name-resolve

 #索引缓存,根据内存大小而定,如果是独立的db服务器,可以设置高达80%的内存总量

 key_buffer 512M

 #连接排队列表总数

 back_log 200

 max_allowed_packet 2M

 #打开表缓存总数,可以避免频繁的打开数据表产生的开销

 table_cache 512

 #每个线程排序所需的缓冲

 sort_buffer_size 4M

 #每个线程读取索引所需的缓冲

 read_buffer_size 4M

 #MyISAM表发生变化时重新排序所需的缓冲

 myisam_sort_buffer_size 64M

 #缓存可重用的线程数

 thread_cache 128

 #查询结果缓存

 query_cache_size 128M

 #设置超时时间,能避免长连接

 set-variable wait_timeout=60

 

做到查询结果缓存的时候,眼睛一亮,有希望,赶快重启mysql!第一次运行还是花了几秒,可以理解,第二次又花了几秒,有点失落,

再刷了几次,终于快了起来,还是缓存管用啊!而且mysql不愧为速度最快的SQL数据库,这种非事务处理环境确实很强。

 

 

三、自动重启服务器法

就是用widows的计划任务定时经常重启,此方法不推荐。

 

最后,有条件的最好还是在linux下使用apache。windows还是IIS好一些。