对于一台 16 核心 32G 内存的服务器,以下是对 MySQL8.0 的优化配置建议:
innodb_buffer_pool_size
:该参数用于设置 InnoDB 缓冲池的大小,缓冲池用于缓存数据和索引,以加快数据库的读写速度,默认值128M
。在 32GB 内存的服务器上,可以将该值设置为内存的 60%-70%,例如 18GB 左右。innodb_buffer_pool_size = 18G
。innodb_buffer_pool_instances
:缓冲池分区数,默认值1
。每个分区独立管理以减少争用,计算公式:MIN(CPU核数,总缓冲池大小/1GB)
,例如设置为 8。innodb_buffer_pool_instances = 8
。innodb_page_cleaners
:必须等于缓冲池实例数!每个实例分配一个专用清理线程,当innodb_page_cleaners > innodb_buffer_pool_instances时,多出的清理线程会空转浪费资源,例如设置为 8。innodb_page_cleaners = 8
。innodb_log_file_size
:它影响重做日志的性能,默认值48M
。如果服务器的写操作较多,可以适当增加该值,例如设置为 2GB。innodb_log_file_size = 2G
。innodb_log_files_in_group
:SSD支持并行写入3个日志文件提升吞吐,默认值2
,设置为3
。innodb_log_files_in_group = 3
。innodb_log_buffer_size
:适配日志文件:2G×3=6G
→ 缓冲区,默认值16M
,设置为64M
。innodb_log_buffer_size = 64M
。innodb_flush_method
:该参数影响数据写入磁盘的方式,默认值fsync
。对于高性能的存储设备,建议使用 O_DIRECT,它可绕过操作系统的缓存,减少数据写入的延迟。innodb_flush_method = O_DIRECT
。注意:Ext4的系统配置,EXT4文件系统下可能数据损坏。innodb_io_capacity
:用于指定 InnoDB 后台线程每秒的最大 I/O 操作次数,默认值200
。如果服务器使用的是 SSD 存储,可以将其设置为 2000 或更高。innodb_io_capacity = 2000
。innodb_io_capacity_max
:设置在高负载情况下,InnoDB 后台线程每秒允许的最大 I/O 操作次数,默认值2000
,通常设置为 innodb_io_capacity
的两倍。innodb_io_capacity_max = 4000
。innodb_read_io_threads
:innodb_write_io_threads
:max_connections
:根据应用程序的预期负载设置最大连接数,默认值151
。对于中等规模的应用,可以设置为 500-1000;对于高并发应用,可能需要设置为 1000 以上。max_connections = 800
。
MySQL Enterprise Edition包含使用服务器插件实现的MySQL Enterprise Thread Pool。
thread_handling
:
thread_pool_max_threads
:thread_pool_stall_limit
:thread_pool_size
:线程池插件可以有效管理并发连接,降低线程切换的开销,线程组数量。在 16 核心的服务器上,可以将其设置为 CPU 核心数的 0.5-1 倍。thread_pool_size = 16
。
需要先检查线程池插件是否已安装SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE 'thread%';
如果插件未安装,需要先安装,修改配置后,需要重启MySQL服务使更改生效。
其他期待方案:
sync_binlog
:该参数用于控制二进制日志的同步频率,默认值1
。设置为 1 时,每次事务提交都会将二进制日志同步到磁盘,这能确保数据的持久性,但会带来一定的性能开销。如果对数据的可靠性要求较高,可以保持默认值 1;如果更注重性能,可以将其设置为更大的值,如 100。sync_binlog = 100
。innodb_flush_log_at_trx_commit
:用于控制事务日志的写入和刷新行为,默认值1
。设置为 1 时,每次事务提交都会将日志缓冲区的内容写入日志文件并刷新到磁盘,这提供了最高的数据安全性,但性能开销较大。如果愿意在性能和持久性之间做出一定的权衡,可以将其设置为 2。innodb_flush_log_at_trx_commit = 2
。innodb_flush_log_at_timeout
:innodb_adaptive_flushing
:innodb_numa_interleave
(关键参数):让InnoDB在NUMA节点间交错分配内存,避免CPU核心访问远程内存导致的性能衰减,服务器需启用NUMA(numactl --hardware
验证),默认值OFF
,16核服务器必开设置为ON
。innodb_numa_interleave = ON
。innodb_flush_neighbors
:innodb_change_buffer_max_size
:innodb_use_native_aio
:thread_pool_size
)来优化 CPU 使用率。vim /etc/fstab
# /etc/fstab 增加挂载选项
UUID=xxx / ext4 defaults,data=writeback,nobarrier 0 0
>⚠️ O_DIRECT 强制要求:
>1. 文件系统:EXT4必须启用data=writeback
模式
- 避免默认
data=ordered
导致元数据不一致 >2. 写入屏障:SSD设备需禁用屏障nobarrier
- SSD自有电容保证断电安全
- 命令验证:
sudo mount | grep ' / '
在Linux系统中修改MySQL配置文件的步骤如下:
找到MySQL配置文件:
MySQL配置文件通常是my.cnf或my.ini(在类Unix系统中通常是my.cnf)。可以通过以下命令查找:
mysql --help | grep -A 1 "Default options"
输出示例:
Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
这表示MySQL会按顺序从/etc/my.cnf、/etc/mysql/my.cnf和~/.my.cnf读取配置。
编辑配置文件:
编辑配置文件调整参数 vim /etc/my.cnf
在配置文件中找到[mysqld]部分,添加或修改相应的参数。
[mysqld]
# 缓冲体系
# 缓冲池设置
innodb_buffer_pool_size = 18G
# 匹配CPU和缓冲池配置
innodb_buffer_pool_instances = 8
# 清理线程
innodb_page_cleaners = 8
# 日志体系
# 日志文件大小
innodb_log_file_size = 2G
innodb_log_files_in_group = 3
innodb_log_buffer_size = 64M
# I/O体系
# 文件刷新方式
innodb_flush_method = O_DIRECT
# I/O容量设置
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_read_io_threads = 16
innodb_write_io_threads = 16
# 并发控制
# 最大连接数
max_connections = 800
# 加载线程池插件
# plugin-load-add = thread_pool.so
# 启用线程池
thread_handling = pool-of-threads
# 线程池中的线程组数(默认为系统CPU核心数)
thread_pool_size = 16
# 线程池的最大线程数
thread_pool_max_threads = 100
thread_pool_stall_limit = 100
# 持久性优化
sync_binlog = 100
innodb_flush_log_at_trx_commit = 2
innodb_flush_log_at_timeout = 2
innodb_adaptive_flushing = ON
# SSD特化
innodb_numa_interleave = ON
innodb_change_buffer_max_size = 30
# AIO加速SSD响应
innodb_use_native_aio = ON
# 禁用HDD时代优化
innodb_flush_neighbors = 0
# 1. NUMA平衡策略
echo 1 > /proc/sys/kernel/numa_balancing
# 2. SSD调度器优化
sudo tee /sys/block/sda/queue/scheduler <<< 'none'
# 3. 网络加速(千兆+环境)
sudo ethtool -C eth0 rx-usecs 15
sudo service mysql restart
检查配置是否生效,可以通过执行以下命令查看当前的配置参数值:
sudo mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
这将显示innodb_buffer_pool_size的当前值,验证是否按照你的设置进行了修改。
其他验证
/* 查看NUMA效果 */
SHOW STATUS LIKE 'Innodb_numa%';
/* 查看线程池效率 */
SELECT * FROM thread_pool_status\G
/* 查看I/O负载 */
SELECT * FROM sys.io_global_by_wait_by_latency;
本文由 systemofdown 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。