文档首页
MySQL 9.0 参考手册
相关文档 下载此手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  MySQL 性能模式  /  性能模式状态监控

29.7 性能模式状态监控

与性能模式关联的几个状态变量。

mysql> SHOW STATUS LIKE 'perf%';
+-----------------------------------------------+-------+
| Variable_name                                 | Value |
+-----------------------------------------------+-------+
| Performance_schema_accounts_lost              | 0     |
| Performance_schema_cond_classes_lost          | 0     |
| Performance_schema_cond_instances_lost        | 0     |
| Performance_schema_digest_lost                | 0     |
| Performance_schema_file_classes_lost          | 0     |
| Performance_schema_file_handles_lost          | 0     |
| Performance_schema_file_instances_lost        | 0     |
| Performance_schema_hosts_lost                 | 0     |
| Performance_schema_locker_lost                | 0     |
| Performance_schema_memory_classes_lost        | 0     |
| Performance_schema_metadata_lock_lost         | 0     |
| Performance_schema_mutex_classes_lost         | 0     |
| Performance_schema_mutex_instances_lost       | 0     |
| Performance_schema_nested_statement_lost      | 0     |
| Performance_schema_program_lost               | 0     |
| Performance_schema_rwlock_classes_lost        | 0     |
| Performance_schema_rwlock_instances_lost      | 0     |
| Performance_schema_session_connect_attrs_lost | 0     |
| Performance_schema_socket_classes_lost        | 0     |
| Performance_schema_socket_instances_lost      | 0     |
| Performance_schema_stage_classes_lost         | 0     |
| Performance_schema_statement_classes_lost     | 0     |
| Performance_schema_table_handles_lost         | 0     |
| Performance_schema_table_instances_lost       | 0     |
| Performance_schema_thread_classes_lost        | 0     |
| Performance_schema_thread_instances_lost      | 0     |
| Performance_schema_users_lost                 | 0     |
+-----------------------------------------------+-------+

性能模式状态变量提供有关由于内存限制而无法加载或创建的仪器化的信息。这些变量的名称有几种形式。

  • Performance_schema_xxx_classes_lost 指示类型为 xxx 的仪器有多少个无法加载。

  • Performance_schema_xxx_instances_lost 指示对象类型为 xxx 的实例有多少个无法创建。

  • Performance_schema_xxx_handles_lost 指示对象类型为 xxx 的实例有多少个无法打开。

  • Performance_schema_locker_lost 指示有多少个事件是丢失的 或未记录的。

例如,如果服务器源代码中对互斥锁进行了仪器化,但服务器在运行时无法为仪器化分配内存,它会增加 Performance_schema_mutex_classes_lost。互斥锁仍然用作同步对象(即服务器继续正常运行),但不会收集它的性能数据。如果可以分配仪器,则可以使用它来初始化已仪器化的互斥锁实例。对于全局互斥锁之类的单例互斥锁,只有一个实例。其他互斥锁每个连接有一个实例,或者在各种缓存和数据缓冲区中每个页面一个实例,因此实例的数量会随着时间的推移而变化。增加最大连接数或某些缓冲区的大小会增加可能一次分配的最大实例数。如果服务器无法创建一个给定的已仪器化的互斥锁实例,它会增加 Performance_schema_mutex_instances_lost

假设以下条件成立

  • 服务器使用 --performance_schema_max_mutex_classes=200 选项启动,因此有 200 个互斥锁仪器空间。

  • 已经加载了 150 个互斥锁仪器。

  • 名为 plugin_a 的插件包含 40 个互斥锁仪器。

  • 名为 plugin_b 的插件包含 20 个互斥锁仪器。

服务器根据插件需要多少个仪器以及有多少个可用仪器来为插件分配互斥锁仪器,如下面的语句序列所示

INSTALL PLUGIN plugin_a

服务器现在有 150+40 = 190 个互斥锁仪器。

UNINSTALL PLUGIN plugin_a;

服务器仍然有 190 个仪器。插件代码生成的全部历史数据仍然可用,但不会收集仪器的新的事件。

INSTALL PLUGIN plugin_a;

服务器检测到 40 个仪器已经定义,因此不会创建新的仪器,并且以前分配的内部内存缓冲区会重复使用。服务器仍然有 190 个仪器。

INSTALL PLUGIN plugin_b;

服务器有 200-190 = 10 个仪器空间(在本例中为互斥锁类),并且看到插件包含 20 个新的仪器。加载了 10 个仪器,并丢弃或丢失了 10 个。 Performance_schema_mutex_classes_lost 指示丢失的仪器(互斥锁类)的数量

