0

0

第二轮:从 Linux 内核事件看 MySQL 性能瓶颈

絕刀狂花

絕刀狂花

发布时间:2025-07-20 11:40:21

|

213人浏览过

|

来源于php中文网

原创

经过两次优化后,mysql 的单个连接 tps 如下:

优化前 第一轮 第二轮 158 tps 1673 tps 1924 tps

通过第二轮优化,性能提升到了原来的 12.18 倍(1924 / 158 ≈ 12.18)。接下来我们详细探讨这两次优化的过程。


书接上回

上次我们通过 Linux 内核的 ebpf 模块的观测能力,成功定位了 MySQL 的瓶颈,并通过调整相应的 MySQL 参数,将 tps 从 158 提升到了 1673。然而,从性能角度来看,我们仍有提升空间。

我们继续按照既定方法论,先从整体上把握 Linux 的资源使用情况。

mpstat 1 30
Linux 5.14.0-55.el9.x86_64 (git-sqlpy-com)   07/21/2022   _x86_64_  (2 CPU)
01:30:15 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
01:30:16 AM  all   37.63    0.00    7.73   11.86    0.00    3.09    0.00    0.00    0.00   39.69
01:30:17 AM  all   38.38    0.00    7.07   14.65    0.00    3.03    0.00    0.00    0.00   36.87
01:30:18 AM  all   38.34    0.00    7.77   12.44    0.00    3.11    0.00    0.00    0.00   38.34
01:30:19 AM  all   36.04    0.00    6.09   13.20    0.00    3.05    0.00    0.00    0.00   41.62

可以看出,IO-WAIT 仅有 10% 左右,说明 IO 负载并不高;但 CPU 的用户态使用率接近 40%,这相对于 IO 来说较高,整体资源使用并不均衡。


分析问题

从上次优化后的资源使用情况(IO-WAIT 较低)可以得出,如果有必要,我们可以通过增加 IO 资源来降低 CPU 资源的使用(IO 为 10%,CPU 为 40%)。当然,最终是否有必要还需数据支持。幸运的是,上次优化后的火焰图仍然可用,它可以提供我们所需的数据。

第二轮:从 Linux 内核事件看 MySQL 性能瓶颈

binlog_cache_data::compress 这个压缩 BIN-LOG 的函数占用了 10.28% 的 CPU 资源。考虑到 BIN-LOG 是顺序 IO,且目前 IO 不是瓶颈,为了节省 CPU 资源,我们决定“优化”掉压缩功能。这样,我们打算通过增加 IO 资源来换取 CPU 资源,从而打造一个更加均衡的系统。


调整参数验证性能

由于我们的目标是提升性能,压缩 BIN-LOG 在此目标下是没有意义的。因此,我们调整 MySQL 参数,关闭 BIN-LOG 压缩,避免 CPU 执行无意义的任务。

mysql> set @@global.binlog_transaction_compression = OFF;
Query OK, 0 rows affected (0.00 sec)

接下来,我们测试性能:

mtls-auto-fill --host=127.0.0.1 --port=3306 --user=root --password=xxx --database=tempdb --table=t --rows=50000 execute
Report:
------------------------------------
|tps = 1924.565426390742
|cost_time = 25.979891
------------------------------------
Compelete.

然后,我们绘制火焰图以查看优化后的效果:

PicWish
PicWish

推荐!专业的AI抠图修图,支持格式转化

下载
# 这里直接用的 ebpf 生态的工具
profile  -p 537985 -af 11 --stack-storage-size=163840 > /tmp/simple-insert-double-zero-binlog-not-compression.out

第二轮:从 Linux 内核事件看 MySQL 性能瓶颈

trans_commit 原本是一个双峰结构,右边的峰是由于压缩 BIN-LOG 导致的,占用约 10.28% 的 CPU。经过我们的参数调整,这部分消耗已被消除。

此外,最左边的 syscall 峰也消失了(目前还无法确定其具体作用,但以后会进一步分析),它在未优化前大约占用 5% 的 CPU。

根据这两组数据,我们可以从火焰图大致推算出 CPU 优化的收益。一个是 10%,另一个是 5%,总的性能大致提升了 115%。我们现在可以估算性能提升:

In [1]: 1673 * 1.15
Out[1]: 1923.949

我们的实测值为 1924.565,与估算值非常接近。


还有没有油水

关于是否还有进一步优化的空间,我们可以通过观察系统资源使用情况来判断。

mpstat 1 30
Linux 5.14.0-55.el9.x86_64 (git-sqlpy-com)   07/29/2022   _x86_64_  (2 CPU)
00:42:06 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
00:42:07 AM  all   32.16    0.00    9.55   17.59    0.00    3.02    0.00    0.00    0.00   37.69
00:42:08 AM  all   34.54    0.00   10.31   18.04    0.00    3.09    0.00    0.00    0.00   34.02
00:42:09 AM  all   36.18    0.00    8.54   18.59    0.00    3.52    0.00    0.00    0.00   33.17
00:42:10 AM  all   34.85    0.00    9.60   19.70    0.00    2.53    0.00    0.00    0.00   33.33
00:42:11 AM  all   33.85    0.00    9.74   21.54    0.00    4.10    0.00    0.00    0.00   30.77

可以看到,参数调整后,用户态 CPU 使用率从之前的 40% 左右下降到了 34% 左右,而 IO-WAIT 从 10% 左右上升到了 20%。也就是说,整个系统从 40:10 的结构调整到了 34:20 的结构,变得更加均衡。

我们再来看一下 IO-WAIT 上升 100% 的原因(从 10% 上升到 20%,上升了 100%)。

funccount -i 1 -p 111659 'vfs_*'
FUNC                                    COUNT
b'vfs_fsync_range'                        496
b'vfs_write'                             6159
b'vfs_read'                              8373

可以看到,sync 和 write 的比例关系发生了变化,由之前的 292:7009 变成了现在的 496:6159

因此,还有优化的空间,请分享这篇文章,说不定更新速度会更快哦!

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

662

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

528

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

3

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 793人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号