Azure MySQL 资料库效能提升经验-CPU资源100%降低至15%

先看结果如下图,MySQL资料库的尖峰效能,CPU使用率由100% 分二阶段降低,最终至使用率低至 15%!,到底我做了甚麽? 接着我会慢慢告诉你。
结果

背景

首先工商时间一下,我司使用Azure已经多年,开发的 SaaS 服务名称是『E乐堂』,主要是提供客户租用後,可以快速建立线上课程的教学网站,免除客户自行建立主机、管理系统的麻烦! 服务已经运行超过 3年,客户的课程包罗万象,例如:
销售心理学课程的轩言文创
销售管理类课程的鼎新电脑知识学院
Epson机械手臂经销商与客户训练
动画软件教学的影视学院

如果看官有任何可以教的,不管是录制影片,还是录制音频,甚至直播,都可以运用E乐堂,收费或免费进行教学。会看这一篇的大概是程序设计师或DBA吧! 这类型课程倒还没有喔! 有兴趣的话,欢迎与我司联络,电邮是 [email protected]

开始吧

等一下,我想有人会问,为什麽我们会用 Azure MySQL (正确但是绕口的中文名称是: 适用於 MySQL 服务器的 Azure 资料库),而不采用 Azure VM 自己安装 MySQL?

当时我们觉得, Microsoft 既然商转 Azure MySQL了,肯定比我们自己安装,系统要更稳定,效能调教要更好,让我们可以 focus 在核心业务开发上,事实上,稳定是没有问题,可是初期预算关系,我们选用 Basic Layer,没有注意到的是 Basic Layer 无法直接升级到 General Purpose (二者以同样的 2vCPU,价差一倍),导致我们有点小崩溃!

但是还好,当时营运初期,资料量还没有太大,刚好一年前 Azure MySQL RI (保留容量) 也开始提供,价格大约是一般算法的一半,就直接转移到 General Purpose 4vCPU等级了!

既然升级到 4vCPU,理论上应该资源充足,高枕无忧了吧,就在2020年10月,第一次收到 Azure 的效能建议,内容是:

增加服务器参数的值:tmp_table_size、max_heap_table_size
在适用於 MySQL 的 Azure 资料库上以最佳方式调整您的工作负载

不错喔,Azure 真的会建议我们对 Azure MySQL 调整参数,优化效能,果然当初选择 Azure MySQL 是对的! 按照其建议,做了参数调整,将建议的参数值都调整到最大;隔没有几天,相同的建议又出现了,我已经调整到最大了,还要我怎麽样! 经过 Microsoft 技术支援询问,工程师说既然已经开到最大,那也就没有甚麽可以做的了! 好吧,不了了之…
接下来,我们就观察 MySQL 的资源指标,就像上图,很明显,每天从早上10点开始,CPU使用率开始扶摇直上,最终就会接近 100%,那段时间,我们团队每天紧盯着,心情七上八下,但是似乎对於我们的服务影响看不太出来,不过作为 SaaS 服务可不能这样搞,还是要找出来原因啊,真的是用量大的原因吗? (可是收入没有扶摇直上啊…) 假如真的是用量太大,那只能再升级,但是下一级距 8vCPU的RI就直接跳到约一年15万,这…!

经过一段时间的观察,不管透过 slowlog,还是 MySQL Workbench,我们都发现了一个相同处,有一个 select query 数量非常多! 跟 RD 讨论这个 select,语法本身非常简单,而且是最底层、最基本要用的,改善空间有限,怎麽办?

我们只好从资料库参数下手,研究看看 Azure MySQL 有哪些参数是跟效能有关的,作为喷钱之前的最後挣扎!!!
Azure MySQL 服务器参数

不骗你,我们是一个个参数 google,看看是不是可能对於效能可以提升,但是毕竟这是 production 资料库,每一次的调整我们都七上八下,但是不在 production 调整,根本看不出效果啊,硬着头皮干吧!

终於皇天不负苦心人,让我们试到一个参数: thread_handling
预设值是 ONE-THREAD-PER-CONNECTION
可以调整为 POOL-OF-THREADS

不管从字面上,或是 google 的结果,感觉都是 POOL-OF-THREADS 比较优啊,为什麽预设值不是他! 这个参数调整因为要 reboot 後才会生效,所以我们等到半夜再做,隔天就看到了效能图的 (1),真的有效喔! 虽然峰值只有下降了一点点,但是我们兴奋之情溢於言表!

再接再厉,我们终於找到一个决定性 (2) 的参数,让 CPU 使用率遽降至 20%以下,这个救命参数就是: query_cache_type

预设值是 OFF,可以调整为 ON 或 DEMAND,调整为 ON 之後,我们崩溃了! 这个神一样的参数,就这样让我们得到救赎!

研究这个参数时,爬到的文有人写有用,有人不建议,我们着实挣扎,大致上说的是,select query 执行後会放到 cache,如果有重复相同的 query,MySQL就直接取用 cache,不再进行 query,所以不建议的人是说,如果资料库异动多,结果 query 反而会降低效能,因为要先比对 cache,而我们的这个 table 就是没有异动,只是 query 比对,所以造成这麽巨大的效能提升!

结论

RD 工程师经验非常重要,DBA 绝对也是!
我司的RI降级,再度省下一半的费用...
老板也因此...喔! 我就是老板,没事。


<<:  DBA 训练营 - SQL Server 资料库管理入门

>>:  恶意程序-伴侣病毒( malicious program-Companion virus)

夜间模式真的对眼睛比较好吗? 详细整理(下)

5.亮度 常见使用夜间模式的一个原因,也不是因为健康与否,只是因为觉得白底有点太亮了 确实亮度也一直...

React Custom hook 踩坑日记 - useToggle

开发React的专案也有好一阵子了,趁着有空闲的时间和大家分享一些我常会在不同专案用到的共同自订义h...

RESTful API

用户或资源所有者向身份提供者而不是联合系统中的资源或 API 服务器进行身份验证。身份提供者向客户端...

Laravel - jQuery AJAX 范例

最近满常要把一般 form-submit 改成 AJAX 非同步去送表单,所以分享个 templat...

DAY02 - 那些当年很想做但就是写不出来的Side Project...囧

前言: 今天是铁人赛的第二天,要来说说大叔的自学经历与心得 内容预计分成两篇...(满满的回忆 XD...