文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


29.12.20.10 内存摘要表

Performance Schema 检测内存使用情况并汇总内存使用统计信息,并按以下因素进行详细划分

  • 使用的内存类型(各种缓存、内部缓冲区等)

  • 线程、帐户、用户、主机间接执行内存操作

Performance Schema 检测内存使用的以下方面

  • 使用的内存大小

  • 操作计数

  • 低水位和高水位

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

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

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

内存摘要表不包含计时信息,因为内存事件没有计时。

有关收集内存使用数据的更多信息,请参见 内存检测行为

示例内存事件摘要信息

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 表中事件检测器的名称

每个内存摘要表都包含这些包含汇总值的摘要列

  • COUNT_ALLOCCOUNT_FREE

    对内存分配函数和内存释放函数的调用次数的汇总值。

  • SUM_NUMBER_OF_BYTES_ALLOCSUM_NUMBER_OF_BYTES_FREE

    已分配和已释放内存块的汇总大小。

  • CURRENT_COUNT_USED

    当前已分配但尚未释放的块的汇总数量。这是一个方便的列,等于 COUNT_ALLOCCOUNT_FREE

  • CURRENT_NUMBER_OF_BYTES_USED

    当前已分配但尚未释放的内存块的汇总大小。这是一个方便的列,等于 SUM_NUMBER_OF_BYTES_ALLOCSUM_NUMBER_OF_BYTES_FREE

  • LOW_COUNT_USEDHIGH_COUNT_USED

    CURRENT_COUNT_USED 列相对应的低水位和高水位。

  • LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED

    CURRENT_NUMBER_OF_BYTES_USED 列相对应的低水位和高水位。

内存摘要表具有以下索引

TRUNCATE TABLE 允许用于内存摘要表。它具有以下效果

  • 一般来说,截断会重置统计信息的基线,但不会更改服务器状态。也就是说,截断内存表不会释放内存。

  • COUNT_ALLOCCOUNT_FREE 会重置为新的基线,方法是将每个计数器减少相同的值。

  • 同样,SUM_NUMBER_OF_BYTES_ALLOCSUM_NUMBER_OF_BYTES_FREE 会重置为新的基线。

  • LOW_COUNT_USEDHIGH_COUNT_USED 会重置为 CURRENT_COUNT_USED

  • LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED 会重置为 CURRENT_NUMBER_OF_BYTES_USED

此外,每个按帐户、主机、用户或线程聚合的内存摘要表都将通过截断其依赖的连接表或截断 memory_summary_global_by_event_name 来隐式截断。有关详细信息,请参见 第 29.12.8 节“Performance Schema 连接表”

内存检测行为

内存检测工具列在 setup_instruments 表中,并且具有 memory/code_area/instrument_name 形式的名称。默认情况下,内存检测处于启用状态。

memory/performance_schema/ 为前缀的检测工具会公开在 Performance Schema 本身中为内部缓冲区分配了多少内存。 memory/performance_schema/ 检测工具是内置的,始终处于启用状态,并且无法在启动时或运行时禁用。内置内存检测工具仅在 memory_summary_global_by_event_name 表中显示。

要在服务器启动时控制内存检测状态,请在您的 my.cnf 文件中使用类似以下内容的行

  • 启用

    [mysqld]
    performance-schema-instrument='memory/%=ON'
  • 禁用

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

要在运行时控制内存检测状态,请更新 setup_instruments 表中相关检测工具的 ENABLED

  • 启用

    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 中的 TIMED 列将被忽略,因为内存操作不会计时。

当服务器中的线程执行已被检测的内存分配时,这些规则适用

  • 如果线程未被检测或内存检测工具未启用,则不会检测分配的内存块。

  • 否则(即线程和检测工具都已启用),则会检测分配的内存块。

对于释放,这些规则适用

  • 如果内存分配操作已被检测,则相应的释放操作将被检测,无论当前的检测工具或线程的启用状态如何。

  • 如果内存分配操作未被检测,则相应的释放操作将不会被检测,无论当前的检测工具或线程的启用状态如何。

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

当分配大小为 N 的已检测内存块时,Performance Schema 会对内存摘要表列进行以下更新

  • COUNT_ALLOC:增加 1

  • CURRENT_COUNT_USED:增加 1

  • HIGH_COUNT_USED:如果 CURRENT_COUNT_USED 是新的最大值,则增加

  • SUM_NUMBER_OF_BYTES_ALLOC:增加 N

  • CURRENT_NUMBER_OF_BYTES_USED:增加 N

  • HIGH_NUMBER_OF_BYTES_USED:如果 CURRENT_NUMBER_OF_BYTES_USED 是新的最大值,则增加

当释放已检测的内存块时,Performance Schema 会对内存摘要表列进行以下更新

  • COUNT_FREE:增加 1

  • CURRENT_COUNT_USED:减少 1

  • LOW_COUNT_USED:如果 CURRENT_COUNT_USED 是新的最小值,则减少

  • SUM_NUMBER_OF_BYTES_FREE:增加 N

  • CURRENT_NUMBER_OF_BYTES_USED:减少 N

  • LOW_NUMBER_OF_BYTES_USED:如果 CURRENT_NUMBER_OF_BYTES_USED 是新的最小值,则减少

对于更高级别的聚合(全局、按帐户、按用户、按主机),与预期一样,相同规则适用于低水位和高水位。

  • LOW_COUNT_USEDLOW_NUMBER_OF_BYTES_USED 是较低的估计值。Performance Schema 报告的值保证小于或等于运行时实际使用的最低计数或内存大小。

  • HIGH_COUNT_USEDHIGH_NUMBER_OF_BYTES_USED 是较高的估计值。Performance Schema 报告的值保证大于或等于运行时实际使用的最高计数或内存大小。

对于除 memory_summary_global_by_event_name 之外的摘要表中的较低估计值,如果内存所有权在线程之间转移,则值可能会变为负数。

以下是一个估计计算的示例;但请注意,估计实现可能会发生变化

线程 1 在执行过程中使用的内存范围为 1MB 到 2MB,如 memory_summary_by_thread_by_event_name 表的 LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED 列所报告的那样。

线程 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 之间。

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