1. 首页 > MySQL教程 > 正文

MySQL教程FG033-MySQL CPU配置与优化

Part01-基础概念与理论知识

1.1 MySQL CPU使用特点

MySQL的CPU使用主要体现在以下核心方面:

  • 查询处理:SQL解析、优化器执行计划生成和查询执行
  • 事务处理:事务管理、锁机制和ACID特性保证
  • 缓冲池管理:内存数据结构维护和缓存策略管理
  • 复制操作:二进制日志解析、中继和应用
  • 后台线程:InnoDB刷新线程、清理线程和检查点线程

1.2 CPU配置的重要性

风哥提示:CPU是MySQL数据库的计算核心,合理配置CPU资源直接影响数据库的整体性能和并发处理能力。

优化的CPU配置可以带来以下好处:

  • 显著提升查询处理速度
  • 增加系统并发处理能力
  • 优化整体系统资源利用率
  • 提高数据库响应速度和稳定性

1.3 CPU硬件与性能关系

# 查看CPU基本信息
lscpu | head -20
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 16
On-line CPU(s) list: 0-15
Thread(s) per core: 2
Core(s) per socket: 8
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 85
Model name: Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz
Stepping: 3
CPU MHz: 2400.000
CPU max MHz: 3300.0000
CPU min MHz: 1200.0000
BogoMIPS: 4800.00
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 20480K

MySQL性能与CPU特性的关系:

  • 核心数:影响并发处理能力,OLTP场景受益于多核
  • 主频:影响单查询执行速度,OLAP场景受益于高主频
  • 缓存:影响数据访问效率,L3缓存对MySQL性能影响显著
  • 架构:Xeon、EPYC等服务器级CPU提供更好的性能和稳定性

风哥提示:更多视频教程www.fgedu.net.cn

Part02-生产环境规划与建议

2.1 CPU硬件选择

根据业务场景选择合适的CPU硬件:

# 不同CPU类型特性对比
# 1. Intel Xeon系列
– 优势:高性能、高可靠性、广泛的生态支持
– 适用场景:企业级生产环境、关键业务系统

# 2. AMD EPYC系列
– 优势:多核、高性价比、更高的内存带宽
– 适用场景:大规模并发系统、云计算环境

# 3. ARM架构CPU
– 优势:低功耗、高并发性能
– 适用场景:云原生应用、边缘计算、成本敏感环境

2.2 CPU核心数规划

根据业务类型规划CPU核心数:

  • OLTP场景:适合16-32核心,注重并发处理能力
  • OLAP场景:适合8-16核心高主频CPU,注重单线程性能
  • 混合场景:需要平衡核心数和主频,建议16-24核心

2.3 系统级CPU优化

# 1. 调整CPU调度策略
# 查看当前CPU调度策略
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# 设置为性能模式
echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 2. 关闭CPU节能模式
# Intel CPU节能模式
cat /sys/devices/system/cpu/sched_mc_power_savings
echo 0 > /sys/devices/system/cpu/sched_mc_power_savings

# 3. 调整内核参数以优化CPU使用
sysctl -w kernel.sched_autogroup_enabled=0
sysctl -w kernel.sched_migration_cost_ns=5000000
sysctl -w kernel.sched_min_granularity_ns=10000000
sysctl -w kernel.sched_wakeup_granularity_ns=15000000

# 4. 禁用不必要的CPU特性(按需)
# 禁用超线程(如果不适合业务场景)
echo 0 > /sys/devices/system/cpu/cpuX/online

学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 MySQL线程配置

# 编辑my.cnf配置文件
vi /etc/my.cnf

[mysqld]
# 最大连接数(根据CPU核心数和内存大小调整)
max_connections=500

# 线程缓存大小(建议设置为max_connections的1/10到1/5)
thread_cache_size=64

# 线程堆栈大小(根据需要调整,默认256K足够)
thread_stack=256K

# 保存并重启MySQL
systemctl restart mysqld

# 验证配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘max_connections’; SHOW VARIABLES LIKE ‘thread_cache_size’; SHOW VARIABLES LIKE ‘thread_stack’;”
Enter password: Fgedu123!
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 500 |
+—————–+——-+
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| thread_cache_size | 64 |
+——————-+——-+
+—————+——–+
| Variable_name | Value |
+—————+——–+
| thread_stack | 262144 |
+—————+——–+

