Apache 高并发之 MPM 调优比较详细

本文详细解析了Apache MPM(Multi-Processing Module)的四种类型:prefork、worker、BeOS、NetWare和OS/2,以及WinNT MPM。介绍了它们的工作机制,包括启动过程、进程与线程的管理、资源限制和优化策略,并特别讨论了prefork、worker MPM的配置参数,如MaxClients、MaxSpareServers等,以实现高效服务器性能。

摘要生成于 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?

(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将会自动调节到一个相应值(可能是个非期望值)。

(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、付费专栏及课程。

余额充值