作業系統層面的調優往往被忽視,實則對 MySQL 效能影響深遠。本文系統整理五大核心調優面向:I/O 排程器、檔案描述符、NUMA 架構、Swappiness 策略、檔案系統掛載參數,並提供永久生效的配置範例。
Linux 預設 CFQ 排程器適合一般桌面環境,資料庫負載建議改為 deadline(機械硬碟)或 noop(SSD/NVMe)。
echo "deadline" > /sys/block/sda/queue/scheduler
註:sda 請替換為實際資料盤裝置名(如 nvme0n1)。
編輯 /etc/grub.conf(或 /etc/default/grub),在 kernel 行追加:
elevator=deadline
執行 grub2-mkconfig -o /boot/grub2/grub.cfg 並重啟。驗證:cat /sys/block/sda/queue/scheduler。
高併發場景下預設 1024 遠遠不足,建議調整至 65535 或更高。
* hard nofile 65535 * soft nofile 65535 * hard nproc 65535 * soft nproc 65535
確認 /etc/pam.d/login 包含:
session required /lib64/security/pam_limits.so
重啟系統後以 ulimit -a 驗證。
NUMA 架構下 MySQL 可能出現「記憶體局部性失衡」導致 Swap 暴增。建議在 Grub 關閉 NUMA:
numa=off
或在 mysqld_safe 啟動腳本啟用 numactl --interleave=all 讓記憶體跨節點均勻分配(新版腳本內建支援)。
vm.swappiness 控制積極交換匿名頁面到 Swap 的傾向(0~100,預設 60)。
echo "vm.swappiness = 1" >> /etc/sysctl.conf sysctl -p
觀察 inactive 記憶體:vmstat -a 1。
/dev/sda3 /data xfs defaults,noatime,nodiratime,nobarrier 0 0
noatime / nodiratime:關閉存取時間更新,減少元資料寫入。nobarrier(XFS)或 barrier=0(ext4):關閉寫入屏障,**前提是 RAID 卡擁有 BBU(電池備援單元)或 NVMe 控制器具備斷電保護**,否則掉電可能導致資料損壞。驗證:cat /proc/mounts | grep data。
| 項目 | 建議值 | 生效方式 |
|---|---|---|
| I/O Scheduler | deadline (HDD) / noop (SSD/NVMe) | Grub elevator 參數 |
| 檔案描述符 | 65535+ | /etc/security/limits.conf + PAM |
| NUMA | off 或 interleave=all | Grub numa=off 或 mysqld_safe |
| Swappiness | 1 | /etc/sysctl.conf |
| 掛載參數 | noatime,nodiratime,nobarrier | /etc/fstab |
調優後務必進行基準測試(sysbench、tpcc-mysql)對比效能提升,並持續監控 iostat -x、vmstat、sar 關鍵指標。