3.2 InnoDB线程配置

# 编辑my.cnf配置文件
vi /etc/my.cnf

[mysqld]
# InnoDB缓冲池实例数(建议与CPU核心数匹配或为2的倍数)
innodb_buffer_pool_instances=16

# InnoDB IO线程数(根据存储设备性能调整)
innodb_read_io_threads=16
innodb_write_io_threads=16

# InnoDB后台线程并发控制(0表示不限制)
innodb_thread_concurrency=0

# InnoDB purge线程数(建议设置为CPU核心数的1/4到1/2)
innodb_purge_threads=4
innodb_purge_batch_size=300

# InnoDB page cleaner线程数(建议与CPU核心数匹配)
innodb_page_cleaners=4

# 保存并重启MySQL
systemctl restart mysqld

# 验证配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘innodb_buffer_pool_instances’; SHOW VARIABLES LIKE ‘innodb_read_io_threads’; SHOW VARIABLES LIKE ‘innodb_write_io_threads’; SHOW VARIABLES LIKE ‘innodb_purge_threads’; SHOW VARIABLES LIKE ‘innodb_page_cleaners’;”
Enter password: Fgedu123!
+——————————+——-+
| Variable_name | Value |
+——————————+——-+
| innodb_buffer_pool_instances | 16 |
+——————————+——-+
+—————————+——-+
| Variable_name | Value |
+—————————+——-+
| innodb_read_io_threads | 16 |
+—————————+——-+
+—————————-+——-+
| Variable_name | Value |
+—————————-+——-+
| innodb_write_io_threads | 16 |
+—————————-+——-+
+—————————+——-+
| Variable_name | Value |
+—————————+——-+
| innodb_purge_threads | 4 |
+—————————+——-+
+—————————-+——-+
| Variable_name | Value |
+—————————-+——-+
| innodb_page_cleaners | 4 |
+—————————-+——-+

3.3 查询处理配置

# 编辑my.cnf配置文件
vi /etc/my.cnf

[mysqld]
# 表缓存配置(根据表数量和连接数调整)
table_open_cache=4000
table_definition_cache=800
table_open_cache_instances=8

# 排序和连接缓冲区配置
sort_buffer_size=256K
read_buffer_size=128K
read_rnd_buffer_size=256K
join_buffer_size=256K

# 保存并重启MySQL
systemctl restart mysqld

# 验证配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘table_open_cache%’; SHOW VARIABLES LIKE ‘sort_buffer_size’; SHOW VARIABLES LIKE ‘read_buffer_size’; SHOW VARIABLES LIKE ‘read_rnd_buffer_size’; SHOW VARIABLES LIKE ‘join_buffer_size’;”
Enter password: Fgedu123!
+—————————-+——-+
| Variable_name | Value |
+—————————-+——-+
| table_open_cache | 4000 |
| table_open_cache_instances | 8 |
+—————————-+——-+
+—————————+——–+
| Variable_name | Value |
+—————————+——–+
| sort_buffer_size | 262144 |
+—————————+——–+
+————————+——–+
| Variable_name | Value |
+————————+——–+
| read_buffer_size | 131072 |
+————————+——–+
+————————-+——–+
| Variable_name | Value |
+————————-+——–+
| read_rnd_buffer_size | 262144 |
+————————-+——–+
+——————-+——–+
| Variable_name | Value |
+——————-+——–+
| join_buffer_size | 262144 |
+——————-+——–+

3.4 线程池配置

# 编辑my.cnf配置文件(适用于MySQL Enterprise或Percona Server)
vi /etc/my.cnf

[mysqld]
# 启用线程池
thread_handling=pool-of-threads

# 线程池大小(建议与CPU核心数匹配)
thread_pool_size=16

# 线程池最大线程数
thread_pool_max_threads=500

# 线程池批处理大小
thread_pool_batch_size=100

# 线程池优先级分组
thread_pool_stall_limit=500

# 保存并重启MySQL
systemctl restart mysqld

