hyperf icon indicating copy to clipboard operation
hyperf copied to clipboard

[QUESTION] 关于内存溢出的问题

Open Jungle-Leung opened this issue 2 years ago • 20 comments

Describe your question

1、目前需求场景是多个mq消费者进程执行,执行持续时间大概是1~2天,但是随着执行时间越长,容器占用的内存就越高,这种问题应该如何去排查?目前只能docker运行容器时,限制容器内存解决,但是这样子消费者执行效率也变慢了

Jungle-Leung avatar Aug 15 '23 16:08 Jungle-Leung

补充,如果对该容器执行docker restart 容器名命令,则可以释放掉内存

Jungle-Leung avatar Aug 15 '23 16:08 Jungle-Leung

有一个参数配置

   
    public function getMaxConsumption(): int
    {
         // 单个消费端最大消费数量,超过会自动关闭channel。由主进程重新启动自己
    }

lazychanger avatar Aug 17 '23 09:08 lazychanger

有一个参数配置

   
    public function getMaxConsumption(): int
    {
         // 单个消费端最大消费数量,超过会自动关闭channel。由主进程重新启动自己
    }

只能通过重启进程解决么?这种有没有更优方案呢?

Jungle-Leung avatar Aug 18 '23 06:08 Jungle-Leung

你写不出内存不泄漏的代码,不靠重启靠什么😂😂😂😂。 再说,这个重启是自动的,无感的。不会影响你的正常请求

lazychanger avatar Aug 18 '23 06:08 lazychanger

我的想法是,能不能每一次消费完都能把内存释放掉。还有就是,我这边可能单个消费者处理的消息上百万,那么这个配置我设置了100的话,是不是每消费完100条消息后,就会重启呢?

Jungle-Leung avatar Aug 18 '23 06:08 Jungle-Leung

内存泄漏是人写出来的,你内存释放要自己unset就释放掉了。如果找不到内存泄漏,你就利用这个机制去重启,自动释放内存。 你消费千百万,你千百万都在队列里面积压,不ACK是不会丢失消息的。所以你设置一百个也好、一百万都行。你觉得OK就行😂

lazychanger avatar Aug 18 '23 06:08 lazychanger

内存泄漏是人写出来的,你内存释放要自己unset就释放掉了。如果找不到内存泄漏,你就利用这个机制去重启,自动释放内存。 你消费千百万,你千百万都在队列里面积压,不ACK是不会丢失消息的。所以你设置一百个也好、一百万都行。你觉得OK就行😂

好的,感谢,我试下

Jungle-Leung avatar Aug 18 '23 06:08 Jungle-Leung

内存泄漏是人写出来的,你内存释放要自己unset就释放掉了。如果找不到内存泄漏,你就利用这个机制去重启,自动释放内存。 你消费千百万,你千百万都在队列里面积压,不ACK是不会丢失消息的。所以你设置一百个也好、一百万都行。你觉得OK就行😂

还有个问题想请教下,就是我这边的http服务,也会随着时间,占用的内存递增的,不过貌似内存没占用那么多,到一定程度就稳定下来了,这个服务里面都是些简单的curd而已

重启前

企业微信截图_816957b9-317c-4c06-99ff-0ea18ad12dfe

重启后

企业微信截图_a98a88ac-9316-484c-971b-742dc1c866ea

Jungle-Leung avatar Aug 18 '23 07:08 Jungle-Leung

内存泄漏都是人写出来。如果你用的hyperf或者swoole相关的,可以配置参数像我在上面提到的max_consumption一样的配置。 例如下面截图红框 image

你把他改小一点,改到一万试试。

lazychanger avatar Aug 18 '23 07:08 lazychanger

内存泄漏都是人写出来。如果你用的hyperf或者swoole相关的,可以配置参数像我在上面提到的max_consumption一样的配置。 例如下面截图红框 image

你把他改小一点,改到一万试试。

好的,非常感谢

Jungle-Leung avatar Aug 18 '23 08:08 Jungle-Leung

@Jungle-Leung 试试 gc_mem_caches()

bb7788 avatar Sep 15 '23 01:09 bb7788

@Jungle-Leung 请教一下内存泄露的问题找到好的解决办法了吗?我最近也遇到这种问题

azimao avatar Nov 15 '23 07:11 azimao

@Jungle-Leung 试试 gc_mem_caches()

谢谢,试了下这个,貌似有点效果,持续观察下吧

Jungle-Leung avatar Nov 18 '23 14:11 Jungle-Leung

@Jungle-Leung 请教一下内存泄露的问题找到好的解决办法了吗?我最近也遇到这种问题

暂时是用gc_mem_caches()方法释放,貌似有点效果,但不敢下定论,需要持续观察下

Jungle-Leung avatar Nov 18 '23 14:11 Jungle-Leung

@Jungle-Leung 我用gc_mem_caches 作用并不大, 还是在缓慢增长。
所以用了上面的办法,setMaxConsumption, 每次消费到一定条数,mq消费进程重启, 就不会一直增长了。 虽然解决了问题, 但是治标不治本 image

azimao avatar Nov 20 '23 02:11 azimao

@Jungle-Leung 我用gc_mem_caches 作用并不大, 还是在缓慢增长。 所以用了上面的办法,setMaxConsumption, 每次消费到一定条数,mq消费进程重启, 就不会一直增长了。 虽然解决了问题, 但是治标不治本 image

其实两种都用过,gc_mem_caches我是在消费者返回ack之前执行,然后我这边持续观察容器的内存,若在多消息消费的时候容器的内存会暴增,去到7~9g左右,毕竟我消费者比较多,但是一但消费完后,容器内存会回归到3g上下浮动,所以我感觉是有点效果。如果是之前没有加gc_mem_caches的时候,容器内存暴增上去后就不会释放的,一直会在9g左右,甚至超过10g都不释放。

Jungle-Leung avatar Nov 21 '23 07:11 Jungle-Leung

那是不是课可以考虑在每次请求结束前调用一下这个函数gc_mem_caches,是不是可以在一定程度上防止内存泄漏

drttcrh avatar Nov 21 '23 08:11 drttcrh

那是不是课可以考虑在每次请求结束前调用一下这个函数gc_mem_caches,是不是可以在一定程度上防止内存泄漏

可以尝试下再持续观察下机器内存

Jungle-Leung avatar Nov 24 '23 01:11 Jungle-Leung

image 我最近也遇到了woker进程从启动100M左右慢慢变大,最后导致内存也一直慢慢增长的问题,hyperf/hyperf:7.4-alpine-v3.15-swoole这个基础镜像,hyperf2.2

niumcdao avatar Jan 16 '24 09:01 niumcdao