mysql> SHOW STATUS LIKE "perf%mutex_classes_lost";
+---------------------------------------+-------+
| Variable_name                         | Value |
+---------------------------------------+-------+
| Performance_schema_mutex_classes_lost | 10    |
+---------------------------------------+-------+
1 row in set (0.10 sec)

仪器仍然有效,并为 plugin_b 收集(部分)数据。

当服务器无法创建互斥锁仪器时,会出现以下结果

刚描述的模式适用于所有类型的仪器,而不仅仅是互斥锁。

Performance_schema_mutex_classes_lost 的值大于 0 时,可能发生两种情况:

  • 为了节省一些内存,您可以使用 --performance_schema_max_mutex_classes=N 启动服务器,其中 N 小于默认值。默认值被选择为足以加载 MySQL 发行版中提供的所有插件,但如果一些插件从未加载,则可以减少该值。例如,您可能选择不加载发行版中的一些存储引擎。

  • 您加载一个为 Performance Schema 进行了检测的第三方插件,但在启动服务器时未考虑插件的检测内存需求。由于它是来自第三方,因此该引擎的检测内存消耗在为 performance_schema_max_mutex_classes 选择的默认值中未被考虑在内。

    如果服务器没有足够的资源用于插件的检测,并且您没有使用 --performance_schema_max_mutex_classes=N 显式分配更多资源,加载插件会导致检测资源匮乏。

如果为 performance_schema_max_mutex_classes 选择的值太小,则不会在错误日志中报告任何错误,并且在运行时不会出现任何故障。但是,performance_schema 数据库中的表内容会遗漏事件。Performance_schema_mutex_classes_lost 状态变量是唯一可见的标志,用于指示由于无法创建检测器而导致一些事件在内部被丢弃。

如果检测器没有丢失,则 Performance Schema 知道它,并在检测实例时使用它。例如,wait/synch/mutex/sql/LOCK_deletesetup_instruments 表中一个互斥检测器的名称。此单个检测器在代码中创建互斥锁时使用(在 THD::LOCK_delete 中),但是随着服务器运行,需要互斥锁的许多实例。在本例中,LOCK_delete 是一个每个连接的互斥锁 (THD),因此如果服务器有 1000 个连接,则有 1000 个线程和 1000 个已检测的 LOCK_delete 互斥锁实例 (THD::LOCK_delete)。

如果服务器没有足够的内存来容纳这 1000 个已检测的互斥锁(实例),则一些互斥锁会使用检测创建,而另一些则不使用检测创建。如果服务器只能创建 800 个实例,则会丢失 200 个实例。服务器将继续运行,但会将 Performance_schema_mutex_instances_lost 增加 200,以指示无法创建实例。

当代码在运行时初始化的互斥锁数量超过为 --performance_schema_max_mutex_instances=N 分配的数量时,Performance_schema_mutex_instances_lost 的值大于 0。

底线是,如果 SHOW STATUS LIKE 'perf%' 显示没有任何丢失(所有值均为零),则 Performance Schema 数据是准确的,可以依赖。如果丢失了某些数据,则数据是不完整的,Performance Schema 无法记录所有内容,因为分配给它使用的内存量不足。在这种情况下,具体的 Performance_schema_xxx_lost 变量指示了问题区域。

在某些情况下,故意导致检测器资源匮乏可能是合适的。例如,如果您不关心文件 I/O 的性能数据,您可以使用所有与文件 I/O 相关的 Performance Schema 参数设置为 0 来启动服务器。不会为与文件相关的类、实例或句柄分配内存,并且所有文件事件都会丢失。

使用 SHOW ENGINE PERFORMANCE_SCHEMA STATUS 检查 Performance Schema 代码的内部操作。

mysql> SHOW ENGINE PERFORMANCE_SCHEMA STATUS\G
...
*************************** 3. row ***************************
  Type: performance_schema
  Name: events_waits_history.size
Status: 76
*************************** 4. row ***************************
  Type: performance_schema
  Name: events_waits_history.count
Status: 10000
*************************** 5. row ***************************
  Type: performance_schema
  Name: events_waits_history.memory
Status: 760000
...
*************************** 57. row ***************************
  Type: performance_schema
  Name: performance_schema.memory
Status: 26459600
...

此语句旨在帮助 DBA 了解不同的 Performance Schema 选项对内存需求的影响。有关字段含义的描述,请参见 第 15.7.7.16 节“SHOW ENGINE 语句”