如何使用Mytop监控MySQL性能

来自菜鸟教程
跳转至:导航、​搜索

介绍

Mytop 是一个开源的命令行工具,用于监控 MySQL 的性能。 它的灵感来自名为 top 的 Linux 系统监控工具,并且在外观和感觉上与它相似。 Mytop 连接到 MySQL 服务器并定期运行 show processlistshow global status 命令。 然后它以有用的格式总结信息。 使用 mytop,我们可以(实时)监控 MySQL 线程、查询和正常运行时间,并查看哪个用户在哪个数据库上运行查询,哪些是慢查询等等。 所有这些信息都可以用来优化 MySQL 服务器的性能。

在本教程中,我们将讨论如何安装、配置和使用 mytop。

先决条件

在开始学习本教程之前,您应该具备以下条件:

  • CentOS 7 64 位 Droplet(也适用于 CentOS 6)
  • 具有 sudo 权限的非 root 用户。 要设置此类型的用户,请按照 使用 CentOS 7 的初始服务器设置教程进行操作。 所有命令都将以该用户身份运行。
  • 在 Droplet 上运行的 MySQL 服务器。 要安装 MySQL,请按照 如何在 CentOS 上安装 Linux、Apache、MySQL、PHP (LAMP) 堆栈的第 2 步操作。

第 1 步 — 安装 Mytop

让我们安装 mytop 所需的软件包。

首先,我们需要在服务器上安装 EPEL (Extra Packages for Enterprise Linux) yum 存储库。 EPEL 是一个 Fedora 特别兴趣小组,它为企业 Linux 创建、维护和管理一组高质量的开源附加软件包。 运行以下命令在您的服务器上安装和启用 EPEL 存储库:

在 CentOS 7 上:

sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm

在 CentOS 6 上:

sudo rpm -ivh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

在继续之前,请使用以下命令验证 EPEL 存储库已启用:

sudo yum repolist

如果启用,您将在输出中看到以下 repo:

epel/x86_64                                                            Extra Packages for Enterprise Linux 7 - x86_64

接下来,让我们使用 yum 插件 protectbase 保护基础包免受 EPEL 影响。

sudo yum install yum-plugin-protectbase.noarch -y

protectbase 插件的目的是保护某些 yum 存储库免受来自其他存储库的更新。 即使未受保护的存储库具有更高版本,受保护存储库中的软件包也不会被未受保护存储库中的软件包更新或覆盖。

现在我们准备安装 mytop 包。 运行以下命令来安装它:

sudo yum install mytop -y

这将安装 mytop 包及其所有依赖项,主要是 perl 模块。

第 2 步 — 配置 Mytop

在使用 mytop 之前,为 mytop 创建一个名为 .mytop 的自定义配置文件。 运行命令:

sudo nano /root/.mytop

并在文件中添加以下内容并保存退出。

/root/.mytop

host=localhost
db=mysql
delay=5
port=3306
socket=
batchmode=0
color=1
idle=1

当您直接以 root 身份运行 mytop 以及以非 root sudo 用户身份运行它前面的 sudo 命令时,将使用此配置文件。

您可以根据需要更改此配置文件。 例如,delay 选项指定显示刷新之间的时间量(以秒为单位)。 如果您希望每 3 秒刷新一次 mytop 显示,您可以使用 /root/.mytop 编辑文件

sudo nano /root/.mytop

并更改以下内容:

/root/.mytop

delay=3

idle 参数指定是否允许空闲(休眠)线程出现在 mytop 显示屏幕的列表中。 默认是显示空闲线程。 如果省略空闲线程,则默认排序顺序会颠倒,以便运行时间最长的查询出现在列表顶部。 如果您希望这样做,请编辑 /root/.mytop 文件并更改以下内容:

/root/.mytop

idle=0

您可以参考 mytop 的手册页以获取有关配置文件中所有参数的信息——它包含每个参数的描述。 要访问手册页,请使用以下命令:

man mytop

您可以键入 q 退出手册。

第 3 步 — 连接到 Mytop

在本节中,我们将讨论如何连接到 mytop 并使用它来查看 MySQL 查询。

