25.12.15.9 内存摘要 table

性能架构可检测内存使用情况并汇总内存使用情况统计信息,这些统计信息按以下因素详细说明:

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

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

Performance Schema 记录了内存使用的以下方面

  • 使用的内存大小

  • Operation counts

  • 高低水位线

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

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

高低水位标记对于检测工作负载峰值,总体工作负载稳定性以及可能的内存泄漏至关重要。

内存摘要 table 不包含时序信息,因为内存事件未计时。

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

示例内存事件摘要信息:

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

每个内存摘要 table 都有一个或多个分组列,以指示该 table 如何聚合事件。事件名称是指setup_instrumentstable 中事件工具的名称:

每个内存摘要 table 的以下摘要列均包含汇总值:

  • 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列。

内存摘要 table 允许TRUNCATE TABLE。它具有以下效果:

  • 通常,截断会重置统计信息的基准,但不会更改服务器状态。也就是说,截断内存 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

此外,由帐户,主机,用户或线程聚合的每个内存摘要 table 都将通过其所依赖的连接 table 的截断或memory_summary_global_by_event_name的截断而隐式地截断。有关详细信息,请参见第 25.12.8 节“性能架构连接 table”

内存检测行为

内存工具列在setup_instrumentstable 中,并且名称的形式为memory/code_area/instrument_name。默认情况下,大多数内存检测都是禁用的。

以前缀memory/performance_schema/命名的工具会公开为性能架构本身的内部缓冲区分配了多少内存。 memory/performance_schema/仪器是内置的,始终启用,并且无法在启动或运行时禁用。内置存储工具仅显示在memory_summary_global_by_event_nametable 中。

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

  • Enable:
[mysqld]
performance-schema-instrument='memory/%=ON'
  • Disable:
[mysqld]
performance-schema-instrument='memory/%=OFF'

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

  • Enable:
UPDATE performance_schema.setup_instruments
SET ENABLED = 'YES'
WHERE NAME LIKE 'memory/%';
  • Disable:
UPDATE performance_schema.setup_instruments
SET ENABLED = 'NO'
WHERE NAME LIKE 'memory/%';

对于存储工具,由于未定时存储操作,因此会忽略setup_instruments中的TIMED列。

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

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

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

对于释放,这些规则适用:

  • 如果已检测到内存分配操作,则将检测到相应的空闲操作,而与当前仪器或线程启用状态无关。

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

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

分配大小为* N *的已检测内存块时,性能架构将对内存摘要 table 列进行以下更新:

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

释放已分配的内存块后,性能架构将对内存摘要 table 列进行以下更新:

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

  • HIGH_COUNT_USEDHIGH_NUMBER_OF_BYTES_USED是较高的估算值。性能架构报告的值保证大于或等于运行时有效使用的最大内存数或最大容量。

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

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

memory_summary_by_thread_by_event_nametable 的LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED列报告,线程 1 在执行期间使用的内存范围为 1MB 到 2MB。

线程 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的总和(假设最坏的情况)。

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

14 MB 是更高的估计,只有当两个线程同时达到高使用率标记时才会发生。

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

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