Apache 里的 MPM 调优比较

本文详细介绍了Apache的多进程模块(MPM)及其几种类型:prefork、worker和WinNT。重点讲解了它们的工作原理、配置参数及优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、什么是MPM?
Multi-Processing Module (MPM) implements a hybrid multi-process multi-threaded server。(多进程、多线程)

2、有多少种MPM?
大致有:prefork MPM、worker MPM、BeOS MPM、NetWare MPM、OS/2 MPM、WinNT MPM。   

3、怎么知道apache当前用的是哪个MPM?
linux及windows下都可以使用命令:“httpd -l ” 进行查询。

4、各个MPM是怎么工作及如何优化?

(1)prefork MPM
        <IfModule mpm_prefork_module>
            StartServers                10
            MinSpareServers        10
            MaxSpareServers        15
            ServerLimit                  2000
            MaxClients                   1000
            MaxRequestsPerChild 10000
        </IfModule>
        启动时建立StartServers个子进程,
        然后按每秒创建指数级个进程直到达到MinSpareServers个进程(最多增到每秒32个),
        如果空闲进程数大于MaxSpareServers,则检查kill掉一些空闲进程。
        MaxRequestPerChild指定每个进程处理了多少个请求后就自我毁灭。
        MaxClients指定apache最多可以同时处理的请求数,也就是进程数?
        MaxClients默认不能大于256,可以通过设定ServerLimit来增大这个限制数,最大20000?

//默认的MaxClient最大是256个线程,假如想配置更大的值,就的加上ServerLimit这个参数。20000是ServerLimit这个参数的最大值。假如需要更大,则必须编译apache,此前都是无需重新编译Apache。
生效前提:必须放在其他指令的前面
StartServers   5
//指定服务器启动时建立的子进程数量,prefork默认为5。
MinSpareServers   5
//指定空闲子进程的最小数量,默认为5。假如当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
MaxSpareServers   10
//配置空闲子进程的最大数量,默认为10。假如当前有超过MaxSpareServers数量 的空闲子进程,那么父进程将杀死多余的子进程。此参数不要 设的太大。假如您将该指令的值配置为比MinSpareServers小,Apache将会自动将其修改成"MinSpareServers+1"。
MaxClients   256
//限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,您必须同时增大ServerLimit 。
MaxRequestsPerChild 10000
//每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。假如MaxRequestsPerChild为"0",子进程将永远不会结束。
将MaxRequestsPerChild配置成非零值有两个好处:
1.能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
工作方式:
一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的 (spare)或是空闲的子进程 用于迎接即将到来的请求。这样客户端就无需在得到服务前等候子进程的产生。在Unix系统中,父进程通常以root身份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。User和Group指令用于配置子进程的低特权用户。运行子进程的用户必须要对他所服务的内容有 读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。


2)worker:
        <IfModule mpm_worker_module>
            StartServers                  3
            MaxClients                     2000
            ServerLimit                    25
            ThreadLimit                   200
            ThreadsPerChild            100
            MinSpareThreads         50
            MaxSpareThreads        200
            MaxRequestsPerChild   0
        </IfModule>
        启动时建立StartServers个子进程,
        每个进程包含ThreadsPerChild个线程,缺省最大64
        MinSpareThreads定义最小的空闲线程数,最大75
        MaxSpareThreads定义最大的空闲线程数,超过则执行清理?最大250
        MaxClients定义所有子进程中的线程总数
        ThreadLimit,最大20000,默认64
        ServerLimit,最大值20000,默认16
        需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且 MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。

\\大家自己根据机子的配置设定,同时记住公式,不然启动APACHE会报错

注意
对于KeepAlive链接,只有第一个请求会被计数。事实上,它改变了每个子进程限制最大链接数量的行为。

ThreadLimit >= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild 必须是ThreadsPerChild的倍数
MaxSpareThreads >= MinSpareThreads+ThreadsPerChild

 

ServerLimit 16
//服务器允许配置的进程数上限。这个指令和ThreadLimit结合使用设置了MaxClients最大允许配置的数值。任何在重启期间对这个指令的改变都将被忽略,但对MaxClients的修改却会生效。
ThreadLimit 64
//每个子进程可配置的线程数上限。这个指令设置了每个子进程可配置的线程数ThreadsPerChild上限。任何在重启期间对这个指令的改变都将被忽略,但对ThreadsPerChild的修改却会生效。默认值是”64″.
StartServers 3
//服务器启动时建立的子进程数,默认值是”3″。
MinSpareThreads 75
//最小空闲线程数,默认值是”75″。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads 250
//设置最大空闲线程数。默认值是”250″。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太多,子进程将杀死多余的空闲线 程。MaxSpareThreads的取值范围是有限制的。Apache将按照如下限制自动修正你设置的值:worker要求其大于等于 MinSpareThreads加上ThreadsPerChild的和
MaxClients 400
//允许同时伺服的最大接入请求数量(最大线程数量)。任何超过MaxClients限制的请求都将进入等候队列。默认值是”400″ ,16(ServerLimit)乘以25(ThreadsPerChild)的结果。因此要增加MaxClients的时候,你必须同时增加 ServerLimit的值。
ThreadsPerChild 25
//每个子进程建立的常驻的执行线程数。默认值是25。子进程在启动时建立这些线程后就不再建立新的线程了。
MaxRequestsPerChild 0
//设置每个子进程在其生存期内允许伺服的最大请求数量。到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为”0″,子进程将永远不会结束。
将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。


