MySQL -- 内存使用监控详解

 

问题:

  1、我们怎么确定MySQL的各个部分分别使用了多少内存?

  2、当有MySQL由于内存泄露引起OOM时、我们怎么提前发现?

 

怎么监控MySQL内存使用:

  答案是通过performance_schema来完成、具体的做法如下:

 

第一步: 配置performance_schema使它开启内存方面的监控

  在/etc/my.cnf中增加如下内容

####  for performance_schema
performance_schema                                                      =on    #    on
performance_schema_consumer_events_stages_current                       =on    #    off
performance_schema_consumer_events_stages_history                       =on    #    off
performance_schema_consumer_events_stages_history_long                  =off   #    off
performance_schema_consumer_statements_digest                           =on    #    on
performance_schema_consumer_events_statements_current                   =on    #    on
performance_schema_consumer_events_statements_history                   =on    #    on
performance_schema_consumer_events_statements_history_long              =off   #    off
performance_schema_consumer_events_waits_current                        =on    #    off
performance_schema_consumer_events_waits_history                        =on    #    off
performance_schema_consumer_events_waits_history_long                   =off   #    off
performance_schema_consumer_global_instrumentation                      =on    #    on
performance_schema_consumer_thread_instrumentation                      =on    #    on
performance-schema-instrument                                           ='memory/%=COUNTED'

 

第二步:重启mysql数据库

systemctl restart mysql

  这里要重启MySQL的主要是因为,许多的内存是在启动MySQL的时候就分配好了的,如果我们在MySQL启动完成后再通过

  performance_schema.setup_instrument表来配置内存相关的监控的话,就是漏掉一些内存没有监控到。

 

第三步:通过performance_schema查询内存的使用情况

mysql> SELECT SUBSTRING_INDEX(event_name,'/',2) AS code_area, sys.format_bytes(SUM(current_alloc)) AS current_alloc
    -> FROM sys.x$memory_global_by_current_bytes GROUP BY SUBSTRING_INDEX(event_name,'/',2) ORDER BY SUM(current_alloc) DESC;
+---------------------------+---------------+
| code_area                 | current_alloc |
+---------------------------+---------------+
| memory/innodb             | 1.47 GiB      |
| memory/performance_schema | 131.51 MiB    |
| memory/mysys              | 8.22 MiB      |
| memory/sql                | 3.19 MiB      |
| memory/memory             | 213.15 KiB    |
| memory/myisam             | 171.79 KiB    |
| memory/csv                | 512 bytes     |
| memory/blackhole          | 512 bytes     |
+---------------------------+---------------+
8 rows in set (0.00 sec)

  1、从上面的结果我们可以知道innodb、performance_schema、mysys ... 它们共用了多少内存了、如果某一类组件的内存使用没有节制的增长上去、多半

  它就是内存泄露了。 对于这种情况只能是升级MySQL到更高的版本了。

 

目前performance-schema相关的配置模板已经增加到mysqltools当中

  https://github.com/Neeky/mysqltools/blob/master/deploy/ansible/mysql/template/5.7/my.cnf

 

----------------------------------------------------------------------------

----------------------------------------------------------------------------

 

posted on 2018-03-28 11:52  蒋乐兴的技术随笔  阅读(2068)  评论(2编辑  收藏  举报

导航