apache本身不控制内存页替换策略,实际由linux内核管理;应通过禁用swap(swappiness=1)、限制maxrequestworkers、启用maxconnectionsperchild、关闭非必要模块等内核与apache协同调优方式,从源头减少内存占用并规避换页。

Apache 本身不直接控制内存页替换策略(即 Linux 内核的 swappiness、页面回收算法、OOM killer 行为等),它无法像数据库或 JVM 那样配置“页置换优先级”或“内存锁定策略”。所谓“Apache 的内存页替换策略”,实际是操作系统内核对 Apache 进程所占内存的管理行为,Apache 只能通过减少自身内存占用、避免触发换页,间接影响这一过程。
真正需要调整的是 Linux 内核层面的内存管理机制,配合 Apache 的资源配置,才能有效降低 Swap 使用、防止因页替换导致的延迟抖动或雪崩。
1. 禁用或大幅降低 Swap 使用(最直接有效)
Web 服务(尤其是 Apache)对延迟敏感,频繁换页会显著拖慢响应。应优先让 Apache 运行在物理内存中:-
查看当前 Swap 状态:
swapon --show free -h
-
临时禁用 Swap(重启后失效):
sudo swapoff -a
-
永久禁用(编辑
/etc/fstab,注释或删除含swap的行)
或设置swappiness=1(非零值保留紧急换页能力,但极低):echo 'vm.swappiness=1' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
⚠️ 注意:禁用 Swap 前务必确保 Apache 配置后的总内存需求 ≤ 可用物理内存(不含缓存),否则可能触发 OOM Killer 杀进程。
2. 让 Apache 主动“少占内存”,从源头规避换页
内核只会在内存紧张时才换页。Apache 占得越少、越稳定,越不容易被换出:-
精确估算单进程内存开销
运行命令获取真实 RSS(常驻内存):ps -U www-data -u www-data o pid,rss,comm --sort=-rss | head -10
取前 5 个
httpd或apache2进程 RSS 均值 × 0.6~0.7,作为“独占内存”保守估值。 -
按公式约束并发上限
设可用物理内存为X MB,单进程独占内存为Y MB,则:MaxRequestWorkers ≤ (X × 0.8) ÷ Y # 预留 20% 给系统和其他服务
在 MPM 配置中硬性设为此值(如
prefork中MaxRequestWorkers 80)。
Apache Superset Dashboard and SQL Exploration Skill下载Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
-
启用进程定期回收
防止内存碎片和缓慢泄漏导致 RSS 持续增长:MaxConnectionsPerChild 1000
(每处理 1000 请求后重启子进程,释放全部内存)
-
关闭非必要模块
每个加载模块都增加内存开销(尤其mod_php、mod_security、mod_lua):sudo a2dismod status info cgi cgid perl python sudo systemctl restart apache2
3. 避免内核误判 Apache 进程为“可换出对象”
Linux 默认对匿名内存(如 Apache 堆内存)更倾向换页。可通过以下方式降低风险:启用
mlockall()(仅限高级场景)
Apache 官方不支持mlock(),但可通过prctl(PR_SET_MM)或启动脚本调用memlock限制(需CAP_IPC_LOCK权限,且不推荐生产环境盲目使用)。-
调整 OOM score(谨慎)
降低 Apache 进程被 OOM Killer 选中的概率(非阻止换页,仅防被杀):echo -500 | sudo tee /proc/$(pgrep apache2 | head -1)/oom_score_adj
或写入 systemd service 文件(
/etc/systemd/system/apache2.service.d/oom.conf):[Service] OOMScoreAdjust=-500
-
确保
vm.overcommit_memory=2(可选)
避免内核因“过度提交”拒绝分配内存,转而换页:echo 'vm.overcommit_memory=2' | sudo tee -a /etc/sysctl.conf echo 'vm.overcommit_ratio=80' | sudo tee -a /etc/sysctl.conf sudo sysctl -p
4. 监控是否真在换页
别依赖猜测——确认问题是否存在:-
实时观察换页活动:
vmstat 1 10 | grep -E "(si|so)" # si=swap-in, so=swap-out;持续 >0 表示活跃换页
-
检查 Apache 进程是否被换出:
cat /proc/$(pgrep apache2 | head -1)/status | grep -E "(MMU|Swap)" # 查看 `Swap:` 字段(单位 KB),>0 表示部分内存已换出
-
日志中搜索关键提示:
dmesg -T | grep -i "out of memory\|killed process\|apache"
不复杂但容易忽略










