apache 工作模式

为什么会有工作模式?

更高效率的支持不同的平台;能更好的为有特殊要求的站点定制。

例如,要求 更高伸缩性的站点可以选择使用线程的 MPM,即 workerevent; 需要可靠性或者与旧软件兼容的站点可以使用 prefork

有几种工作模式?

perfork
[默认]
多个子进程方式处理每个请求。
[预派生][占内存大]适合于没有线程安全库,需要避免线程兼容性问题的系统。
用单独的子进程来处理不同的请求,进程之间是彼此独立的,最稳定的MPM之一。
worker
[--with-mpm-worker]
多进程多线程来进行处理请求
多线程:处理海量请求,系统资源的开销小[高流量http服务器];多进程:稳定性
每个进程可以拥有的线程数量是固定的。服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立。每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
event 把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限制,此时Event MPM方式是最有效的。
NetWare NetWare
OS/2 OS/2
WinNT Windows

 

查看工作模式 httpd –l 、apachectl -l
[root@centos1 bin]#Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  worker.c     # 显示哪个就是哪种模式,现在为worker的工作模式

参数解释

# prefork MPM

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>

perfork模式:使用单独的子进程来处理每个请求
# StartServers: 服务启动时建立的server进程数
# MinSpareServers: 空闲server进程的最小数
# MaxSpareServers: 空闲server进程的最大数
# MaxRequestWorkers: 允许启动的最大server进程数
# MaxConnectionsPerChild: 每个server进程在生存期允许伺服的最大请求数

prefork控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足MinSpareServers设置的值为止[预派生]。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能。MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。

_CC______............K...C...C.WK...K.........................C.
...K............................................................
................................................................
................................................................      256个

Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process

Srv :Child Server number - generation

PID:OS process ID

Acc:Number of accesses this connection / this child / this slot

M:Mode of operation

CPU:CPU usage, number of seconds

SS:Seconds since beginning of most recent request

Req:Milliseconds required to process most recent request

Conn:Kilobytes transferred this connection

Child:Megabytes transferred this child

Slot:Total megabytes transferred this slot

# worker MPM
<IfModule mpm_worker_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>

# worker MPM
# StartServers: 服务启动时建立的server进程数
# MinSpareThreads: 空闲的工作线程最小数
# MaxSpareThreads: 空闲的工作线程最大数
# ThreadsPerChild: 每个进程可建立的工作线程数
# MaxRequestWorkers: 最大的工作线程数 ps -ef|grep http|wc -l
# MaxConnectionsPerChild:每个sever进程生存期允许伺服的最大请求数

Worker由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。同样, 为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxRequestWorkers设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。如果MinSpareThreads、MaxSpareThreads相等,MaxSpareThreads为MinSpareThreads+1。MinSpareThreads为主。

prefork、worker模式切换

先在 /usr/sbin 下进行:mv httpd httpd.prefork
                                 mv httpd.worker httpd
然后在 apache2 下,/usr/local/apache2/conf   下的  httpd.conf 增加

<IfModule mpm_worker_module>
    StartServers          2
    MaxClients          150
    MinSpareThreads      30
    MaxSpareThreads      70
    ThreadsPerChild      30
    MaxRequestsPerChild   0
</IfModule>

然后在  /usr/local/apache2/bin   下 执行:httpd –l

查看 server-status,起进程 一个进程下是30个线程。

StartServers          2
    MaxClients          150
    MinSpareThreads      25
    MaxSpareThreads      75
    ThreadsPerChild      25
    MaxRequestsPerChild   0

M requests currently being processed, N idle workers

##2*25, M+N=50

StartServers          3
  MaxClients          150
  MinSpareThreads      75
  MaxSpareThreads      75
  ThreadsPerChild      30
  MaxRequestsPerChild   0

 

##90

  StartServers          3
  MaxClients          150
  MinSpareThreads      75
  MaxSpareThreads      75
  ThreadsPerChild      30
  MaxRequestsPerChild   0

 

##

 

StartServers          2
    MaxClients          150
    MinSpareThreads      60
    MaxSpareThreads      120
    ThreadsPerChild      30
    MaxRequestsPerChild   0

 

2* 30:1busy 59个空闲

minsparethreads为60不够,现在为59个线程。要加个进程,有30个线程 所以后来变成了 90!

##

StartServers          4
    MaxClients          150
    MinSpareThreads      60
    MaxSpareThreads      90
    ThreadsPerChild      30
    MaxRequestsPerChild   0

 

4*30=120

最小的为min60够了

最大的 为max空闲为90,就把多的线程程杀掉【杀进程】(ThreadsPerChild整数倍 )

posted @ 2015-01-08 15:29  hotarubi  阅读(266)  评论(0编辑  收藏  举报