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
表中事件工具的名称:
memory_summary_by_account_by_event_name
有USER
、HOST
和EVENT_NAME
列。每行汇总了给定帐户(用户和主机组合)的事件和事件名称。memory_summary_by_host_by_event_name
有HOST
和EVENT_NAME
列。每行总结了给定主机和事件名称的事件。memory_summary_by_thread_by_event_name
有THREAD_ID
和EVENT_NAME
列。每行汇总了给定线程和事件名称的事件。memory_summary_by_user_by_event_name
有USER
和EVENT_NAME
列。每行汇总了给定用户和事件名称的事件。memory_summary_global_by_event_name
有一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
:USER
( ,HOST
,EVENT_NAME
) 上的主键
memory_summary_by_host_by_event_name
:HOST
( ,EVENT_NAME
) 上的主键
memory_summary_by_thread_by_event_name
:THREAD_ID
( ,EVENT_NAME
) 上的主键
memory_summary_by_user_by_event_name
:USER
( ,EVENT_NAME
) 上的主键
memory_summary_global_by_event_name
:EVENT_NAME
( ) 上的主键
TRUNCATE TABLE
允许用于内存汇总表。它具有以下效果:
通常,截断会重置统计基线,但不会更改服务器状态。也就是说,截断内存表不会释放内存。
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
. 有关详细信息,请参阅
第 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
: 增加 1CURRENT_COUNT_USED
: 增加 1HIGH_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
: 增加 1CURRENT_COUNT_USED
: 减少 1LOW_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_USED
和
HIGH_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 之间。
对于容量规划,报告最坏情况实际上是所需的行为,因为它显示了会话不相关时可能发生的情况,这通常是这种情况。