data_size + index_size < 0.8 * innodb_buffer_pool_size# /etc/security/limits.conf
mysql soft nofile 65535
mysql hard nofile 65535
mysql soft nproc 65535
mysql hard nproc 65535
# /etc/sysctl.conf
vm.swappiness = 1 # 極力避免 swap
vm.zone_reclaim_mode = 0 # 禁用 NUMA 本地分配
kernel.numa_balancing = 0 # 禁用 NUMA 平衡
# 或啟動時:numactl --interleave=all mysqld
# my.cnf
[mysqld_safe]
malloc-lib = /usr/lib64/libjemalloc.so.2
# 或 tcmalloc
# 驗證:SHOW VARIABLES LIKE 'version_malloc_lib';
減少內存碎片、提升高並發分配效率,Percona/Oracle 官方構建已集成。
datadir、innodb_log_group_home_dir、tmpdir 分別掛載不同物理設備# XFS
/dev/nvme0n1 /data xfs rw,noatime,nodiratime,nobarrier,inode64 0 0
# ext4
/dev/nvme1n1 /logs ext4 rw,noatime,nodiratime,nobarrier,data=ordered 0 0
# SSD 專用
# noatime/nodiratime:關閉訪問時間更新
# nobarrier:RAID 卡有電緩存時安全關閉寫入屏障
# 查看
cat /sys/block/nvme0n1/queue/scheduler
# 設置(臨時)
echo mq-deadline > /sys/block/nvme0n1/queue/scheduler
# 永久(grub cmdline)
elevator=mq-deadline
SSD/NVMe 用 none 或 mq-deadline,機械盤用 deadline。
Redo log、Binlog、Data file 寫入均受益。無電緩存嚴禁 WriteBack。
query_cache_type = 0
query_cache_size = 0
InnoDB Buffer Pool 已緩存數據頁,QC 只緩存結果集,寫入時需失效檢查,反而拖慢寫入。
# Percona / MariaDB / AliSQL / TencentSQL 內建
thread_pool_size = 16 # 組數,通常 = CPU 核心數
thread_pool_oversubscribe = 3 # 每組活躍線程數
# 連接數 > 200 時顯著降低上下文切換、鎖競爭
thread_cache_size = 100 # 避免頻繁創建/銷毀線程
# 每連接只讀緩衝區(按需分配,別設太大)
read_buffer_size = 256K
read_rnd_buffer_size = 512K
sort_buffer_size = 512K
join_buffer_size = 256K
binlog_cache_size = 32K
# 總連接內存 = connections * (上述之和) < 10% 物理內存
innodb_buffer_pool_size = 物理內存 * 0.7
innodb_buffer_pool_instances = 8 # 1GB 一個實例,減少鎖競爭
innodb_buffer_pool_chunk_size = 128M # 擴容粒度
# 監控:Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests < 1%
innodb_log_file_size = 2G # 總大小 4G+ (2 files * 2G)
innodb_log_files_in_group = 2
innodb_flush_log_at_trx_commit = 1 # 最安全,配合組提交性能可接受
# 5.7+ 組提交自動開啟,binlog_group_commit_sync_delay=0 可微調
原則:Redo Log 總大小 > 1 小時寫入量,避免頻繁 checkpoint 刷髒頁。
sync_binlog = 1 # 每次提交刷盤,最安全
binlog_format = ROW # ROW 格式:主從一致性最強,支援並行複製
binlog_row_image = MINIMAL # 只記錄變更列,減小 binlog 體積
binlog_expire_logs_seconds = 604800 # 7 天自動清理
innodb_flush_method = O_DIRECT
innodb_flush_neighbors = 0 # SSD 不需刷鄰近頁
innodb_page_size = 4K # 4K 頁匹配 SSD 4K 物理塊(需實例級設置)
innodb_file_per_table = 1
-- 支持:TRUNCATE 釋放空間、表空間傳輸 (TTS)、單表備份、碎片整理
-- 5.7+ 通用表空間支持多表共享,按業務劃分
# 有 Thread Pool 時
innodb_thread_concurrency = 0 # 0 = 無限制,交給 Thread Pool
# 無 Thread Pool 時
# 5.5: 16-32
# 5.6/5.7: 36-64
# 8.0: 0 (自適應) 或 64-128
# 監控:Innodb_row_lock_waits / Innodb_row_lock_time_avg
transaction_isolation = READ-COMMITTED
binlog_format = ROW # RC 必須 ROW 格式
RC 級別:無 Gap Lock、鎖更少、並發更高、語句級一致性讀(非事務級),適合高並發業務。
代價:不可重複讀、幻讀(應用層接受或補償)。
核心指標體系:
| 維度 | 關鍵指標 | 告警閾值 |
|---|---|---|
| 可用性 | Uptime、連接數、Slave_Running | Down、連接數 > 80% max_connections、Slave_IO/SQL=No |
| 性能 | QPS、TPS、慢查詢數、延遲 P99 | QPS 突變、慢查詢 > 10/min、P99 > 500ms |
| 存儲 | 磁盤使用率、IOPS、IO 延遲、Binlog 增長 | 磁盤 > 80%、IOPS 滿、延遲 > 10ms |
| 內存 | Buffer Pool 命中率、內存使用率、Swap 使用 | 命中率 < 99%、Swap > 0 |
| 複製 | Seconds_Behind_Master、Relay_Log_Space | 延遲 > 30s、Relay Log 暴增 |
| 鎖/事務 | 行鎖等待、死鎖數、活躍事務數、歷史長度 | 死鎖 > 5/min、歷史長度 > 10萬 |
工具棧:Prometheus + mysqld_exporter + Grafana(儀表盤模板:Percona MySQL Overview、Orchestrator)
日誌分析:pt-query-digest 慢查詢報告、mysqlbinlog 異常事件審計。
鐵律:硬件是底座,參數是杠桿,架構是上限,監控是保命符。沒有銀彈,只有系統工程。