## 27.17 性能模式内存分配模型

Performance Schema 使用这种内存分配模型：

-   可以在服务器启动时分配内存

-   在服务器操作期间可能会分配额外的内存

-   在服务器运行期间永远不要释放内存（尽管它可能会被回收）

-   释放关机时使用的所有内存

    结果是放宽了内存限制，从而可以使用更少的配置来使用性能模式，并减少内存占用，从而使消耗随服务器负载而扩展。使用的内存取决于实际看到的负载，而不是估计或明确配置的负载。

    几个 Performance Schema 大小调整参数是自动缩放的，不需要显式配置，除非您想对内存分配建立显式限制：


```
performance_schema_accounts_size
performance_schema_hosts_size
performance_schema_max_cond_instances
performance_schema_max_file_instances
performance_schema_max_index_stat
performance_schema_max_metadata_locks
performance_schema_max_mutex_instances
performance_schema_max_prepared_statements_instances
performance_schema_max_program_instances
performance_schema_max_rwlock_instances
performance_schema_max_socket_instances
performance_schema_max_table_handles
performance_schema_max_table_instances
performance_schema_max_table_lock_stat
performance_schema_max_thread_instances
performance_schema_users_size
```

对于自动缩放的参数，配置的工作方式如下：

-   将值设置为 -1（默认值）时，参数会自动缩放：

    -   相应的内部缓冲区最初是空的，并且没有分配内存。

    -   当 Performance Schema 收集数据时，内存被分配到相应的缓冲区中。缓冲区大小是无限的，并且可能会随着负载而增长。

-   将值设置为 0：

    -   相应的内部缓冲区最初是空的，并且没有分配内存。

-   将值设置为*`ñ`* >0：

    -   相应的内部缓冲区最初是空的，并且没有分配内存。

    -   随着 Performance Schema 收集数据，内存被分配到相应的缓冲区中，直到缓冲区大小达到*`ñ`*.

    -   一旦缓冲区大小达到*`ñ`*，不再分配内存。性能模式为此缓冲区收集的数据会丢失，并且任何相应的“丢失实例”计数器都会增加。

    要查看 Performance Schema 使用了多少内存，请检查为此目的设计的工具。Performance Schema 在内部分配内存并将每个缓冲区与专用仪器相关联，以便可以将内存消耗跟踪到各个缓冲区。以前缀命名的乐器`内存/performance_schema/`公开为这些内部缓冲区分配了多少内存。缓冲区对服务器来说是全局的，所以仪器只显示在[`memory_summary_global_by_event_name`](performance-schema-memory-summary-tables.html)表，而不是其他`memory_summary_by_*`xxx`*_by_event_name`表。

    此查询显示与记忆工具相关的信息：


```
SELECT * FROM performance_schema.memory_summary_global_by_event_name
WHERE EVENT_NAME LIKE 'memory/performance_schema/%';
```
