查看原文
其他

注意了!这个远古Bug,让你的 MySQL 8.0 性能下降2倍!

破产码农 InsideMySQL 2022-10-13

        

破产码农

IT圈最会讲故事的网红 · 南山彭于晏
前面的文章已经展示了 MySQL 8.0 的能力,96逻辑CPU下能跑出140万的 QPS 。
这时MySQL实例占用约58个逻辑核,约2.4W QPS / Core 。
IMG群的同学在做类似测试时,发现他的MySQL 8.0却始终只能跑在不到50万 QPS。
通过姜老师的复盘,最终定位了问题,性能从40万提升为了140万 QPS
今天就来带给大家这次错综复杂的性能调优之旅。

1

版本选择


这次测试的版本是最新发布的 MySQL 8.0.24 版本。
直接使用的是编译好的Linux Generic通用版本:mysql-8.0.24-linux-glibc2.12-x86_64.tar.xz

很多同学“迷信”从源码自己手工编译MySQL,从而获得性能的提升。
其实手工编译完全没有必要,是错误的一种执念
试想下Oracle、Microsoft SQL Server是不是都是给的二进制安装包?
难道他们的性能在不同服务器上会有很大的差别么?
你要明白,最终都是将代码逻辑编译成最底层的CPU执行命令,所以不会有本质的差别。

2

都是他惹的祸


接下来,我们进入到测试流程。
这台服务器的硬件与之前的完全一样,操作系统安装的是 CentOS 7 ,内核版本3.10。
这时通过我们的测试程序my_test进行主键的查询测试,会发现QPS被限制在了42W左右的 QPS 。
而之前我们的测试一直是可以达到140万的 QPS 。

这时通过命令TOP观察CPU负载,会发现CPU使用率为62个逻辑核,比之前的还要高。
但是,QPS 反而大幅地下降。
若仔细观察,会发现CPU使用率中,sys的使用率及其高,竟然达到了52.3%!!!

有了这个线索之后,再要定位问题就非常简单了。
再次祭出命令perf。
通过perf top -G -p `pidof mysqld`定位出在测试过程中MySQL消耗最多CPU的函数是哪个。
最终我们定位到了如下这个函数:

可以发现发现这里MySQL调用了函数ppoll,占用了73.68%的CPU使用率。
但我记得之前MySQL viosocket网络模块用的是 poll ,接着去 MySQL worklog 翻看官方工作日志。
然而,并没有找到任何相关信息:

接着,在github上搜索提交日志。
这次终于找到了对应的代码修改信息。
看来是Facebook提交的修复补丁:

看了下,当前MySQL 5.7并没有合并这个修复!!!
接着大致扫了下源码,MySQL 8.0 用 ppoll 替换 poll ,用于安全捕获某些信号,这是常见的逻辑。
所以,我并不认为 MySQL 8.0 的修复存在太大问题。
要再排查问题,就需要查看Linux内核了。
这时我在Github上Linux的源码库中搜索:_raw_spin_lock_irq high cpu
这时终于定位到了问题的原因:

原来这是操作系统的内核Bug!!!
即:在多核CPU,高负载的数据库业务场景情况下,系统函数sigprocmask的自旋锁竞争会占用大量CPU时间
这个 Bug 在 4.10 版本就被修复,但我们的操作系统还停留在 3.10 版本。
所以,要解决这个问题,要么根据Linux源码中的对signal.c进行内核修复并重新编译,或直接将操作系统升级到不低于4.10的版本。
当然,也可以直接修改MySQL源码,牺牲ppoll的安全信号等待特性,退化为之前5.7的方式。
修改 MySQL 8.0 的源码violite.h:

这样的话,仅在内核 4.10 版本及以上时,才会使用 ppoll。
编译后再进行测试,这时 MySQL 性能就能恢复到先前的百万 QPS 水准了:


4

看视频,更直接


视频编辑超级累,看完记得点赞哦!!!

3

总结


这个操作系统 Bug 5年前就已修复,但其极大影响了 MySQL 8.0 的性能。
然而,该Bug对  MySQL 5.7 版本又毫无影响。
可以说,藏得非常深。
也是第一次真正遇到操作系统系统内核 Bug 直接影响数据库性能。
因此,姜老师强烈建议:若你使用/升级 MySQL 8.0 版本,务必确认自己的操作系统内核版本已经升级到4.10版本
否则,你的 MySQL 8.0 体验可能是非常糟糕的。
甚至可能让你痛不欲生~~~~
看完这篇文章,你还有什么疑问呢?欢迎留言讨论哦~~~

直播预告


每周五、六,不定期直播,分享技术干货


IMG群是码农的交流社区,IMG微信群交流内容包括但不限于技术、经济、军事、八卦等话题。欢迎有态度的码农们加入IMG大家庭。
IMG目前有少林群、武当群、峨眉群、华山群、M悦会(高端VIP群)
仅限码农入群,猎头或其他行业勿加,入群请加姜老师个人微信 82946772,并备注:码农入IMG群
-----------------------
公众号:InsieMySQL / 破产码农
视频号:破产码农
抖音号:破产码农
B站号:姜老师带你飞
长按下图二维码关注,将感受到一个有趣的灵魂,每篇文章都会有新惊喜。

          

往期推荐

MySQL vs Redis,新时代王者的较量


刚刚,MySQL 战胜了老大哥 Memcached!


前阿里丁奇:说个MySQL面试的普遍问题


震惊!MySQL 8.0 220W QPS轻松达成


MySQL 8.0使用三周后,我再也看不上5.7版本了


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存