## 27.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 状态变量提供有关由于内存限制而无法加载或创建的检测的信息。这些变量的名称有几种形式：

-   `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-status-variables.html#statvar_Performance_schema_mutex_classes_lost)。互斥锁仍作为同步对象运行（即服务器继续正常运行），但不会收集其性能数据。如果可以分配该工具，则可以将其用于初始化插入工具的互斥实例。对于单例互斥体（如全局互斥体），只有一个实例。其他互斥锁在每个连接或每个页面的不同缓存和数据缓冲区中都有一个实例，因此实例的数量随时间而变化。增加连接的最大数量或某些缓冲区的最大大小会增加一次可以分配的实例的最大数量。如果服务器无法创建给定的插入指令的互斥实例，则会增加[`性能\u模式\u互斥\u实例\u丢失`](performance-schema-status-variables.html#statvar_Performance_schema_mutex_instances_lost).

    假设以下条件成立：

-   服务器是用[`--性能模式最大互斥类=200`](performance-schema-system-variables.html#sysvar_performance_schema_max_mutex_classes)选项，因此可容纳200个互斥乐器。

-   已经加载了150个互斥工具。

-   名为`插件a`包含40个互斥工具。

-   名为`插件`包含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-status-variables.html#statvar_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)
```

该仪器仍在工作，并收集（部分）数据用于`插件`.

当服务器无法创建互斥工具时，会出现以下结果：

-   没有将仪器的行插入到[`仪器设置`](performance-schema-setup-instruments-table.html)桌子

-   [`性能_模式_互斥_类_丢失`](performance-schema-status-variables.html#statvar_Performance_schema_mutex_classes_lost)增加1。

-   [`性能\u模式\u互斥\u实例\u丢失`](performance-schema-status-variables.html#statvar_Performance_schema_mutex_instances_lost)不会改变。（未创建互斥工具时，以后不能使用它创建已检测的互斥实例。）

    刚才描述的模式适用于所有类型的乐器，而不仅仅是互斥。

    价值[`性能_模式_互斥_类_丢失`](performance-schema-status-variables.html#statvar_Performance_schema_mutex_classes_lost)在两种情况下可能出现大于0的情况：

-   为了节省几个字节的内存，可以用[`--性能模式最大互斥类=*`N`*`](performance-schema-system-variables.html#sysvar_performance_schema_max_mutex_classes)哪里*`N`*小于默认值。默认值被选择为足以加载MySQL发行版中提供的所有插件，但如果某些插件从未加载，则可以减少该值。例如，您可能会选择不加载发行版中的某些存储引擎。

-   您加载的第三方插件是针对性能模式进行检测的，但在启动服务器时不考虑插件的检测内存需求。因为它来自第三方，所以选择的默认值中不考虑此发动机的仪表内存消耗[`性能模式最大互斥类`](performance-schema-system-variables.html#sysvar_performance_schema_max_mutex_classes).

    如果服务器没有足够的资源用于插件的工具，而您没有使用[`--性能模式最大互斥类=*`N`*`](performance-schema-system-variables.html#sysvar_performance_schema_max_mutex_classes)，加载插件会导致缺少仪器。

    如果为[`性能模式最大互斥类`](performance-schema-system-variables.html#sysvar_performance_schema_max_mutex_classes)太小，错误日志中没有报告错误，并且在运行时没有失败。然而，表中的内容`性能模式`数据库未命中事件。这个[`性能_模式_互斥_类_丢失`](performance-schema-status-variables.html#statvar_Performance_schema_mutex_classes_lost)状态变量是唯一可见的标志，指示由于无法创建仪器而在内部删除了某些事件。

    如果某个工具没有丢失，则性能模式会知道它，并在检测实例时使用它。例如`wait/synch/mutex/sql/LOCK_delete`中的互斥工具的名称[`仪器设置`](performance-schema-setup-instruments-table.html)桌子在代码中创建互斥时使用这个工具（在`THD：：锁_删除`)然而，在服务器运行时需要许多互斥实例。在这种情况下，`锁定删除`是每个连接的互斥锁(`THD`)，因此，如果一台服务器有1000个连接，那么就有1000个线程和1000个已检测的线程`锁定删除`互斥实例(`THD：：锁_删除`).

    如果服务器没有空间容纳所有这1000个插入指令的互斥体（实例），那么有些互斥体是通过插入指令创建的，有些互斥体是在没有插入指令的情况下创建的。如果服务器只能创建800个实例，则会丢失200个实例。服务器继续运行，但会增加[`性能\u模式\u互斥\u实例\u丢失`](performance-schema-status-variables.html#statvar_Performance_schema_mutex_instances_lost)以指示无法创建实例。

    价值[`性能\u模式\u互斥\u实例\u丢失`](performance-schema-status-variables.html#statvar_Performance_schema_mutex_instances_lost)当代码在运行时初始化的互斥量超过分配的互斥量时，可能会出现大于0的情况[`--性能\u模式\u最大\u互斥\u实例=*`N`*`](performance-schema-system-variables.html#sysvar_performance_schema_max_mutex_instances).

    底线是如果[`显示“性能%”之类的状态`](show-status.html)表示没有丢失任何内容（所有值均为零），性能模式数据准确可靠。如果有东西丢失了，那么数据就不完整，而且由于提供给它的内存不足，性能模式无法记录所有内容。在这种情况下，具体的`性能模式_*`xxx`*_迷失`变量表示问题区域。

    在某些情况下，故意造成仪器饥饿可能是合适的。例如，如果不关心文件I/O的性能数据，则可以在与文件I/O相关的所有性能模式参数设置为0的情况下启动服务器。没有为与文件相关的类、实例或句柄分配内存，所有文件事件都将丢失。

    使用[`显示引擎性能\u架构状态`](show-engine.html)要检查性能模式代码的内部操作：


```
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了解不同性能模式选项对内存需求的影响。有关字段含义的描述，请参阅[第13.7.7.15节，“显示引擎声明”](show-engine.html).
