[QUESTION] 关于内存溢出的问题
Describe your question
1、目前需求场景是多个mq消费者进程执行,执行持续时间大概是1~2天,但是随着执行时间越长,容器占用的内存就越高,这种问题应该如何去排查?目前只能docker运行容器时,限制容器内存解决,但是这样子消费者执行效率也变慢了
补充,如果对该容器执行docker restart 容器名命令,则可以释放掉内存
有一个参数配置
public function getMaxConsumption(): int
{
// 单个消费端最大消费数量,超过会自动关闭channel。由主进程重新启动自己
}
有一个参数配置
public function getMaxConsumption(): int { // 单个消费端最大消费数量,超过会自动关闭channel。由主进程重新启动自己 }
只能通过重启进程解决么?这种有没有更优方案呢?
你写不出内存不泄漏的代码,不靠重启靠什么😂😂😂😂。 再说,这个重启是自动的,无感的。不会影响你的正常请求
我的想法是,能不能每一次消费完都能把内存释放掉。还有就是,我这边可能单个消费者处理的消息上百万,那么这个配置我设置了100的话,是不是每消费完100条消息后,就会重启呢?
内存泄漏是人写出来的,你内存释放要自己unset就释放掉了。如果找不到内存泄漏,你就利用这个机制去重启,自动释放内存。 你消费千百万,你千百万都在队列里面积压,不ACK是不会丢失消息的。所以你设置一百个也好、一百万都行。你觉得OK就行😂
内存泄漏是人写出来的,你内存释放要自己unset就释放掉了。如果找不到内存泄漏,你就利用这个机制去重启,自动释放内存。 你消费千百万,你千百万都在队列里面积压,不ACK是不会丢失消息的。所以你设置一百个也好、一百万都行。你觉得OK就行😂
好的,感谢,我试下
内存泄漏是人写出来的,你内存释放要自己unset就释放掉了。如果找不到内存泄漏,你就利用这个机制去重启,自动释放内存。 你消费千百万,你千百万都在队列里面积压,不ACK是不会丢失消息的。所以你设置一百个也好、一百万都行。你觉得OK就行😂
还有个问题想请教下,就是我这边的http服务,也会随着时间,占用的内存递增的,不过貌似内存没占用那么多,到一定程度就稳定下来了,这个服务里面都是些简单的curd而已
重启前
重启后
内存泄漏都是人写出来。如果你用的hyperf或者swoole相关的,可以配置参数像我在上面提到的max_consumption一样的配置。
例如下面截图红框
你把他改小一点,改到一万试试。
内存泄漏都是人写出来。如果你用的hyperf或者swoole相关的,可以配置参数像我在上面提到的max_consumption一样的配置。 例如下面截图红框
你把他改小一点,改到一万试试。
好的,非常感谢
@Jungle-Leung 试试 gc_mem_caches()
@Jungle-Leung 请教一下内存泄露的问题找到好的解决办法了吗?我最近也遇到这种问题
@Jungle-Leung 试试 gc_mem_caches()
谢谢,试了下这个,貌似有点效果,持续观察下吧
@Jungle-Leung 请教一下内存泄露的问题找到好的解决办法了吗?我最近也遇到这种问题
暂时是用gc_mem_caches()方法释放,貌似有点效果,但不敢下定论,需要持续观察下
@Jungle-Leung 我用gc_mem_caches 作用并不大, 还是在缓慢增长。
所以用了上面的办法,setMaxConsumption, 每次消费到一定条数,mq消费进程重启, 就不会一直增长了。 虽然解决了问题, 但是治标不治本
@Jungle-Leung 我用gc_mem_caches 作用并不大, 还是在缓慢增长。 所以用了上面的办法,setMaxConsumption, 每次消费到一定条数,mq消费进程重启, 就不会一直增长了。 虽然解决了问题, 但是治标不治本
其实两种都用过,gc_mem_caches我是在消费者返回ack之前执行,然后我这边持续观察容器的内存,若在多消息消费的时候容器的内存会暴增,去到7~9g左右,毕竟我消费者比较多,但是一但消费完后,容器内存会回归到3g上下浮动,所以我感觉是有点效果。如果是之前没有加gc_mem_caches的时候,容器内存暴增上去后就不会释放的,一直会在9g左右,甚至超过10g都不释放。
那是不是课可以考虑在每次请求结束前调用一下这个函数gc_mem_caches,是不是可以在一定程度上防止内存泄漏
那是不是课可以考虑在每次请求结束前调用一下这个函数gc_mem_caches,是不是可以在一定程度上防止内存泄漏
可以尝试下再持续观察下机器内存

