- 前言
谈到Apache,必然会谈到Apache的两种工作模式:prefork模式和worker模式。
- prefork模式
prefork模式
是使用进程来处理请求,每个子进程在某个确定的时间只能维持一个连接。下面看看httpd.conf
的prefork配置。
<IfModule prefork.c>
StartServers 5 #预创建子进程
MinSpareServers 5 #空闲子进程最小值
MaxSpareServers 10 #空闲子进程最大值
ServerLimit 10000 #子进程最大数量
MaxClients 10000 #同一时间接入请求的最大数量
MaxRequestsPerChild 10000 #单个子进程处理请求的最大数量
</IfModule>
说明:
- 当Apache启动时,Apache会自动创建StartServers个子进程,并且尽力将空闲子进程数保持在MinSpareServers和MaxSpareServers之间。
- 如果空闲子进程小于MinSpareServers,Apache将会以大约每秒1个的速度新建子进程。
- 如果空闲子进程大于MaxSpareServers,Apache将会删除多余的空闲子进程,释放服务器资源。
- ServerLimit表示同一时间子进程并存的最大数量。
- MaxClients表示同一时间接入请求的最大数量。
- MaxRequestsPerChild表示每个子进程在处理了多少次请求之后自动销毁,这个参数可以设置为0表示无限(即不销毁进程)。
- worker模式
worker模式
是使用线程来处理请求。每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接。下面看看httpd.conf
的worker配置。
<IfModule worker.c>
ServerLimit 25 #子进程最大数量
ThreadLimit 200 #单个子进程拥有线程的最大数量
StartServers 3 #预创建子进程
MaxClients 600 #同一时间接入请求的最大数量
MinSpareThreads 50 #单个子进程空闲线程最小值
MaxSpareThreads 100 #单个子进程空闲线程最大值
ThreadsPerChild 100 #单个子进程建立的常驻的执行线程数,默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
MaxRequestsPerChild 10000 #单个子进程处理请求的最大数量
</IfModule>
说明:
- ThreadLimit表示单个子进程拥有线程的最大数量。
- MinSpareThreads表示单个子进程空闲线程最小值。
- MaxSpareThreads表示单个子进程空闲线程最大值。
- ThreadsPerChild表示单个子进程建立的常驻的执行线程数,默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
- prefork模式和worker模式的对比
prefork模式
基于进程的,无需内存管理,一般情况下内存的使用较大,适用于请求并发量不大的情景;
work模式
基于线程的,处理高并发的请求较prefork模式具有优势。但线程共享内存空间,每个线程要确保是安全的。假如一个线程崩溃,整个进程就会连同其他线程一起”死掉”。.
- 总结
读完本文我们大致能了解prefork模式和worker模式的参数配置,以及他们之间的区别。
最后送一个彩蛋
, ServerLimit和MaxClients有什么关系,这个值怎么设置?
ServerLimit是同一时间最大的进程数,MaxClients是同一时间最大的请求并发,所以他们的关系是MaxClients = ServerLimit * 单个进程的线程数
。
- 参考
[1] apache工作模式
http://www.cnblogs.com/moqiang02/p/4061421.html
[2] apache中MaxClients与MaxRequestsPerChild
https://www.cnblogs.com/dantes91/articles/4671048.html