Part01-基础概念与理论知识
1.1 MySQL CPU使用特点
MySQL的CPU使用主要体现在以下核心方面:
- 查询处理:SQL解析、优化器执行计划生成和查询执行
- 事务处理:事务管理、锁机制和ACID特性保证
- 缓冲池管理:内存数据结构维护和缓存策略管理
- 复制操作:二进制日志解析、中继和应用
- 后台线程:InnoDB刷新线程、清理线程和检查点线程
1.2 CPU配置的重要性
优化的CPU配置可以带来以下好处:
- 显著提升查询处理速度
- 增加系统并发处理能力
- 优化整体系统资源利用率
- 提高数据库响应速度和稳定性
1.3 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硬件:
# 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优化
# 查看当前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线程配置
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线程配置
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 查询处理配置
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 线程池配置
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性能监控实战
# 实时监控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使用率优化案例
# 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 并发连接优化案例
# 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配置最佳实践
- 硬件选择:
- OLTP场景:选择多核CPU(16-32核心)
- OLAP场景:选择高主频CPU(3.0GHz+)
- 混合场景:平衡核心数和主频
- 系统配置:
- 启用性能模式,关闭节能功能
- 调整内核参数优化CPU调度
- 根据需要禁用超线程
- MySQL配置:
- innodb_buffer_pool_instances与CPU核心数匹配
- thread_cache_size设置合理,提高线程复用率
- 根据工作负载调整IO线程数
- 考虑使用线程池减少上下文切换
5.2 常见问题与解决方案
## 可能原因
– 慢查询过多,缺少索引
– 全表扫描频繁
– 复杂查询导致CPU计算密集
– 并发连接数过高
## 解决方案
– 优化SQL语句,添加合适索引
– 减少全表扫描,使用索引覆盖查询
– 分解复杂查询为多个简单查询
– 限制连接数,使用连接池
# 2. CPU上下文切换频繁
## 可能原因
– 连接数过多
– 线程创建销毁频繁
– 锁竞争严重
## 解决方案
– 增加thread_cache_size
– 使用连接池减少连接创建
– 优化锁机制,减少锁竞争
– 考虑使用线程池
# 3. 单核心使用率过高
## 可能原因
– 查询并行度低
– 锁竞争导致线程排队
– 某些操作无法并行执行
## 解决方案
– 优化查询,提高并行度
– 减少长事务,降低锁持有时间
– 使用行级锁替代表级锁
– 考虑读写分离分散负载
# 4. CPU空闲但性能差
## 可能原因
– IO瓶颈导致CPU等待
– 内存不足导致频繁交换
– 网络瓶颈
## 解决方案
– 优化存储系统,使用SSD
– 增加内存,优化缓冲池配置
– 检查网络连接和延迟
5.3 性能测试与调优
# 使用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
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
