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
表中事件检测器的名称
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
来隐式截断。有关详细信息,请参见 第 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
:增加 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
是新的最大值,则增加
当释放已检测的内存块时,Performance Schema 会对内存摘要表列进行以下更新
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
是较低的估计值。Performance Schema 报告的值保证小于或等于运行时实际使用的最低计数或内存大小。HIGH_COUNT_USED
和HIGH_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_USED
和 HIGH_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 之间。
对于容量规划,报告最坏情况实际上是期望的行为,因为它显示了当会话不相关时可能发生的情况,这种情况通常是这种情况。