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进程占用的内存不断上升。这时,可以调用函数主动回收释放这些碎片。

[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重建表的做法。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于MySQL内存占用的问题,有以下几个可能的原因和解决方法: 1. 查询缓存过大:查询缓存是MySQL用于缓存查询结果的内存区域,如果设置过大,会导致整个内存占用过高。您可以通过检查和调整查询缓存相关的配置参数来解决这个问题。可以尝试将query_cache_size参数设置为一个适当的值或者禁用查询缓存(将query_cache_type参数设置为0)。 2. 内存泄漏:MySQL可能存在内存泄漏的情况,导致内存占用逐渐增加。您可以尝试升级到最新版本的MySQL,因为新版本通常会修复一些已知的内存泄漏问题。此外,您也可以尝试使用专门的工具(如Valgrind)来检测和解决内存泄漏问题。 3. 配置不合理:MySQL的一些配置参数可能设置得不合理,导致内存占用过高。您可以检查和调整一些关键的配置参数,如innodb_buffer_pool_size、key_buffer_size等,以确保它们与系统的可用内存和数据库的负载情况相匹配。 4. 查询负载过大:如果系统中并发查询量很大,可能会导致内存占用过高。您可以通过优化查询、增加硬件资源或者使用数据库集群等方式来分担查询负载,从而减少内存占用压力。 请注意,以上的解决方法只是一些常见的原因和对应的解决方案,具体应根据您的实际情况进行调整。同时,也建议您定期监控和优化MySQL内存使用情况,以确保系统的稳定性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值