# 验证线程池配置
mysql -u root -p -e “SHOW VARIABLES LIKE ‘thread_handling’; SHOW VARIABLES LIKE ‘thread_pool%’;”
Enter password: Fgedu123!
+—————–+——————-+
| Variable_name | Value |
+—————–+——————-+
| thread_handling | pool-of-threads |
+—————–+——————-+
+—————————+——–+
| Variable_name | Value |
+—————————+——–+
| thread_pool_size | 16 |
| thread_pool_max_threads | 500 |
| thread_pool_batch_size | 100 |
| thread_pool_stall_limit | 500 |
+—————————+——–+

风哥提示:更多学习视频公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 CPU性能监控实战

# 1. 系统级CPU监控
# 实时监控CPU使用情况
top

# 查看每个CPU核心的使用情况
mpstat -P ALL 1
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 25.32 0.00 8.12 2.45 0.00 0.51 0.00 0.00 0.00 63.60
Average: 0 22.10 0.00 7.80 3.20 0.00 0.40 0.00 0.00 0.00 66.50
Average: 1 28.50 0.00 8.40 1.80 0.00 0.60 0.00 0.00 0.00 60.70

# 查看MySQL进程的CPU使用情况
pidstat -p $(pgrep -f mysqld) 1
14:32:45 UID PID %usr %system %guest %wait %CPU CPU Command
14:32:46 996 1234 22.00 5.00 0.00 0.00 27.00 2 mysqld

# 2. MySQL内部CPU监控
# 查看线程状态
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘Threads%’;”
Enter password: Fgedu123!
+————————-+——-+
| Variable_name | Value |
+————————-+——-+
| Threads_cached | 25 |
| Threads_connected | 128 |
| Threads_created | 156 |
| Threads_running | 8 |
+————————-+——-+

# 查看CPU相关状态
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘%cpu%’;”
Enter password: Fgedu123!
+—————————+——-+
| Variable_name | Value |
+—————————+——-+
| Cpu_time | 1256 |
| Cpu_usage | 23.5 |
+—————————+——-+

# 3. Performance Schema监控
# 查看最消耗CPU的语句
mysql -u root -p -e “SELECT \
digest_text, \
sum_timer_wait/1000000000 as total_time_ms, \
count_star \
FROM performance_schema.events_statements_summary_by_digest \
ORDER BY sum_timer_wait DESC LIMIT 10;”
Enter password: Fgedu123!

4.2 高CPU使用率优化案例

# 案例:CPU使用率持续高于80%

# 1. 诊断问题
# 查看当前CPU使用情况
top

# 查看MySQL慢查询
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘Slow_queries’;”
Enter password: Fgedu123!

# 分析慢查询日志
mysqldumpslow -s t /var/log/mysql/slow.log
Reading mysql slow query log from /var/log/mysql/slow.log
Count: 100 Time=10.20s (1020s) Lock=0.00s (0s) Rows=1000000.0 (100000000), root[root]@localhost
SELECT * FROM large_table WHERE condition = N

# 2. 实施优化
# 添加缺失的索引
mysql -u root -p -e “ALTER TABLE large_table ADD INDEX idx_condition (condition);”
Enter password: Fgedu123!

# 优化查询语句
# 将SELECT *改为只选择需要的列
SELECT id, name, value FROM large_table WHERE condition = N;

# 3. 验证优化效果
# 再次查看CPU使用率
top

# 检查查询性能提升
mysql -u root -p -e “EXPLAIN SELECT * FROM large_table WHERE condition = 123;”
Enter password: Fgedu123!

4.3 并发连接优化案例

# 案例:并发连接数高,CPU上下文切换频繁

# 1. 诊断问题
# 查看连接数
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘Threads_connected’;”
Enter password: Fgedu123!

# 查看线程创建频率
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘Threads_created’;”
Enter password: Fgedu123!

# 查看CPU上下文切换
vmstat 1
procs ———–memory———- —swap– —–io—- -system– ——cpu—– r b swpd free buff cache si so bi bo in cs us sy id wa st
5 0 0 10325608 123456 2048000 0 0 12 15 1234 5678 23 12 65 0 0
# cs列表示每秒上下文切换次数

