cgroup v2 + blk-iocost 是限制 apache 动态应用磁盘 i/o 的推荐方式,通过创建 apache-io 控制组、写入进程 pid、配置 io.cost.qos 权重(如 8:0 1 20)实现带宽限速,并辅以 noatime 挂载、ssd 分离存储及 apache 配置优化降低无效 i/o。

Apache 本身不直接控制 PHP、Python 或其他动态应用进程的磁盘 I/O,它只负责接收请求、转发(如通过 mod_php、mod_wsgi、proxy_fcgi)并返回响应。真正的磁盘读写由后端应用进程执行——所以“限制动态应用的磁盘 I/O”,本质是**在操作系统层对 Apache 子进程或其调用的外部应用进程施加 I/O 控制**,而非修改 Apache 配置指令本身。
用 cgroup v2 + blk-iocost 限制 Apache 工作进程的 I/O 带宽
这是目前最精准、生产环境推荐的方式,适用于 Linux 4.19+(如 Debian 12、Alibaba Cloud Linux 3、Ubuntu 22.04+):
- 确认系统使用 cgroup v2:
stat -fc %T /sys/fs/cgroup回显应为cgroup2fs - 创建 Apache 的 I/O 控制组:
sudo mkdir -p /sys/fs/cgroup/apache-io - 将 Apache 主进程(如
apache2或httpd)及其子进程加入该组:echo $(pidof apache2) | sudo tee /sys/fs/cgroup/apache-io/cgroup.procs - 启用 blk-iocost 并设置权重限速(以 NVMe SSD 为例):
echo '8:0 1 100' | sudo tee /sys/fs/cgroup/apache-io/io.cost.qos
其中8:0是根磁盘设备号(用lsblk查),1表示启用,100是相对权重值(数值越小,I/O 越受限;默认为 100,设为 20 即约降为 1/5 带宽) - 持久化:将上述操作写入 systemd service 文件(如
/etc/systemd/system/apache2.service.d/io-limit.conf),并在启动时自动挂载
通过内核级文件系统优化降低无效 I/O
动态应用常频繁 stat()、open() 模板、配置、日志路径,这些调用若落在 HDD 或未优化的文件系统上会放大 I/O 压力:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 挂载时启用
noatime和relatime:sudo mount -o remount,noatime,relatime /,避免每次读取都触发磁盘写入访问时间戳 - 确保动态脚本所在分区使用 XFS 或 ext4(而非老旧 ext3),并启用
dir_index和filetype特性提升目录查找效率 - 把应用临时目录(如 PHP 的
upload_tmp_dir、session.save_path)和日志目录,单独挂载到 SSD 分区,与系统盘隔离
从 Apache 配置侧减少对动态应用的 I/O 触发频率
虽然不直接限速,但能显著降低单位请求数产生的底层磁盘操作次数:
- 禁用
EnableSendfile On(尤其搭配 PHP-FPM 时):sendfile() 在某些内核版本下会与 mmap() 冲突,引发额外 page fault 和磁盘回刷;建议设为Off - 关闭
EnableMMAP Off:防止 Apache 将静态资源 mmap 到内存后,因动态应用修改了同一文件导致内核强制 flush cache 并重读磁盘 - 精简
DirectoryIndex列表(如仅留index.php):避免每次请求目录时顺序检查index.html、index.htm等不存在文件,产生无谓stat()调用 - 用
mod_cache+mod_cache_disk缓存动态响应(需应用输出正确 Cache-Control 头):让重复请求直接走磁盘缓存文件,跳过整个后端执行链
监控与验证是否生效
别依赖平均延迟——盯住 I/O 队列行为:
- 实时看 Apache 进程 I/O 压力:
iotop -P -p $(pgrep apache2 | tr '\n' ',' | sed 's/,$//') - 查 cgroup 实际限速效果:
cat /sys/fs/cgroup/apache-io/io.stat,观察rw=行的 bytes 和 time_ms 是否被压制在预期范围内 - 压力测试时对比
iostat -x 1中的await(平均等待)和svctm(服务时间):若 await 显著 > svctm,说明队列堆积,需调低权重或扩容磁盘










