• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 内存摘要表

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

    • 使用的内存类型(各种缓存,内部缓冲区等)
    • 线程,帐户,用户,主机间接执行内存操作

    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_nameUSERHOSTEVENT_NAME列。每行总结了给定帐户(用户和主机组合)的事件和事件名称。
    • memory_summary_by_host_by_event_nameHOSTEVENT_NAME列。每行总结了给定主机和事件名称的事件。
    • memory_summary_by_thread_by_event_nameTHREAD_IDEVENT_NAME列。每行总结了给定线程和事件名称的事件。
    • memory_summary_by_user_by_event_nameUSEREVENT_NAME列。每行总结了给定用户和事件名称的事件。
    • memory_summary_global_by_event_nameEVENT_NAME专栏。每行总结了给定事件名称的事件。

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

    • COUNT_ALLOCCOUNT_FREE

      调用内存分配和无内存功能的总次数。

    • SUM_NUMBER_OF_BYTES_ALLOCSUM_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_USEDHIGH_COUNT_USED

      高低水位线对应于该CURRENT_COUNT_USED列。

    • LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED

      高低水位线对应于该CURRENT_NUMBER_OF_BYTES_USED列。

    内存摘要表具有以下索引:

    • memory_summary_by_account_by_event_name

      • 在主键(USERHOSTEVENT_NAME
    • memory_summary_by_host_by_event_name

      • HOSTEVENT_NAME)上的主键
    • memory_summary_by_thread_by_event_name

      • THREAD_IDEVENT_NAME)上的主键
    • memory_summary_by_user_by_event_name

      • USEREVENT_NAME)上的主键
    • memory_summary_global_by_event_name

      • EVENT_NAME)上的主键

    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。有关详细信息,请参见“性能架构连接表”。

    内存检测行为

    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/%';
      

    对于存储仪器,由于未定时存储操作TIMEDsetup_instruments因此忽略了in列。

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

    • 如果未检测线程或未启用内存工具,则不会检测分配的内存块。
    • 否则(即,同时启用了线程和仪器),将检测分配的内存块。

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

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

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

    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值,如果在线程之间转移内存所有权,则值可能会变为负数。

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

    如表的LOW_NUMBER_OF_BYTES_USEDHIGH_NUMBER_OF_BYTES_USED列所示,线程1在执行期间使用的内存范围为1MB到2MB 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之间。

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