| 設備類型 | 推薦調度器 | 設定方式 |
|---|---|---|
| HDD / SSD (SATA) | deadline / mq-deadline | echo deadline > /sys/block/sda/queue/scheduler (臨時)grub: elevator=deadline (永久) |
| NVMe / PCIe SSD | none (noop) / kyber | 內建多佇列,無需調度器干預 |
驗證:cat /sys/block/sda/queue/scheduler 顯示 [deadline] 表示生效。
# /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 1048576
* hard nproc 1048576
# /etc/pam.d/login (確保 PAM 讀取 limits)
session required pam_limits.so
# systemd 服務覆蓋 (MySQL 8.0+ 常用)
# /etc/systemd/system/mysqld.service.d/limits.conf
[Service]
LimitNOFILE=1048576
LimitNPROC=1048576
驗證:ulimit -n、cat /proc/$(pidof mysqld)/limits
問題:MySQL 進程跨 NUMA 節點分配記憶體導致交換/延遲抖動。
# /etc/default/grub
GRUB_CMDLINE_LINUX="... numa=off"
update-grub && reboot
# /etc/systemd/system/mysqld.service.d/numa.conf
[Service]
ExecStartPre=/bin/bash -c "numactl --interleave=all true || exit 1"
ExecStart=
ExecStart=/usr/bin/numactl --interleave=all /usr/sbin/mysqld $MYSQLD_OPTS
或確認 mysqld_safe 腳本已含 --numa-interleave 邏輯 (官方 5.7+ 已內建)。
# /etc/sysctl.d/99-mysql.conf
vm.swappiness = 1
# 立即生效
sysctl -p /etc/sysctl.d/99-mysql.conf
為何不設 0?** 內核 3.5+/RHEL 7+ 下 swappiness=0 可能觸發 OOM Killer 直接殺掉 mysqld。1 表示「極度傾向保留匿名頁在物理記憶體,僅在極端記憶體壓力才 swap」。
| 文件系統 | 推薦掛載選項 | 說明 |
|---|---|---|
| XFS (推薦) | defaults,noatime,nodiratime,nobarrier | 高並發元數據、大檔案、支援線上擴容 |
| ext4 | defaults,noatime,nodiratime,barrier=0 | 成熟穩定,barrier=0 需 BBU/RAID 卡掉電保護 |
noatime/nodiratime:關閉存取時間更新,大幅減少元數據寫入barrier=0/nobarrier:關閉寫入屏障,**前提是 RAID 卡有電池備援 (BBU) 或 NVMe 原子寫入保證**編輯 /etc/fstab 修改後 mount -o remount /data 或重啟生效。
[mysqld]
# 記憶體
innodb_buffer_pool_size = 物理記憶體 60-75% (專用 DB 服務器)
innodb_buffer_pool_instances = 8 (避免單實例鎖爭用)
# Redo Log
innodb_log_file_size = 1G
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1 (ACID) / 2 (高效能可容忍 1 秒丟失)
# 並發
innodb_thread_concurrency = 0 (自動)
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 20000 (NVMe) / 2000 (SSD) / 200 (HDD)
innodb_io_capacity_max = 2x innodb_io_capacity
# 針對大頁面
large_pages = ON (需 OS 配置 HugeTLB)
cat /sys/block/nvme0n1/queue/scheduler → [none] 或 [kyber]ulimit -n → 1048576numactl --hardware → 顯示 interleaved policysysctl vm.swappiness → 1cat /proc/mounts | grep data → 含 noatime,nodiratime,barrier=0SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool%'; → 符合預期