萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

Linux 下 MySQL 運行環境極致優化:I/O 調度、文件描述符、NUMA、Swappiness、掛載參數全攻略

一、I/O 調度器:deadline/kyber > cfq > noop

設備類型推薦調度器設定方式
HDD / SSD (SATA)deadline / mq-deadlineecho deadline > /sys/block/sda/queue/scheduler (臨時)
grub: elevator=deadline (永久)
NVMe / PCIe SSDnone (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

三、禁用/調優 NUMA (非一致性記憶體存取)

問題:MySQL 進程跨 NUMA 節點分配記憶體導致交換/延遲抖動。

方案 A:內核級關閉 (重啟生效)

# /etc/default/grub
GRUB_CMDLINE_LINUX="... numa=off"
update-grub && reboot

方案 B:進程級交錯分配 (推薦,無需重啟)

# /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+ 已內建)。

四、Swappiness:從 60 → 1 (非 0)

# /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高並發元數據、大檔案、支援線上擴容
ext4defaults,noatime,nodiratime,barrier=0成熟穩定,barrier=0 需 BBU/RAID 卡掉電保護
  • noatime/nodiratime:關閉存取時間更新,大幅減少元數據寫入
  • barrier=0/nobarrier:關閉寫入屏障,**前提是 RAID 卡有電池備援 (BBU) 或 NVMe 原子寫入保證**

編輯 /etc/fstab 修改後 mount -o remount /data 或重啟生效。

六、MySQL 內核參數聯動調優 (my.cnf 關鍵項)

[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)

驗證清單

  1. cat /sys/block/nvme0n1/queue/scheduler → [none] 或 [kyber]
  2. ulimit -n → 1048576
  3. numactl --hardware → 顯示 interleaved policy
  4. sysctl vm.swappiness → 1
  5. cat /proc/mounts | grep data → 含 noatime,nodiratime,barrier=0
  6. SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool%'; → 符合預期
copyright © 萬盛學電腦網 all rights reserved