与性能模式关联的几个状态变量。
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 进行了检测的第三方插件,但在启动服务器时未考虑插件的检测内存需求。由于它是来自第三方,因此该引擎的检测内存消耗在为
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_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_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 语句”。