为什么会有工作模式?
更高效率的支持不同的平台;能更好的为有特殊要求的站点定制。
例如,要求 更高伸缩性的站点可以选择使用线程的 MPM,即 worker
或 event
; 需要可靠性或者与旧软件兼容的站点可以使用 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
##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整数倍 )