MySQL 关键指标
作者:Katy Farmer / 用例, 开发者
2017年12月18日
导航至
也许你还记得 Blogger——不是实际的商业网站,看起来功能齐全且设计精良——而是我的业余项目,故障和低效的完美结合,需要随时监控。Blogger 不可信。请看我的第一篇关于它的帖子here.
<figcaption> 我试图让它变得更美观,结果反而更丑陋。虚荣,你的名字是 Blogger。</figcaption>
我们开始了指标的初步探索,关注 Blogger 的请求数量。但 Blogger 不太可能因流量过载而崩溃,所以我们不必担心它收到了多少请求。让我们担心它的性能如何。
在主页上添加更多内容使 Blogger 变慢了。最近的文章和最近的活动确实加载了……最终。如果我没有对 Blogger 投入情感,我就不会等待。大多数用户不会。想象一下,如果您的 Google 搜索结果需要 30 秒才能显示出来。您会关注 Bing。因为最近的文章和最近的活动都应该从数据库中检索数据,所以是时候监控 MySQL,Blogger 的数据库了。
<figcaption> 想象一下倒过来用于数据检索</figcaption>
首先,我们需要确定哪些指标值得监控。快速搜索互联网(快速 = 仅 3 次狗狗视频休息)显示了 MySQL 输出的指标数量。非常多。如果我想,我可能会找到它母亲的娘家姓和它的第一个童年宠物。
但评估性能不需要所有这些指标。有四个方面可以揭示 MySQL 的情况:你不会相信第四个方面。开玩笑的——它们都完全有道理。
吞吐量
最重要的是,数据库的工作是运行查询。它 想要 运行查询——以至于它会运行你要求的尽可能多的查询,无论负担如何,这在某些时候可能会成为问题。MySQL 有一些方便的状态变量,我们可以用来检查它:Queries(服务器端)和 Questions(客户端)。
<figcaption> 尼尔·德格拉斯·泰森博士作序</figcaption>
msql>SHOW GLOBAL STATUS LIKE "Questions"; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | Questions | 282590 | +---------------+--------+ 1 row in set (0.00 sec)
msql> SHOW GLOBAL STATUS LIKE "Queries"; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | Queries | 294564 | +---------------+--------+ 1 row in set (0.00 sec)
老实说,这些数字对我来说毫无意义,但我确定它们从数据库创建时开始累积。读取和写入的细分会更有帮助。猜猜谁有这些变量?
<figcaption> 是 MySQL。MySQL 有这些变量。</figcaption>
Com-select 显示读取,Com-insert、Com_update 和 Com-delete 的组合将显示写入(这些也是累积数字)。
mysql> show global status like "Com_select"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_select | 28854 | +---------------+-------+ 1 row in set (0.01 sec)
mysql> show global status like "Com_insert"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_insert | 69317 | +---------------+-------+ 1 row in set (0.00 sec)
执行时间
如果查询量看起来正常,但瓶颈仍然存在,执行时间是下一步。当然,Blogger 可以处理所有 294564 个查询,但如果其中一个查询需要五分钟才能完成,那就不行了。MySQL 有一个快速检查方法,可以使用变量 Slow_queries。
mysql> show global status like "Slow_queries"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Slow_queries | 0 | +---------------+-------+ 1 row in set (0.00 sec)
欢呼!
当然,这可能并不总是零。Blogger 没有慢查询,要么是因为我是超级程序员,要么是因为它实际上并没有做任何复杂的事情。谁知道呢?
并发
MySQL 中的事务数量与同时发生的事务数量同样重要。让我们假设 Blogger (再次强调,不是实际的商业 Blogger,而是我的 Frankenstein)成功了。它是博客界的比特币(可能在某个地方有一个实际的商业计划)。
<figcaption> 加密博客是未来</figcaption>
如果 Blogger 每秒收到 2 万个查询(因为它在这种情况下非常受加密货币欢迎),平均延迟为 2 毫秒(延迟基于我将在下一节中展示的查询),那将是 40 个并发查询。但如果 MySQL 挂起哪怕 100 毫秒(让我们在这种情况下归咎于操作系统),那将影响 4 千个查询。哇。
如果您想了解更多关于其工作原理的信息,请阅读《Understanding MySQL internals》。非常有趣。
再说一遍,MySQL 想要帮助我们。又一个变量,又是 MySQL 的一天。Threads_running
将显示当前正在运行的线程数,如果您想要更多信息,还可以查看“Threads_connected”和“threads_created”。
mysql> SHOW GLOBAL STATUS LIKE "Threads_running"; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Threads_running | 1 | +-----------------+-------+ 1 row in set (0.00 sec)
利用率
这是一种广泛的说法:监控您的资源。但具体来说,利用率是指资源繁忙的时间量(或百分比)。对于数据库,这意味着每个连接繁忙的时间百分比(哦,如果您想查看连接,还有一个变量:“Connections”),或者数据库可访问的时间量。当您确定存在问题,但不知道问题是什么时,利用率最有帮助。
<figcaption> 我的数据中有些东西看起来不一样了</figcaption>
让 MySQL 来帮助我们弄清楚这一点。它在 performance_schema DB 和 sys DB 中总结了很多这些指标并准备好进行查询(sys DB 更易于人类阅读,如果您恰好是人类的话)。使用 sys DB,我可以找到最慢的查询。
mysql> SELECT * FROM sys.statements_with_runtimes_in_95th_percentile;
输出虽然易于人类阅读,但可能非常广泛。在您的机器上运行它,看看会发生什么!
这是我运行的查询,用于查找并发示例中每个模式的平均运行时间。blogger_test 的检查结果为 2123 微秒,平均而言,一个查询从到达到完成大约需要 2 毫秒。
mysql> SELECT schema_name , SUM(count_star) count , ROUND( (SUM(sum_timer_wait) / SUM(count_star)) / 1000000) AS avg_microsec FROM performance_schema.events_statements_summary_by_digest WHERE schema_name IS NOT NULL GROUP BY schema_name; +---------------------+--------+--------------+ | schema_name | count | avg_microsec | +---------------------+--------+--------------+ | blogger_development | 248834 | 149 | | blogger_test | 188 |2123 | | information_schema | 3 | 156 | | performance_schema | 17 | 578 | | sys | 8 |5437 | +---------------------+--------+--------------+ 5 rows in set (0.00 sec)
结论
performance_schema 中有一些令人惊叹的指标可用,您应该花时间探索,以防 MySQL 出现紧急情况,这样您就知道当 SQL 的冰冷之手向您伸来时该去哪里寻找。
既然我们已经确定了哪些指标重要,我将继续探索 MySQL。在我的下一篇文章中,我将专门讨论 Blogger 中的吞吐量、执行时间、并发性和利用率。