zoukankan      html  css  js  c++  java
  • mysql 内存统计

    在 mysql 5.5 中实现了类似mysql5.7中performance schema 的内存统计功能。

    功能

      1 展示mysql层内存总大小。

      2 展示mysql层内存使用分布情况。

      3 展示每个线程使用的内存总大小。

      4 展示每个线程使用的内存分布情况。 

    演示

    1 增加状态变量Memory_used 显示mysql层总体使用的内存大小。

    mysql> show global status like 'Memory_used';
    +---------------+----------+
    | Variable_name | Value    |
    +---------------+----------+
    | Memory_used   | 30767584 |
    +---------------+----------+
    1 row in set (0.06 sec)

    2 show memory展示mysql层内存使用分布情况。

    mysql> show memory;
    +----------------------------------------------+-------------+
    | name                                         | memory_used |
    +----------------------------------------------+-------------+
    | libmysql/MYSQL_STMT:mem_root                 |           0 |
    | libmysql/MYSQL_STMT:result::alloc            |           0 |
    | sql/NET::buff                                |       16400 |
    | sql/Protocol_local::m_rset_root              |           0 |
    | sql/TABLE                                    |       58992 |
    | mysys/my_dir                                 |           0 |
    | sql/TABLE::sort.io_cache                     |           0 |
    | sql/THD::main_mem_root                       |           0 |
    | sql/THD::transaction::mem_root               |           0 |
    | sql/THD::debug_sync_control                  |           0 |
    | sql/debug_sync_control::debug_sync_action    |           0 |
    | sql/Filesort_info::addonbuf                  |           0 |
    | sql/Filesort_info::record_pointers           |           0 |
    | sql/SORTPARAM::tmp_buffer                    |           0 |
    | sql/SORT_ADDON_FIELD                         |           0 |
    | sql/user_var_entry                           |           0 |
    | mysys/IO_CACHE                               |       16400 |
    | mysys/TREE                                   |           0 |
    | mysys/DYNAMIC_ARRAY                          |      352136 |
    | sql/QUICK_RANGE_SELECT::alloc                |           0 |
    | sql/QUICK_INDEX_MERGE_SELECT::alloc          |           0 |
    | sql/QUICK_INDEX_MERGE_SELECT::alloc          |           0 |
    | sql/QUICK_ROR_INTERSECT_SELECT::alloc        |           0 |
    | sql/QUICK_ROR_UNION_SELECT::alloc            |           0 |
    | sql/QUICK_GROUP_MIN_MAX_SELECT::alloc        |           0 |
    | sql/SQL_SELECT::test_quick_select:alloc      |           0 |
    | sql/prune_partitions::exec                   |           0 |
    | sql/READ_RECORD::cache                       |           0 |
    | sql/table_mapping::m_mem_root                |           0 |
    | sql/Locked_tables_list::m_locked_tables_root |           0 |
    | sql/Warning_info::m_warn_root                |           0 |
    | sql/READ_INFO                                |           0 |
    | sql/Prepared_statement::main_mem_root        |           0 |
    | sql/JOIN_CACHE                               |           0 |
    | sql/TABLE_SHARE::mem_root                    |           0 |
    | sql/LOG_EVENT                                |           0 |
    | sql/QUICK_RANGE_SELECT::multi_range          |           0 |
    | sql/QUICK_RANGE_SELECT::multi_range_buff     |           0 |
    | sql/table_def                                |           0 |
    | sql/THD::handler_tables_hash                 |           0 |
    | sql/hash_index_key_buffer                    |           0 |
    | sql/ignore_db                                |           0 |
    | sql/sql_acl_mem                              |           0 |
    | sql/sql_acl_memx                             |           0 |
    | sql/servers                                  |           0 |
    | sql/MYSQL_LOCK                               |           0 |
    | sql/KEY_CACHE                                |        2456 |
    | sql/Unique::sort_buffer                      |           0 |
    | sql/Unique::merge_buffer                     |           0 |
    | sql/frm                                      |           0 |
    | sql/Query_cache                              |           0 |
    | sql/bision_stack                             |           0 |
    | sql/user_conn                                |          96 |
    | sql/THD::variables                           |           0 |
    | sql/global_system_variables                  |         144 |
    | sql/sercurity_context                        |          24 |
    | sql/sp_head::main_mem_root                   |           0 |
    | sql/sp_head::execute_mem_root                |           0 |
    | sql/sp_head::call_mem_root                   |           0 |
    +----------------------------------------------+-------------+
    59 rows in set (0.00 sec)

    3 show processlist增加了Memory_used列展现线程的内存使用(或者 show status like 'Memory_used';)

    mysql> show processlist;
    +----+------+-----------------+------+---------+------+-------+------------------+-----------+---------------+-----------+-------------+
    | Id | User | Host            | db   | Command | Time | State | Info             | Rows_sent | Rows_examined | Rows_read | Memory_used |
    +----+------+-----------------+------+---------+------+-------+------------------+-----------+---------------+-----------+-------------+
    |  1 | root | 127.0.0.1:45516 | NULL | Query   |    0 | NULL  | show processlist |         0 |             0 |         1 |       43552 |
    +----+------+-----------------+------+---------+------+-------+------------------+-----------+---------------+-----------+-------------+
    1 row in set (0.00 sec)

    4 新增information_schema.thread_memory_info表展现每个线程内存使用分布

    mysql> select * from  information_schema.thread_memory_info;
    +-----------+----------------------------------------------+-------------+
    | thread_id | type                                         | memory_used |
    +-----------+----------------------------------------------+-------------+
    |         1 | libmysql/MYSQL_STMT:mem_root                 |           0 |
    |         1 | libmysql/MYSQL_STMT:result::alloc            |           0 |
    |         1 | sql/NET::buff                                |       16400 |
    |         1 | sql/Protocol_local::m_rset_root              |           0 |
    |         1 | sql/TABLE                                    |           0 |
    |         1 | mysys/my_dir                                 |           0 |
    |         1 | sql/TABLE::sort.io_cache                     |           0 |
    |         1 | sql/THD::main_mem_root                       |           0 |
    |         1 | sql/THD::transaction::mem_root               |           0 |
    |         1 | sql/THD::debug_sync_control                  |           0 |
    |         1 | sql/debug_sync_control::debug_sync_action    |           0 |
    |         1 | sql/Filesort_info::addonbuf                  |           0 |
    |         1 | sql/Filesort_info::record_pointers           |           0 |
    |         1 | sql/SORTPARAM::tmp_buffer                    |           0 |
    |         1 | sql/SORT_ADDON_FIELD                         |           0 |
    |         1 | sql/user_var_entry                           |           0 |
    |         1 | mysys/IO_CACHE                               |           0 |
    |         1 | mysys/TREE                                   |           0 |
    |         1 | mysys/DYNAMIC_ARRAY                          |         264 |
    |         1 | sql/QUICK_RANGE_SELECT::alloc                |           0 |
    |         1 | sql/QUICK_INDEX_MERGE_SELECT::alloc          |           0 |
    |         1 | sql/QUICK_INDEX_MERGE_SELECT::alloc          |           0 |
    |         1 | sql/QUICK_ROR_INTERSECT_SELECT::alloc        |           0 |
    |         1 | sql/QUICK_ROR_UNION_SELECT::alloc            |           0 |
    |         1 | sql/QUICK_GROUP_MIN_MAX_SELECT::alloc        |           0 |
    |         1 | sql/SQL_SELECT::test_quick_select:alloc      |           0 |
    |         1 | sql/prune_partitions::exec                   |           0 |
    |         1 | sql/READ_RECORD::cache                       |           0 |
    |         1 | sql/table_mapping::m_mem_root                |           0 |
    |         1 | sql/Locked_tables_list::m_locked_tables_root |           0 |
    |         1 | sql/Warning_info::m_warn_root                |        1048 |
    |         1 | sql/READ_INFO                                |           0 |
    |         1 | sql/Prepared_statement::main_mem_root        |           0 |
    |         1 | sql/JOIN_CACHE                               |           0 |
    |         1 | sql/TABLE_SHARE::mem_root                    |           0 |
    |         1 | sql/LOG_EVENT                                |           0 |
    |         1 | sql/QUICK_RANGE_SELECT::multi_range          |           0 |
    |         1 | sql/QUICK_RANGE_SELECT::multi_range_buff     |           0 |
    |         1 | sql/table_def                                |           0 |
    |         1 | sql/THD::handler_tables_hash                 |           0 |
    |         1 | sql/hash_index_key_buffer                    |           0 |
    |         1 | sql/ignore_db                                |           0 |
    |         1 | sql/sql_acl_mem                              |           0 |
    |         1 | sql/sql_acl_memx                             |           0 |
    |         1 | sql/servers                                  |           0 |
    |         1 | sql/MYSQL_LOCK                               |           0 |
    |         1 | sql/KEY_CACHE                                |           0 |
    |         1 | sql/Unique::sort_buffer                      |           0 |
    |         1 | sql/Unique::merge_buffer                     |           0 |
    |         1 | sql/frm                                      |           0 |
    |         1 | sql/Query_cache                              |           0 |
    |         1 | sql/bision_stack                             |           0 |
    |         1 | sql/user_conn                                |           0 |
    |         1 | sql/THD::variables                           |           0 |
    |         1 | sql/global_system_variables                  |           0 |
    |         1 | sql/sercurity_context                        |           0 |
    |         1 | sql/sp_head::main_mem_root                   |           0 |
    |         1 | sql/sp_head::execute_mem_root                |           0 |
    |         1 | sql/sp_head::call_mem_root                   |           0 |
    +-----------+----------------------------------------------+-------------+
    59 rows in set (0.04 sec) 

    实现

      1 mysql层的封装的内存分配与释放的接口如下:

       my_malloc, my_realloc,my_free

       分别对应底层接口alloc,realloc,free.而calloc在mysql层没有调用过,这里可以忽略掉。

       内存统计实现的方法是在内存分配时增加计数统计,在内存释放是减少计数统计。

       为了实现内存的分类统计,内存的线程级别的监控。在内存分配时需要额外存储以下3条信息:

       1) 内存分配的大小,在内存释放时减少内存计数大小。

       2) 当前线程分配的内存是否是线程私有的,以区分公有内存,相对准确统计线程占用的内存大小。

       3) 内存的类别,实现的内存的分类统计。   

      2 内存额外信息的来源

       内存分配接口my_malloc, my_realloc都有参数my_flags用于存储一些标记信息。在这里上述的第2和3条信息都存储在my_flags中,在内存分配接口调用时指定。而第1条内存大小,原有接口就有。  

       1) 标示当前线程分配的内存是否是线程私有的。MY_THREAD_SPECIFIC标记是否是线程私有的线程,MY_THREAD_MOVE 标示内存是否在线程之间移动,只有在my_realloc时发生,目前这种情况还没有出现。

         MY_THREAD_SPECIFIC  0x10000

         MY_THREAD_MOVE      0x20000

       2) 内存的类别,由enum memory_stat_type 定义,从0开始至MST_END。

         为了将内存的类别存储在my_flags中,需要将类别值进行移位处理     

    #define SET_MEM_TYPE(v) ((v) << 18)

      3 内存额外信息的存储

        内存分配时额外分配MALLOC_PREFIX_SIZE大小的内存,用于存储内存额外信息,并且位于内存头部。    

    #define MALLOC_PREFIX_SIZE (sizeof(double))

        GET_MEM_FLAG从my_flags中取出第2和3条信息。    

    #define GET_MEM_FLAG(v) ((v) >> 16)

        MALLOC_STORE_SIZE将内存额外信息存储在内存头部ALLOC_PREFIX_SIZE大小的内存中。

        这样内存释放时可以从内存头部取出这3条信息,来减少相应的内存统计计数。     

      4 主要接口和数据结构    

        1)global_status_var.memory_used mysql层占用内存总大小

        2)show_mem_array  mysql层内存使用分类大小数组

        3) THD::status_var.memory_used 线程占用内存大小

        4)THD::mem_used  每个线程使用的内存分类大小数组

        5) my_malloc_size_cb_func  增加和减少内存统计计数总入口。 

        6) mysqld_list_memory: show memory 显示mysql层内存使用分类大小     

    兼容性

     information_schema.processlist 增加了一列MEMORY_USED

     新增information_schema.thread_memory_info表

     上述变动对升级没有影响。 

    参考

     mysql5.7 http://dev.mysql.com/doc/refman/5.7/en/memory-summary-tables.html

     mariadb https://mariadb.atlassian.net/browse/MDEV-4011  

    【附】

      1 目前内存分的类别还不完善,只列了一些主要的分类。

      2 虽然内存统计计数使用无锁算法,但还是会影响性能,待评估。

  • 相关阅读:
    199. Binary Tree Right Side View
    [leetcode]leetcode初体验
    [项目]WebService涉及到的部分核心代码
    设计模式之简单工厂模式Simple Factory(四创建型)
    博客园利用Word发布博客功能[其他博客也可以如此使用]
    设计模式之单例模式Singleton(三创建型)
    设计模式之代理模式(二结构型)
    设计模式之策略模式(一对象行为型)
    Enterprise Achitect使用与类的关系的简单介绍
    2016年1月15日面试某互联网公司总结(二)
  • 原文地址:https://www.cnblogs.com/justfortaste/p/3759865.html
Copyright © 2011-2022 走看看