資料庫效能不僅取決於 SQL 優化與索引設計,底層硬體與作業系統調校同樣關鍵。本文系統整理 CPU 性能模式、NUMA 架構、Swappiness、檔案系統掛載參數、I/O 排程器、RAID 卡設定、FlashCache 部署與 InnoDB 參數調優,構建從鐵到軟的完整優化知識體系。
| MySQL 版本 | 最大可用核心數 |
|---|---|
| 5.1 | 4 核 |
| 5.5 | 24 核 |
| 5.6+ | 64 核 |
核心原則:一條 Query 對應一個邏輯 CPU。核心數不足會導致並發查詢排隊,核心數過多則上下文切換開銷增大。
現代 Intel CPU(如 E5-2620)支援節能模式,閒置時自動降頻(如 2.0GHz 降至 1.2GHz),省電但嚴重影響 MySQL 突發效能。
# 查看實際頻率
cat /proc/cpuinfo | grep "cpu MHz"
解決方案(三選一即可):
cpupower,設定 performance 模式:
yum install kernel-tools -y
cpupower frequency-set -g performance
intel_pstate=disable 關閉 p-state 驅動,改用 acpi-cpufreq。MySQL 啟動時若被排程到某 NUMA 節點,記憶體分配傾向該節點。當本地記憶體耗盡,Linux 會觸發 Swap 而非跨節點分配,導致效能崩塌。
numactl --interleave=all mysqld &
# 編輯 /etc/default/grub
GRUB_CMDLINE_LINUX="... numa=off"
update-grub && reboot
同時建議設定 vm.zone_reclaim_mode=0(/etc/sysctl.conf),避免區域記憶體回收觸發 Swap。
0:極力避免 Swap,優先回收 Page Cache。100:積極將 Inactive 頁面換出。InnoDB 自管理 Buffer Pool,OS 將其視為 Inactive 記憶體並錯誤 Swap 出去,會造成大量 CPU/IO 浪費。
echo "vm.swappiness = 0" >> /etc/sysctl.conf
sysctl -p
注意:vm.swappiness=0 不代表完全禁用 Swap(需 swapoff -a),但能最大程度保護 InnoDB 記憶體。
| 參數 | 效果 | 適用場景 |
|---|---|---|
noatime | 停用 Access Time 更新,減少元資料寫入 | 所有 DB 資料盤 |
nobarrier / barrier=0 | 關閉 Write Barrier,依賴 RAID 卡電池/快閃掉電保護 | 有 BBWC/FBWC 的 RAID 卡、NVMe SSD |
# /etc/fstab 範例
/dev/sdb1 /data ext4 defaults,noatime,nobarrier 0 0
即時切換:
echo deadline > /sys/block/sda/queue/scheduler
永久生效(Kernel 參數):
# /etc/default/grub
GRUB_CMDLINE_LINUX="... elevator=deadline"
# 減少預讀(預設 128KB → 16KB)
echo 16 > /sys/block/sdb/queue/read_ahead_kb
# 增大請求佇列(預設 128 → 512)
echo 512 > /sys/block/sdb/queue/nr_requests
| 設定項 | 建議值 | 理由 |
|---|---|---|
| 讀取快取 | 關閉 | RAID 快取容量有限,Direct 讀取避免污染 |
| 預讀 | 關閉 | 隨機 IO 無提升,佔用快取 |
| 磁碟快取 | 關閉 | RAID 卡通常預設關閉,確保資料安全 |
| BBWC/FBWC | 開啟 Write Back | 寫入快取提升巨大,電池/快閃保護資料不丟失 |
電池學習週期:約 90 天充放電一次,電量低會自動降級為 Write Through(效能驟降)。
應對策略:
Force Write Back(風險:掉電丟資料,需權衡)。# 建立 FlashCache,block size 4K 對齊 InnoDB page size
flashcache_create -b 4k cachedev /dev/sdc /dev/sdb
# /dev/sdc = SSD,/dev/sdb = HDD
flashcache.fast_remove = 1 # 關機不回寫髒塊,加速關機
flashcache.reclaim_policy = 1 # LRU 淘汰策略(0=FIFO)
flashcache.dirty_thresh_pct = 90 # 髒塊閾值 90%
flashcache.cache_all = 1 # 快取所有內容,可用黑名單過濾
flashcache.write_merge = 1 # 開啟寫入合併,提升寫效能
| 參數 | FusionIO/NVMe | SAS HDD | 說明 |
|---|---|---|---|
innodb_page_size | 4K | 8K/16K | 小頁面提升快取命中率,全表掃描多可用 16K |
innodb_adaptive_checkpoint | 3 (0.1s 刷新) | 2 (估算刷新) | 快閃可高頻刷新 |
innodb_io_capacity | 10000+ | 200-500 | 對應實際 IOPS 能力 |
innodb_flush_neighbor_pages | 0 (關閉) | 1 (開啟) | SSD 隨機 IO 強,無需合併鄰近頁 |
innodb_flush_method | ALL_O_DIRECT | O_DIRECT | Percona 支援 log+data 直寫 |
innodb_read_io_threads | 1 | 4-8 | 線性預讀效果有限 |
innodb_write_io_threads | 16 | 8-16 | 提升寫入並行度 |
innodb_fast_checksum | 1 | 1 | 開啟快速校驗 |
numactl --interleave=all 啟動vm.swappiness = 0noatime,nobarrier,I/O 排程器 deadline硬體優化是資料庫效能的地基。沒有穩固的地基,上層 SQL 調優終究是無本之木。建議將上述清單納入標準化交付流程,每台新上線 DB 伺服器必過「硬體體檢」再投入生產。