Documentation Home

27.12.20.10 内存汇总表

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_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

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

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. 有关详细信息,请参阅 第 27.12.8 节,“性能模式连接表”

内存检测行为

表中列出了记忆工具, setup_instruments并具有表格的名称 。默认情况下启用内存检测。 memory/code_area/instrument_name

以前缀命名的仪器 memory/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'

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

  • 使能够:

    UPDATE performance_schema.setup_instruments
    SET ENABLED = 'YES'
    WHERE NAME LIKE 'memory/%';
  • 禁用:

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

对于内存仪器,由于内存操作不定时 TIMED,因此忽略列。setup_instruments

当服务器中的线程执行已检测的内存分配时,将应用以下规则:

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

  • 否则(即同时启用线程和仪器),分配的内存块将被仪器化。

对于重新分配,这些规则适用:

  • 如果检测了内存分配操作,则检测相应的释放操作,而不管当前的检测或线程启用状态如何。

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

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

当分配 size 的检测内存块时 N,性能模式对内存摘要表列进行这些更新:

  • 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是新的最大值则 增加

当一个检测内存块被释放时,性能模式对内存摘要表列进行这些更新:

  • 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_USED并且 LOW_NUMBER_OF_BYTES_USED是较低的估计。性能模式报告的值保证小于或等于运行时有效使用的内存的最低计数或大小。

  • HIGH_COUNT_USED并且 HIGH_NUMBER_OF_BYTES_USED是更高的估计。性能模式报告的值保证大于或等于运行时有效使用的内存的最高计数或大小。

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

这是估算计算的示例;但请注意,估计实施可能会发生变化:

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

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

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