Mytop 需要凭据才能访问数据库,可以通过提示、命令行提供或存储在配置文件中。 为了更好的安全性,我们将使用 mytop 的 --prompt 选项,每次都要求输入密码。 让我们使用以下命令连接到 mytop:

sudo mytop --prompt

并在提示符处输入 MySQL root 密码。 您还可以在 mytop 命令中使用多个命令行参数。 请参阅手册页以获取完整列表。 例如,如果你想使用不同的mysql用户如sammy连接到mytop,运行命令:

sudo mytop -u sammy --prompt

要仅连接和监视特定数据库,可以使用以下命令:

sudo mytop -d databasename --prompt

要退出 mytop 并返回您的 shell 提示符,请键入 q

第 4 步 — 查看和解释 Mytop 显示

在本节中,我们将了解如何解释 mytop 显示以及该工具提供的不同功能。

一旦我们使用 mytop --prompt 连接到 mytop,我们将被带到 线程视图 。 它将显示类似于:

Output of mytopMySQL on localhost (5.5.41-MariaDB)                    up 0+00:05:52 [01:33:15]
 Queries: 148  qps:    0 Slow:     0.0         Se/In/Up/De(%):    09/00/00/00 
             qps now:    2 Slow qps: 0.0  Threads:    6 (   5/   0) 67/00/00/00 
 Key Efficiency: 2.0%  Bps in/out:  14.7/320.7k   Now in/out: 192.5/731.8k

      Id      User         Host/IP         DB      Time    Cmd Query or State
       --      ----         -------         --      ----    --- ----------
        2      root       localhost      mysql         0  Query show full processlist                          
       16      root       localhost                    0  Sleep
       17      root       localhost     testdb         0  Query SELECT * FROM dept_emp
       18      root       localhost     testdb         0  Query SELECT * FROM dept_emp
       19      root       localhost     testdb         0  Query SELECT * FROM dept_emp
       20      root       localhost     testdb         0  Query SELECT * FROM dept_emp

如果您在另一个视图中,您可以通过键入 t 返回此视图。

上面的显示屏分为两部分。 前四行包含 标题 ,可以通过按 SHIFT-H 打开或关闭它。 标头包含有关您的 MySQL 服务器的摘要信息。

  • 第一行标识服务器的主机名和它正在运行的 MySQL 版本。 右侧以天+小时:分钟:秒格式显示 MySQL 服务器进程的正常运行时间以及当前时间。
  • 第二行显示服务器已处理的查询总数(在我们的示例中为 148 个)、平均每秒查询数、慢查询数以及选择、插入、更新和删除查询的百分比。
  • 第三行显示自上次 mytop 刷新以来的实时值。 mytop 的正常刷新(延迟)时间是 5 秒,因此如果在刷新后的最后 5 秒内运行了 100 个查询,那么 qps now 的数量将为 20。 第一个字段是每秒的查询数(qps now: 2)。 第二个值是每秒慢查询的数量。 Threads: 6 ( 5/ 0) 段表示总共有 6 个连接的线程,5 个处于活动状态(一个处于休眠状态),线程缓存中有 0 个线程。 第三行的最后一个字段显示查询百分比,与上一行一样,但自上次 mytop 刷新以来。
  • 第四行显示键缓冲区效率(从缓冲区而不是磁盘读取键的频率)以及 MySQL 发送和接收的字节数,包括整体和最后一个 mytop 周期。 Key Efficiency: 2.0% 显示 2% of 个键是从缓冲区读取的,而不是从磁盘读取的。 Bps in/out: 14.7/320.7k 显示,自启动以来,MySQL 平均入站流量为 14.7kbps,出站流量为 320.7kbps。 Now in/out 再次显示流量,但自上次 mytop 刷新以来。