(3)WinNT MPM:
        <IfModule mpm_winnt_module>
            ThreadsPerChild         500
            MaxRequestsPerChild 10000
        </IfModule>
        mpm_winnt.c是专门针对Windows NT优化的MPM(多路处理模块),它使用一个单独的父进程产生一个单独的子进程,在这个子进程中轮流产生多个线程来处理请求。也就是说 mpm_winnt只能启动父子两个进程, 不能像Linux下那样同时启动多个进程。
ThreadLimit,默认1920,最大15000,限制单个进程的线程总数。


<think>嗯,用户询问的是Apache服务器性能的最佳实践。这是一个关于Web服务器性能化的技术问题,需要结合服务器配置、硬件资源和应用场景来综合考虑。 用户可能是一个系统管理员或网站开发者,正在面临Apache服务器性能瓶颈的问题。从问题表述来看,用户需要的是实用、可操作的建议,而不是理论性的说明。 首先需要分析影响Apache性能的关键因素。根据引用资料[2],内存管理是核心问题,服务器交换(swap)会显著增加延迟。引用[5]提到了不同运行模式(prefork/worker/event)的选择策略,这对并发处理能力至关重要。引用[3]则强了动态内容处理的化空间。 考虑从这几个维度构建回答框架:硬件资源配置、运行模式选择、模块化和连接管理。每个部分都需要给出具体可执行的配置建议,比如计算MaxRequestWorkers的公式,这是引用[2]提到的重要方法。 对于动态内容化,准备引用[3]提到的mod_perl案例,但会扩展到更通用的PHP-FPM方案。另外,缓存机制应该单独作为一大类,因为这对性能提升最显著。 注意到引用[5]特别比较了worker和event模式的区别,这个信息很关键。考虑在回答中明确建议新版本Apache先使用event模式,并说明其势。 最后需要提醒性能的步骤:基准测试->整参数->监控->迭代化。这样用户能形成系统化的思路,而不是零散的配置修改。</think>以下是根据Apache官方文档及行业实践总结的性能最佳方案,按先级排序: --- ### **一、核心配置化** 1. **选择合适MPM模式** - **Event MPM**(Apache 2.4+):高并发场景首选,通过异步处理解决Keep-Alive连接占用线程问题[^5] ```apache # httpd.conf <IfModule mpm_event_module> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 # 关键参数:最大并发处理数 MaxConnectionsPerChild 10000 # 避免内存泄漏 </IfModule> ``` - **Worker MPM**(兼容旧模块): ```apache <IfModule mpm_worker_module> ServerLimit 16 StartServers 2 MaxRequestWorkers 150 MinSpareThreads 25 MaxSpareThreads 75 </IfModule> ``` 2. **精准计算`MaxRequestWorkers`** **公式**:`MaxRequestWorkers = (可用内存 - 系统预留) / 单进程内存` - 通过`ps -ylC httpd --sort:rss`获取进程内存(RSS列) - 示例:32GB内存服务器,单进程300MB,预留4GB: `(32-4)*1024/300 ≈ 93` → 建议值`90` --- ### **二、连接与超时控制** ```apache # 缩短KeepAlive超时,减少资源占用 KeepAlive On KeepAliveTimeout 2 # 秒(默认5) MaxKeepAliveRequests 100 # 加快连接回收 Timeout 30 # 请求超时(默认60) ``` --- ### **三、模块精简与静态资源化** 1. **禁用非必要模块** ```bash # 查看已加载模块 httpd -M # 禁用示例 LoadModule auth_basic_module modules/mod_auth_basic.so # ← 注释此行 ``` **建议禁用**:`mod_autoindex`(目录浏览)、`mod_cgi`(改用FastCGI)、`mod_status`(仅试时用) 2. **启用静态缓存** ```apache # 利用mod_expires缓存静态资源 <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpeg "access plus 1 year" ExpiresByType text/css "access plus 1 month" </IfModule> ``` --- ### **四、动态内容加速方案** | 技术 | 适用场景 | 配置要点 | |---------------|-----------------------|-----------------------------------| | **PHP-FPM** | PHP应用 | 使用`proxy_fcgi`替代`mod_php` | | **mod_proxy** | 反向代理Tomcat等 | 关闭KeepAlive避免连接池耗尽 | | **OPcache** | PHP字节码缓存 | 减少脚本编译开销 | ```apache # PHP-FPM配置示例 <FilesMatch "\.php$"> SetHandler "proxy:unix:/run/php-fpm.sock|fcgi://localhost" </FilesMatch> ``` --- ### **五、操作系统级** 1. **内核参数化**(`/etc/sysctl.conf`) ```conf # 增大TCP连接队列 net.core.somaxconn = 65535 # 加快TIME-WAIT回收 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 ``` 2. **文件句柄限制**(`/etc/security/limits.conf`) ```conf apache soft nofile 65535 apache hard nofile 65535 ``` --- ### **六、验证与监控** 1. **压测工具** ```bash ab -n 10000 -c 500 http://yourserver/test.html ``` 2. **实时监控指标** - **内存**:`free -m` → 确保`Swap`使用率为0%[^2] - **连接数**:`ss -s | grep "TCP:"` - **线程状态**:`top -p $(pgrep -d',' httpd)` > ⚠️ **原则**:每次只改一个参数 → 压测对比 → 监控稳定性。推荐使用配置管理工具(如Ansible)记录变更。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值