与性能模式相关联的几个状态变量
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_lostxxx
的检测无法加载。Performance_schema_
指示有多少类型为xxx
_instances_lostxxx
的对象实例无法创建。Performance_schema_
指示有多少类型为xxx
_handles_lostxxx
的对象实例无法打开。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
收集(部分)数据。
当服务器无法创建互斥锁检测时,会发生以下结果
在
setup_instruments
表中没有插入检测的行。Performance_schema_mutex_instances_lost
没有变化。(当没有创建互斥锁检测时,它不能用于稍后创建检测到的互斥锁实例。)
刚刚描述的模式适用于所有类型的检测,而不仅仅是互斥锁。
Performance_schema_mutex_classes_lost
的值大于 0 会发生在两种情况下
为了节省一些内存,您可以使用
--performance_schema_max_mutex_classes=
启动服务器,其中N
N
小于默认值。默认值的选择足以加载 MySQL 发行版中提供的所有插件,但如果某些插件从未加载,则可以减少该值。例如,您可能选择不加载发行版中的一些存储引擎。您加载了一个针对性能架构进行检测的第三方插件,但在启动服务器时没有考虑该插件的检测内存需求。由于它来自第三方,因此该引擎的检测内存消耗没有在为
performance_schema_max_mutex_classes
选择的默认值中考虑。如果服务器没有足够的资源来满足该插件的检测需求,并且您没有使用
--performance_schema_max_mutex_classes=
明确分配更多资源,加载该插件会导致检测资源匮乏。N
如果为 performance_schema_max_mutex_classes
选择的值太小,错误日志中不会报告任何错误,并且运行时不会出现任何故障。但是,performance_schema
数据库中的表内容缺少事件。状态变量 Performance_schema_mutex_classes_lost
是唯一可见的迹象,表明由于无法创建检测器而导致内部丢弃了一些事件。
如果没有丢失检测器,则性能架构会知道它,并在检测实例时使用它。例如,wait/synch/mutex/sql/LOCK_delete
是 setup_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_mutex_instances_lost
的值大于 0,则可能是因为代码在运行时初始化的互斥体数量比为 --performance_schema_max_mutex_instances=
分配的要多。N
总之,如果 SHOW STATUS LIKE 'perf%'
表明没有丢失任何东西(所有值都为零),则性能架构数据是准确的,可以依赖它。如果丢失了一些东西,则数据不完整,并且鉴于性能架构被分配的可用内存不足,它无法记录所有内容。在这种情况下,特定的 Performance_schema_
变量指示问题区域。xxx
_lost
在某些情况下,故意造成检测器资源匮乏可能是合适的。例如,如果您不关心文件 I/O 的性能数据,则可以使用所有与文件 I/O 相关的性能架构参数设置为 0 启动服务器。不会为与文件相关的类、实例或句柄分配内存,并且所有文件事件都会丢失。
使用 SHOW ENGINE PERFORMANCE_SCHEMA STATUS
检查性能架构代码的内部操作
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 了解不同的性能架构选项对内存需求的影响。有关字段含义的描述,请参阅 第 15.7.7.16 节,“SHOW ENGINE 语句”。