mysqld进程占用内存过高怎么排查【转】

发布时间 2023-08-11 16:38:02作者: paul_hch

mysqld进程占用内存过高怎么排查

遇到一个比较极端的案例,innodb_buffer_pool_size 值仅设置为2GB,但是mysqld进程却占用了25GB的内存。

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
45305 mysql     20   0   28.4g    25g   8400 S  48.5 81.4  64:46.82 mysqld

 

后面会有专门的文章介绍详细分析排查过程,这里先直接说可能的原因以及解决方案。

可能的原因

1、session(会话)级内存buffer参数设置过高,并且连接数也设置过高,例如

read_buffer_size = 64M
read_rnd_buffer_size = 32M
sort_buffer_size = 64M
join_buffer_size = 64M
tmp_table_size = 1G
max_heap_table_size = 1G
max_connections=2000

 

当连接数较少时,需要消耗的内存并不多。

但是当遇到突发流量时,可能并发连接数会接近打满,再加上可能有产生临时表、额外排序的低效率的SQL频繁出现,这就很容易导致内存占用快速增长。

因此建议调低session级buffer参数值,并有效控制并发连接数,下面是一个比较通用的设置值参考:

read_buffer_size = 4M
read_rnd_buffer_size = 4M
sort_buffer_size = 4M
join_buffer_size = 4M
tmp_table_size = 32M
max_heap_table_size = 32M
max_connections = 512

2、PFS中开启过多检测指标,造成内存消耗过大。

在上面也提到过,全部开启PFS后,可能需要大约1GB内存。不过在高并发并伴随频繁低效SQL的情况下,可能需要消耗更多内存。

3、可能还用到MyISAM引擎,并且 key_buffer_size 设置过大。

不过现在MyISAM引擎大家一般用得也比较少了。

4、程序内存泄漏风险。

可以用valgrind工具检验是否存在这个问题,如果确定的话,可以考虑升级MySQL版本,或者定期在维护时间重启mysqld实例,或者通过高可用切换方式将有风险的实例重启。

5、glibc的内存管理器自身缺陷导致。

简言之,就是调用glibc申请的内存使用完毕后,归还给OS时没有被正常回收,而变成了碎片,随着碎片的不断增长,就能看到mysqld进程占用的内存不断上升。这时候,我们可以调用函数主动回收释放这些碎片。

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
45305 mysql     20   0   28.4g    25g   8400 S  48.5 81.4  64:46.82 mysqld

[root@mysql#] gdb --batch --pid `pidof mysqld` --ex 'call malloc_trim(0)'

  PID USER      PR  NI    VIRT    RES    SHR  S  %CPU %MEM     TIME+ COMMAND
45305 mysql     20   0   28.4g    5.2g   8288 S  2.7  17.0  64:56.82 mysqld

 

这就像是在InnoDB表中产生太多碎片后,我们主动执行 OPTIMIZE TABLE 重建表的做法。

Enjoy MySQL :)

 

这就像是在InnoDB表中产生太多碎片后,我们主动执行 OPTIMIZE TABLE
 重建表的做法。

----文章结束。

上个月,也写了一篇关于,服务器内存占用问题,当时只是对MySQL本身做了一些操作先释放内存,然后,减少参数配置来减少对内存的使用。

现在结合这篇文件,从操作系统层面回收内存,感觉可以两者结合,效果可能会更好一些。

这里总结一下:

1.调低session级buffer参数值,以及*table_size相关的参数值

2.调整合适的并发连接数和table_open_cache数

3.MySQL数据库服务器还是建议禁用swap

4.做好监控系统基本层面和数据库层面,尤其是MySQL lock相关。

5.系统版本和数据库版本不易过低,尽量能升级就升级到高版本,降低系统本身的缺陷和MySQL程序等的风险。

转自

万答#3,MGR最佳配置参考,PFS里的监测指标要全开吗,mysqld进程占用内存过高怎么排查 - 代码先锋网
https://codeleading.com/article/18436168863/#google_vignette

mysqld进程占用内存过高怎么排查? - 墨天轮
https://www.modb.pro/db/87536