# 2. 实施优化
# 增加线程缓存大小
vi /etc/my.cnf
thread_cache_size=128

# 限制最大连接数(根据服务器资源调整)
max_connections=300

# 保存并重启MySQL
systemctl restart mysqld

# 3. 应用层优化
# 使用连接池(以Java为例)
# HikariCP连接池配置
HikariConfig config = new HikariConfig();
config.setMaximumPoolSize(50); // 减少到50
config.setMinimumIdle(10);
config.setConnectionTimeout(30000);
config.setIdleTimeout(600000);
config.setMaxLifetime(1800000);

# 4. 验证优化效果
# 查看线程缓存命中率
mysql -u root -p -e “SELECT \
(1 – (Threads_created / Connections)) * 100 AS thread_cache_hit_rate \
FROM information_schema.GLOBAL_STATUS \
WHERE Variable_name = ‘Threads_created’;”
Enter password: Fgedu123!

学习交流加群风哥QQ113257174

Part05-风哥经验总结与分享

5.1 CPU配置最佳实践

风哥提示:CPU配置需要根据业务场景、数据量和并发需求综合考虑,没有放之四海而皆准的配置。
  • 硬件选择
    • OLTP场景:选择多核CPU(16-32核心)
    • OLAP场景:选择高主频CPU(3.0GHz+)
    • 混合场景:平衡核心数和主频
  • 系统配置
    • 启用性能模式,关闭节能功能
    • 调整内核参数优化CPU调度
    • 根据需要禁用超线程
  • MySQL配置
    • innodb_buffer_pool_instances与CPU核心数匹配
    • thread_cache_size设置合理,提高线程复用率
    • 根据工作负载调整IO线程数
    • 考虑使用线程池减少上下文切换

5.2 常见问题与解决方案

# 1. CPU使用率过高
## 可能原因
– 慢查询过多,缺少索引
– 全表扫描频繁
– 复杂查询导致CPU计算密集
– 并发连接数过高
## 解决方案
– 优化SQL语句,添加合适索引
– 减少全表扫描,使用索引覆盖查询
– 分解复杂查询为多个简单查询
– 限制连接数,使用连接池

# 2. CPU上下文切换频繁
## 可能原因
– 连接数过多
– 线程创建销毁频繁
– 锁竞争严重
## 解决方案
– 增加thread_cache_size
– 使用连接池减少连接创建
– 优化锁机制,减少锁竞争
– 考虑使用线程池

# 3. 单核心使用率过高
## 可能原因
– 查询并行度低
– 锁竞争导致线程排队
– 某些操作无法并行执行
## 解决方案
– 优化查询,提高并行度
– 减少长事务,降低锁持有时间
– 使用行级锁替代表级锁
– 考虑读写分离分散负载

# 4. CPU空闲但性能差
## 可能原因
– IO瓶颈导致CPU等待
– 内存不足导致频繁交换
– 网络瓶颈
## 解决方案
– 优化存储系统,使用SSD
– 增加内存,优化缓冲池配置
– 检查网络连接和延迟

5.3 性能测试与调优

# 1. CPU性能测试
# 使用sysbench测试CPU性能
sysbench –test=cpu –cpu-max-prime=20000 run

# 使用mysqlslap测试MySQL性能
mysqlslap –concurrency=100 –iterations=10 –create-schema=testdb –query=”SELECT * FROM users WHERE id BETWEEN 1 AND 100″ –number-of-queries=10000

# 2. 压力测试与调优
# 使用sysbench进行OLTP测试
sysbench –test=oltp_read_write –db-driver=mysql –mysql-host=127.0.0.1 –mysql-user=root –mysql-password=Fgedu123! –mysql-db=testdb –tables=10 –table-size=1000000 –threads=32 –time=60 run

# 3. 调优步骤
# 监控 → 分析 → 调整 → 测试 → 监控

# 监控:使用top、mpstat、pidstat监控系统CPU
# 分析:使用Performance Schema分析MySQL内部CPU使用
# 调整:根据分析结果调整配置参数
# 测试:使用sysbench等工具验证性能变化
# 监控:持续监控,确保优化效果稳定

风哥提示:更多视频教程www.fgedu.net.cn

from MySQL:www.itpux.com

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息