使用worker后,系统消耗剧增许多。

使用worker后,系统消耗剧增许多。

诸位大侠,我对apache不太熟,遇到了一个问题,这里向诸位大侠请教。
案例是一个高峰时四五百人在线的论坛。
硬件环境:CPU Intel(R) Xeon(TM) CPU 2.80GHz ,内存2G
软件环境,内核 2.6.15-dcc-smp
之前使用的apache是系统自带的,prefork,load average一般都在1以下,甚至很多时候在0.4以下,CPU占用率通常超不过20%,大多数时候都是10%以下。
编译进核内的有:

[Copy to clipboard] [ - ]
CODE:
Compiled in modules:
  core.c
  mod_access.c
  mod_auth.c
  mod_log_config.c
  mod_logio.c
  mod_env.c
  mod_setenvif.c
  prefork.c
  http_core.c
  mod_mime.c
  mod_status.c
  mod_autoindex.c
  mod_negotiation.c
  mod_dir.c
  mod_alias.c
  mod_so.c

动态加载的模块有:

[Copy to clipboard] [ - ]
CODE:
auth_pam.load     dav_fs.load      layout.load  php4.conf     userdir.load
auth_shadow.load  dav.load         ntlm.load    php4.load
cgi.load          file_cache.load  perl.conf    rewrite.load
dav_fs.conf       include.load     perl.load    userdir.conf

prefork相关配置是:

[Copy to clipboard] [ - ]
CODE:
<IfModule prefork.c>
StartServers 20
MinSpareServers 20
MaxSpareServers 100
ServerLimit 1000
#MaxClients 300
MaxClients 400
MaxRequestsPerChild 0
</IfModule>

因为要用的某些模块没法加进来,所以我另外编译了一个apache,在这里看到prefork和worker的介绍,就决定使用worker。
但是今天换用后,发现系统消耗比从前用prefork高了很多, load average:绝大多数时候都在1以上,刚才我甚至看到 load average:到了19,吓我一跳。
而CPU资源的消耗也比用prefork时多了很多,大多数时候都是30%,最多到50%,内存消耗倒是没变化。
我知道CPU和内存买回来就是要用的,但是现在论坛人数没有增加,换用worker系统消耗就忽然多了这么多,我觉得很奇怪。
另外,我担心如果人数再增加,或者上别的应用,系统会吃不消。

目前用top看到的情况是:

[Copy to clipboard] [ - ]
CODE:
top - 21:38:04 up 72 days, 12:39,  1 user,  load average: 1.31, 1.25, 1.51
Tasks:  79 total,   3 running,  76 sleeping,   0 stopped,   0 zombie
Cpu(s): 45.4% us,  4.5% sy,  0.0% ni, 48.9% id,  0.2% wa,  0.0% hi,  1.0% si
Mem:   2073532k total,  2016800k used,    56732k free,    42984k buffers
Swap:  3108856k total,     1516k used,  3107340k free,  1302328k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
  7850 www-data  16   0  511m  86m 4396 S 37.6  4.3  10:19.14 httpd               
  6402 www-data  18   0  508m  80m 4524 S 23.0  4.0  63:47.19 httpd               
  7966 www-data  17   0  507m  80m 4240 S 12.3  4.0   9:56.60 httpd               
  8022 www-data  17   0  514m  86m 4400 S 11.3  4.3   9:07.98 httpd               
  6371 www-data  17   0  511m  82m 4568 S  7.7  4.1  63:32.37 httpd   

httpd内核情况:

[Copy to clipboard] [ - ]
CODE:
# ./httpd -l
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c

模块,好像多了一点,但似乎也没法减少:

[Copy to clipboard] [ - ]
CODE:
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule include_module modules/mod_include.so
LoadModule filter_module modules/mod_filter.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module        modules/libphp5.so
LoadModule limitipconn_module modules/mod_limitipconn.so

mpm的设置

[Copy to clipboard] [ - ]
CODE:
<IfModule mpm_worker_module>
    StartServers          3
    MaxClients          1500
    MinSpareThreads      25
    MaxSpareThreads      200
    ServerLimit         40
    ThreadLimit         200
    ThreadsPerChild      50
    MaxRequestsPerChild   0
</IfModule>

请诸位大侠帮我分析一下问题出在哪里。
多谢指点。

worker模式使用的进程少,perfork模式进程多一些,你要把他们全部一起对比。

不过php在worker模式并不是所推荐的。
多谢HonestQiao回贴。
但是200多个prefork httpd加一起消耗的cpu资源,也没有4个worker httpd消耗的多,而且是差很多。
我觉得,不该这样啊,负载并没有增加。
我是比较担心如果负载增加,系统就吃不消。

php使用的是5.1.6。
max client一个是400,一个是1500,在400的时候是不是你已经拒绝掉许多流量从而性能看起来就比较好呢?
多谢您的回复,我把MaxClients改到400以后,情况没有变化。
StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild  2000
你按上面的worker配置试一下,这个一个双xeon 3.0 ht 6Gram 机子的配置,ip 3万/天
apache说明里说到过使用worker会影响负载
另外我通过ab测试发现 worker模式没有perfork的效率好,最近也在犹豫是不是转回perfork.希望可以多多交流相关信息。

最后希望HonestQiao兄可以针对“不过php在worker模式并不是所推荐的。” 这个多说两句。谢
WORK是线程模式,对于线程不安全的模块,不建议使用WORK方式,看使用的情况用ps -axfm


QUOTE:
原帖由 乔苏 于 2006-12-3 19:04 发表
StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild  2000
你按上面的worker配置试一下 ...

“不过php在worker模式并不是所推荐的。”如果使用worker模式就要加Zend,因此PHP不建议使用worker模式
LZ:要把ServerLimit和ThreadLimit放在最前面,想这样    :
<IfModule worker.c>
ServerLimit         20
ThreadLimit         200
StartServers        10
MaxClients          1800
MinSpareThreads     75
MaxSpareThreads     200
ThreadsPerChild     150
MaxRequestsPerChild  0
</IfModule>
以上是我的配置,top如下:
13:52:39  up 12 days, 23:31,  1 user,  load average: 0.64, 0.64, 0.55
492 processes: 487 sleeping, 5 running, 0 zombie, 0 stopped
CPU states:  cpu    user    nice  system    irq  softirq  iowait    idle
           total   28.6%    0.0%    3.2%   0.1%     0.5%    0.0%   67.2%
           cpu00   27.0%    0.0%    3.3%   0.3%     0.9%    0.0%   68.1%
           cpu01   30.2%    0.0%    3.1%   0.0%     0.1%    0.0%   66.4%
Mem:  1024628k av,  912932k used,  111696k free,       0k shrd,   85172k buff
                    503584k actv,  182920k in_d,   14676k in_c
Swap: 1534196k av,   92064k used, 1442132k free                  427336k cached

机器配置1Gram
cpu   2.8志强
就我的经验如果按楼上的把
StartServers        10
MaxClients          1800
这些值设的比较高,访问量比较高的主机负载会很高。当遇到访问量突然加大(或攻击)的情况,就会拖垮主机。
不知道我说的对不对。
另外谢谢7,8楼的解释,我在apache2的手册里也找到了类似的话,看来网上流传的“worker”学说真是害人不浅。