适用场景
调优要按负载类型来,别抄网上的「万能参数」。数据库、Web、消息队列关注点完全不同。正确做法是:先量化瓶颈,再改一到两个参数,改完复测,能回滚。
配置步骤(ulimit 与 IO 调度)
# 1) IO 调度器
for d in /sys/block/sd*/queue/scheduler; do echo "$d: $(cat $d)"; done
# SSD/NVMe 建议 none 或 mq-deadline;数据库盘不要用 bfq
# 2) 队列深度与预读
cat /sys/block/sda/queue/nr_requests
cat /sys/block/sda/queue/read_ahead_kb
# 3) 进程级 IO 权重(cgroup v2 示例思路)
# systemd 服务:IOWeight=100(范围 1-10000,越大权重越高)
# 用于把备份任务与业务隔离
# 4) 确认限流是否生效
iostat -x 1 3
systemd-cgtop -m
# 5) 持久化:写进 udev 规则或启动脚本
关键参数与建议
- 先测再调:用基线数据(CPU/内存/IO/网络)确认瓶颈在哪一层
- 一次一改:一次只改少量参数,改完复测,保留回退路径
- sysctl 基线:连接跟踪、文件句柄、TCP 队列、内存回收策略按业务调
- 文件系统:数据库用 XFS 或 ext4 按厂商建议,挂载参数不要乱加 noatime
- inode 治理:小文件多的目录要单独监控 inode,磁盘没满也可能写不进去
- 磁盘水位:数据盘 75% 预警,日志盘 80% 预警
- IO 调度:SSD/NVMe 用 none/mq-deadline,机械盘按场景选择
- 记录:调优参数写进配置管理,别只在内存里生效(重启就丢)
容易踩的坑
- 备份任务与数据库共享磁盘且不限制权重,业务被拖慢
- 用 ionice 以为能限住,实际被 cgroup 覆盖
- 调度器在机械盘上选 none,吞吐反而下降
- 预读过小导致顺序读性能差
- 改了调度器没持久化,重启后还原
- 只看平均 IO,没看 P99 时延
验证与巡检
for d in /sys/block/sd*/queue/scheduler; do echo "$d -> $(cat $d)"; done
systemd-cgtop -m | head
iostat -x 1 5 | awk '/sd/{print $1, $10, $22}'
- 巡检:调度器符合硬件、备份与业务隔离、时延无异常、参数已持久化
小结
调优验收:每个改动的参数都有基线数据、有效果对比、可回滚方式,并且写进了配置管理。拍脑袋改参数等于埋雷。
> 说明:文中命令为通用写法,不同型号/版本可能略有差异,落地前请对照设备实际版本的官方文档;带外管理与安全设备变更建议先在测试设备验证。