当前位置:首页>Linux>MySQL/PostgreSQL 在 Linux 上的内核级优化:IO 模型、内存分配、参数调优

MySQL/PostgreSQL 在 Linux 上的内核级优化:IO 模型、内存分配、参数调优

  • 2026-10-11 05:40:02
MySQL/PostgreSQL 在 Linux 上的内核级优化:IO 模型、内存分配、参数调优

前言

同样的硬件、同样的数据库版本,为什么你的 MySQL 只能跑 5000 TPS,别人能跑 2 万?差异不在数据库本身,在操作系统的资源配置。

数据库是操作系统资源消耗最大的应用。CPU 调度、内存分配、IO 路径、文件系统——每一层的配置偏差,都会在数据库上放大为性能差距。

01

PART 01:IO 模型选择

innodb_flush_method = O_DIRECT_NO_FSYNC    # MySQL 8.0+ 推荐
参数
含义
适用场景
fsync(默认)
写 Page Cache + fsync
通用,但有双缓存
O_DIRECT
绕过 Page Cache 直接写盘
Buffer Pool 够大时
O_DIRECT_NO_FSYNC
O_DIRECT + 跳过 fsync
NVMe 有电容保护

O_DIRECT 把 IO 控制权从内核交给 InnoDB,前提是 Buffer Pool 足够大(建议 60-70% 总内存)。

PG 的 shared_buffers + 内核 cache 是双缓冲。PG 14+ 开始尝试 direct IO。

wal_sync_method = open_sync    # 推荐

02

PART 02:内存分配策略

InnoDB buffer pool:  20GB (62%)OS + Page Cache:      8GB (25%)MySQL 其他/连接:     4GB (13%)shared_buffers:        8GB (25%)OS Page Cache:       18GB (56%)PG 其他/连接:         6GB (19%)# MySQLinnodb_use_native_aio = ONlarge_pages = ON# PostgreSQL (13+)huge_pages = onecho 2048 > /proc/sys/vm/nr_hugepages   # 2MB x 2048 = 4GB

03

PART 03:文件系统选择

MySQL 和 PG 都推荐 XFS。

mkfs.xfs -d agcount=8 -l size=128m /dev/sdb1 
mount -o noatime,nodiratime,nobarrier /dev/sdb1 /data/mysql

NOBARRIER 安全说明:NVMe SSD 有电容保护(掉电时自动刷写缓冲区),可安全关闭 barrier。SATA SSD 和 HDD 必须开启。

04

PART 04:IO 调度器与队列深度

NVMe SSD      -> none(默认即最优)SATA SSD      -> mq-deadlineHDD           -> mq-deadlinecat /sys/block/sdb/queue/schedulerecho mq-deadline > /sys/block/sdb/queue/scheduler# NVMe 队列深度(写密集场景)echo 512 > /sys/block/sdb/queue/nr_requests

05

PART 05:内核参数全集

# 内存参数vm.swappiness = 1vm.dirty_ratio = 15vm.dirty_background_ratio = 5vm.vfs_cache_pressure = 200vm.overcommit_memory = 2vm.overcommit_ratio = 80vm.nr_hugepages = 2048# 网络参数net.core.somaxconn = 65535net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_rmem = 4096 131072 16777216net.ipv4.tcp_wmem = 4096 131072 16777216net.ipv4.tcp_tw_reuse = 1net.ipv4.ip_local_port_range = 1024 65535# 文件系统fs.file-max = 2000000fs.aio-max-nr = 1048576

06

PART 06:NUMA 与 CPU 绑定

# 数据库强制使用 numactl 启动numactl --interleave=all mysqld_safe# 关闭 NUMA balancing(CPU 不漂移)echo 0 > /proc/sys/kernel/numa_balancing# CPU 隔离:系统进程在 CPU 0-1,数据库独占 CPU 2-15# grub: isolcpus=2-15 nohz_full=2-15 rcu_nocbs=2-15taskset -c 2-15 mysqld_safe

07

PART 07:性能监控

SHOW GLOBAL STATUS LIKE 'Innodb_data_fsyncs';SHOW GLOBAL STATUS LIKE 'Innodb_log_waits';SHOW GLOBAL STATUS LIKE 'Innodb_data_pending_fsyncs';SELECT * FROM pg_stat_bgwriter;    # checkpoints 频率SELECT * FROM pg_stat_database;    # disk read cache missiostat -x 1            # await < 2mspidstat -r 1           # RSS 稳定free -h                # available > 20%

总结

数据库的 Linux 调优 = IO 对齐(O_DIRECT) + 内存对齐(Buffer Pool/大页) + CPU 对齐(NUMA/绑核) + 文件系统对齐(XFS/noatime)。四个对齐做好,同样的硬件跑出 2 倍的 TPS。

这是 20 篇 Linux 高阶知识系列的最后一篇,感谢你的阅读。

END

最新文章

随机文章