#### 27.12.20.10 内存汇总表

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

Performance Schema 检测内存使用情况并汇总内存使用情况统计信息，按以下因素详细说明：

-   使用的内存类型（各种缓存、内部缓冲区等）

-   线程、账户、用户、主机间接执行内存操作

    性能模式检测内存使用的以下方面

-   使用的内存大小

-   操作计数

-   低水位线和高水位线

    内存大小有助于了解或调整服务器的内存消耗。

    操作计数有助于了解或调整服务器对内存分配器施加的整体压力，这会对性能产生影响。分配单个字节一百万次与分配一百万次字节不同；跟踪大小和计数可以揭示差异。

    低水位线和高水位线对于检测工作负载峰值、整体工作负载稳定性和可能的​​内存泄漏至关重要。

    内存汇总表不包含计时信息，因为内存事件没有计时。

    有关收集内存使用数据的信息，请参阅[内存检测行为](performance-schema-memory-summary-tables.html#memory-instrumentation-behavior).

    内存事件摘要信息示例：


```
mysql> SELECT *
       FROM performance_schema.memory_summary_global_by_event_name
       WHERE EVENT_NAME = 'memory/sql/TABLE'\G
*************************** 1. row ***************************
                  EVENT_NAME: memory/sql/TABLE
                 COUNT_ALLOC: 1381
                  COUNT_FREE: 924
   SUM_NUMBER_OF_BYTES_ALLOC: 2059873
    SUM_NUMBER_OF_BYTES_FREE: 1407432
              LOW_COUNT_USED: 0
          CURRENT_COUNT_USED: 457
             HIGH_COUNT_USED: 461
    LOW_NUMBER_OF_BYTES_USED: 0
CURRENT_NUMBER_OF_BYTES_USED: 652441
   HIGH_NUMBER_OF_BYTES_USED: 669269
```

每个内存汇总表都有一个或多个分组列来指示该表如何聚合事件。事件名称是指事件工具的名称[`setup_instruments`](performance-schema-setup-instruments-table.html)桌子：

-   [`memory_summary_by_account_by_event_name`](performance-schema-memory-summary-tables.html)已`用户`,`主持人`， 和`EVENT_NAME`列。每行汇总给定帐户（用户和主机组合）和事件名称的事件。

-   [`memory_summary_by_host_by_event_name`](performance-schema-memory-summary-tables.html)已`主持人`和`EVENT_NAME`列。每行汇总给定主机和事件名称的事件。

-   [`memory_summary_by_thread_by_event_name`](performance-schema-memory-summary-tables.html)已`THREAD_ID`和`EVENT_NAME`列。每行总结给定线程和事件名称的事件。

-   [`memory_summary_by_user_by_event_name`](performance-schema-memory-summary-tables.html)已`用户`和`EVENT_NAME`列。每行汇总给定用户和事件名称的事件。

-   [`memory_summary_global_by_event_name`](performance-schema-memory-summary-tables.html)有一个`EVENT_NAME`柱子。每行汇总给定事件名称的事件。

    每个内存汇总表都有这些汇总列，其中包含汇总值：

-   `COUNT_ALLOC`,`COUNT_FREE`

    对内存分配和无内存函数的调用总数。

-   `SUM_NUMBER_OF_BYTES_ALLOC`,`SUM_NUMBER_OF_BYTES_FREE`

    已分配和已释放内存块的聚合大小。

-   `CURRENT_COUNT_USED`

    当前分配的尚未释放的块的总数。这是一个方便列，等于`COUNT_ALLOC`-`COUNT_FREE`.

-   `CURRENT_NUMBER_OF_BYTES_USED`

    当前分配的尚未释放的内存块的聚合大小。这是一个方便列，等于`SUM_NUMBER_OF_BYTES_ALLOC`-`SUM_NUMBER_OF_BYTES_FREE`.

-   `LOW_COUNT_USED`,`HIGH_COUNT_USED`

    对应的低水位线和高水位线`CURRENT_COUNT_USED`柱子。

-   `LOW_NUMBER_OF_BYTES_USED`,`HIGH_NUMBER_OF_BYTES_USED`

    对应的低水位线和高水位线`CURRENT_NUMBER_OF_BYTES_USED`柱子。

    内存汇总表具有以下索引：

-   [`memory_summary_by_account_by_event_name`](performance-schema-memory-summary-tables.html)：

    -   主键打开 (`用户`,`主持人`,`EVENT_NAME`)

-   [`memory_summary_by_host_by_event_name`](performance-schema-memory-summary-tables.html)：

    -   主键打开 (`主持人`,`EVENT_NAME`)

-   [`memory_summary_by_thread_by_event_name`](performance-schema-memory-summary-tables.html)：

    -   主键打开 (`THREAD_ID`,`EVENT_NAME`)

-   [`memory_summary_by_user_by_event_name`](performance-schema-memory-summary-tables.html)：

    -   主键打开 (`用户`,`EVENT_NAME`)

-   [`memory_summary_global_by_event_name`](performance-schema-memory-summary-tables.html)：

    -   主键打开 (`EVENT_NAME`)

[`截断表`](truncate-table.html)允许用于内存汇总表。它有以下效果：

-   通常，截断会重置统计基线，但不会更改服务器状态。也就是说，截断内存表不会释放内存。

-   `COUNT_ALLOC`和`COUNT_FREE`通过将每个计数器减少相同的值，将其重置为新基线。

-   同样地，`SUM_NUMBER_OF_BYTES_ALLOC`和`SUM_NUMBER_OF_BYTES_FREE`被重置为新的基线。

-   `LOW_COUNT_USED`和`HIGH_COUNT_USED`被重置为`CURRENT_COUNT_USED`.

-   `LOW_NUMBER_OF_BYTES_USED`和`HIGH_NUMBER_OF_BYTES_USED`被重置为`CURRENT_NUMBER_OF_BYTES_USED`.

    此外，每个按帐户、主机、用户或线程聚合的内存汇总表都会通过截断它所依赖的连接表或截断[`memory_summary_global_by_event_name`](performance-schema-memory-summary-tables.html).有关详细信息，请参阅[第 27.12.8 节，“性能模式连接表”](performance-schema-connection-tables.html).

##### 内存检测行为

记忆工具列在[`setup_instruments`](performance-schema-setup-instruments-table.html)表格并具有表格名称`记忆/*`代码区域`*/*`仪器名称`*`.默认情况下启用内存检测。

以前缀命名的乐器`内存/performance_schema/`公开在性能模式本身中为内部缓冲区分配了多少内存。这`内存/performance_schema/`仪器是内置的，始终启用，并且不能在启动或运行时禁用。内置内存仪器仅显示在[`memory_summary_global_by_event_name`](performance-schema-memory-summary-tables.html)桌子。

要在服务器启动时控制内存检测状态，请在您的`我的.cnf`文件：

-   使能够：

    ```
    [mysqld]
    performance-schema-instrument='memory/%=ON'
    ```

-   禁用：

    ```
    [mysqld]
    performance-schema-instrument='memory/%=OFF'
    ```

    要在运行时控制内存检测状态，请更新`已启用`相关文书的栏目[`setup_instruments`](performance-schema-setup-instruments-table.html)桌子：

-   使能够：

    ```
    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'YES'
    WHERE NAME LIKE 'memory/%';
    ```

-   禁用：

    ```
    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'NO'
    WHERE NAME LIKE 'memory/%';
    ```

    对于记忆仪器，`定时`列在[`setup_instruments`](performance-schema-setup-instruments-table.html)被忽略，因为内存操作没有计时。

    当服务器中的线程执行已检测的内存分配时，以下规则适用：

-   如果未检测线程或未启用内存检测，则不会检测分配的内存块。

-   否则（即线程和仪器都启用），分配的内存块被检测。

    对于解除分配，这些规则适用：

-   如果检测了内存分配操作，则检测相应的空闲操作，而不管当前的检测或线程启用状态如何。

-   如果未检测内存分配操作，则不会检测相应的空闲操作，无论当前检测或线程启用状态如何。

    对于每个线程的统计信息，以下规则适用。

    当检测到大小的内存块时*`ñ`*分配后，Performance Schema 对内存汇总表列进行以下更新：

-   `COUNT_ALLOC`: 增加 1

-   `CURRENT_COUNT_USED`: 增加 1

-   `HIGH_COUNT_USED`: 如果增加`CURRENT_COUNT_USED`是一个新的最大值

-   `SUM_NUMBER_OF_BYTES_ALLOC`： 被...所提升*`ñ`*

-   `CURRENT_NUMBER_OF_BYTES_USED`： 被...所提升*`ñ`*

-   `HIGH_NUMBER_OF_BYTES_USED`: 如果增加`CURRENT_NUMBER_OF_BYTES_USED`是一个新的最大值

    当一个检测的内存块被释放时，性能模式对内存摘要表列进行以下更新：

-   `COUNT_FREE`: 增加 1

-   `CURRENT_COUNT_USED`: 减少 1

-   `LOW_COUNT_USED`: 如果减少`CURRENT_COUNT_USED`是一个新的最小值

-   `SUM_NUMBER_OF_BYTES_FREE`： 被...所提升*`ñ`*

-   `CURRENT_NUMBER_OF_BYTES_USED`: 减少*`ñ`*

-   `LOW_NUMBER_OF_BYTES_USED`: 如果减少`CURRENT_NUMBER_OF_BYTES_USED`是一个新的最小值

    对于更高级别的聚合（全局、按帐户、按用户、按主机），同样的规则适用于低水位线和高水位线的预期。

-   `LOW_COUNT_USED`和`LOW_NUMBER_OF_BYTES_USED`是较低的估计。Performance Schema 报告的值保证小于或等于运行时有效使用的内存的最低计数或大小。

-   `HIGH_COUNT_USED`和`HIGH_NUMBER_OF_BYTES_USED`是更高的估计。Performance Schema 报告的值保证大于或等于运行时有效使用的内存的最高计数或大小。

    对于汇总表中的较低估计值，除[`memory_summary_global_by_event_name`](performance-schema-memory-summary-tables.html)，如果内存所有权在线程之间转移，则值可能会变为负数。

    这是估计计算的示例；但请注意，估计实施可能会发生变化：

    线程 1 在执行期间使用了 1MB 到 2MB 范围内的内存，如`LOW_NUMBER_OF_BYTES_USED`和`HIGH_NUMBER_OF_BYTES_USED`的列[`memory_summary_by_thread_by_event_name`](performance-schema-memory-summary-tables.html)桌子。

    线程 2 在执行期间使用了 10MB 到 12MB 范围内的内存，据报道同样如此。

    当这两个线程属于同一个用户帐户时，每个帐户的摘要估计该帐户使用的内存在 11MB 到 14MB 的范围内。那就是`LOW_NUMBER_OF_BYTES_USED`对于更高级别的聚合是每个的总和`LOW_NUMBER_OF_BYTES_USED`（假设最坏的情况）。同样，`HIGH_NUMBER_OF_BYTES_USED`对于更高级别的聚合是每个的总和`HIGH_NUMBER_OF_BYTES_USED`（假设最坏的情况）。

    11MB 是一个较低的估计值，只有当两个线程同时达到低使用率标记时才会出现。

    14MB 是一个更高的估计值，只有当两个线程同时达到高使用标记时才会出现。

    此帐户的实际内存使用量可能在 11.5MB 到 13.5MB 之间。

    对于容量规划，报告最坏情况实际上是期望的行为，因为它显示了当会话不相关时可能发生的情况，这通常是这种情况。