显示的第二部分列出了当前 MySQL 线程,根据它们的空闲时间排序(空闲时间最少的优先)。 如果需要,您可以通过按 O 来反转排序顺序。 线程 id、用户名、用户连接的主机、用户连接的数据库、空闲时间的秒数、线程正在执行的命令(或线程的状态)以及查询的第一部分信息都显示在这里。 如果线程处于 Query 状态(即 Cmd 显示 Query) 然后下一列 Query or State 将显示正在运行的查询的第一部分。 如果命令状态为 SleepIdle,则 Query or State 列通常为空白。 在上面的示例输出中,id 为 2 的线程实际上是 mytop 运行 show processlist 查询以收集信息。 id 为 16 的线程正在休眠(不处理查询,但仍处于连接状态)。 id 为 17 的线程正在 testdb 数据库上运行 SELECT 查询。

现在我们已经了解了 mytop 的基本显示,我们将了解如何使用它来收集有关 MySQL 线程和查询的更多信息。 让我们看看下面的mytop显示:

[secondary_output Output of mytop]
MySQL on localhost (5.5.41-MariaDB)                    up 0+00:13:10 [23:54:45]
 Queries: 2.8k   qps:    4 Slow:    51.0         Se/In/Up/De(%):    45/00/00/00 
             qps now:   17 Slow qps: 0.0  Threads:   52 (  51/   0) 96/00/00/00 
 Key Efficiency: 100.0%  Bps in/out: 215.4/ 7.6M   Now in/out:  2.0k/16.2M

      Id      User         Host/IP         DB      Time    Cmd Query or State
       --      ----         -------         --      ----    --- ----------
       34      root       localhost     testdb         0  Query show full processlist
     1241      root       localhost                    1  Sleep
     1242      root       localhost     testdb         1  Query SELECT * FROM dept_emp
     1243      root       localhost     testdb         1  Query SELECT * FROM dept_emp
     1244      root       localhost     testdb         1  Query SELECT * FROM dept_emp
     1245      root       localhost     testdb         1  Query SELECT * FROM dept_emp
     1246      root       localhost     testdb         1  Query SELECT * FROM dept_emp
     1247      root       localhost     testdb         1  Query SELECT * FROM dept_emp

在上面显示的 mytop thread view(默认视图)中,查询被截断。 要查看整个查询,可以按 F,它会询问:

Full query for which thread id:

输入要查看的查询的线程 ID。 例如,输入 1244。 然后它将显示以下内容:

Thread 1244 was executing following query:

SELECT * FROM dept_emp WHERE ...

-- paused. press any key to resume or (e) to explain --

我们可以输入 e 来解释查询。 这将解释正在运行的查询,以便我们确定查询是否已优化。 EXPLAIN 是用于理解和优化麻烦的 MySQL 查询的最强大的工具之一。 例如:

EXPLAIN SELECT * FROM dept_emp:

*** row 1 ***
          table:  dept_emp
           type:  ALL
  possible_keys:  NULL
            key:  NULL
        key_len:  NULL
            ref:  NULL
           rows:  332289
          Extra:  NULL
-- paused. press any key to resume --

您可以按任意键退出此模式或键入 t 返回默认线程视图。

mytop 中另一个有用的视图是命令视图。 要访问命令视图,请键入 c。 它看起来类似于以下内容:

           Command      Total  Pct  |  Last  Pct
           -------      -----  ---  |  ----  ---
            select       1782  55%  |   100   8%
       show status        723  22%  |   533  45%
  show processlist        708  22%  |   532  45%
         change db          2   0%  |     0   0%
    show variables          1   0%  |     0   0%
       Compression          0   0%  |     0   0%

Command 列显示正在运行的命令或查询的类型。 Total 列代表自服务器启动以来该类型命令运行的总数,Pct 列显示相同的百分比。 在垂直线的另一边,我们有 Last 列,它告诉我们自上次刷新 mytop 以来该类型命令的运行次数。 这些信息让我们深入了解 MySQL 服务器在短期和长期内正在做什么。

我们在本教程中讨论了 mytop 的一些重要且有用的特性。 还有很多其他可用的。 要查看完整的选项列表,您可以在 mytop 运行时按 ? 键。

结论

您现在应该对如何使用 mytop 监控您的 MySQL 服务器有了很好的理解。 它也是查找问题 SQL 查询并对其进行优化的起点,从而提高服务器的整体性能。 您可以在 本教程 中获得有关如何优化服务器上的 MySQL 查询和表的更多信息。