记一次Hyperf定时任务内存异常问题

news/2024/10/2 20:33:06

背景

最近时不时收到 K8S 告警提示项目 POD 出现 OOM 问题,只要触发了项目重新部署或者把 POD 删掉,内存就恢复了,过了一段时间才缓慢增长(基本上要隔几天,这也是这个问题比较难定位和复现的原因)

分析

起初以为是某一个SQL没有限制 limit 或者是程序有死循环把内存跑满了,后面从日志看到这个错误,check_worker_exit_status,同时对应的 worker 进程异常退出了,可以看到这里有记录对应的进程 ID,记住这个 PID,后面发挥很大的作用。

 

思路一

本想着以前也改过几个内存泄露的问题,这次估计也是大同小异(后面发现是我想多了),先揪着代码的 while(true) 死循环研究,确实发现了一些不合理的点,同时也把引用的变量这一块给梳理了一遍,提交了第一版代码,原本以为能顺利解决,可过一天后告警还是出现了。。。

思路二

换个思路继续研究这个问题,会不会是某个上传文件接口把内存打满了,不过后面看了以下 server.php 的配置,基本上可以 pass 这个情况了

思路三

会不会是某个大的 SQL 查询把内存打满了?既然我有错误日志,我就顺着错误日志的上下文开始排查,但是发现即使打印了日志,无奈开了几个 worker,导致无法分析日志都是哪个 worker 打印的,随即给日志加上 worker 进程 ID,方便后续观察问题。发现后面加上之后,是可以看到 worker 进程最后执行的 SQL,但是自己查了下 SQL,也没发现什么异常点

思路四

观察到报错的时候,worker 进行的 ID 已经飙到 78万了,这个一开始真的还没怎么留意,后面还观察到每次出现这个报错的时间点,又恰恰是整点前后的时间,心里差不多已经有答案了,大概率是定时任务出现问题了!

由于当时也尝试过本地复现,无奈本地的环境变量一直把定时任务关了,导致没怎么留意这一块,不过也好,总算有突破口,开干!

复现

观察到代码有几个定时任务,且是分钟级别的,由于这个复现比较麻烦,且要等很长一段时间,随即把本地的定时任务改成秒级,即每秒跑一次,同时为了方便数据观察,把本地的 worker 数量调整为 1,进入容器开始观察内存的变化情况,跑了 15 分钟左右,发现 worker 进程(PID=22)的内存大幅增长,已经增加到 462M 了,1 个小时后甚至到了 806M

 

不过有个新的疑惑,发现开启定时任务后,有两个进程,一个是普通的 worker 进程,一个是 crontab-dispatcher 进程,一开始没想这么多,以为是定时任务的进程把任务分发给 worker 进程执行,到这里以为是框架的问题,因为自己的定时任务的配置都是按照文档里面的说明来的,理论上不会有问题,如果有问题也是大面积出问题。

先上 GitHub 看看有没有相关的 issue,先是找到个说可以自己用垃圾回收简单处理下,随机尝试下,但是没有效果

// 执行垃圾回收
gc_collect_cycles();

 

后面找到个类似的 issue

这哥么的情况跟我差不多,后面看到开发者说有个定时任务的策略可以改成携程策略,尝试改下,替换定时任务的执行策略

\Hyperf\Crontab\Strategy\StrategyInterface::class => \Hyperf\Crontab\Strategy\CoroutineStrategy::class,

 

问题基本上解决了,worker 进程内存没有缓慢增加了,自此以为问题解决了,调整代码,发版,美美睡一觉(高兴太早了)

 

新的问题

跑了一天,还是收到告警,直接到线上看啥情况,发现 worker 进程的内存没有明显增长了,但是取而代之 crontab-dispatcher 进程的内存开始疯长,也就是内存换个进程跑,还是没解决问题,这里基本上可以说明是定时任务配置有问题,排查定时任务配置

 

看到定时任务的配置,发现有两个参数是关闭了,后面查看下 官方文档,发现这两个配置是为了控制任务并发和多实例触发的问题,如果关闭的话,代码没有做任何锁处理,会导致这个定时任务被重复执行多次,修改之后观察了半个月,没有收到类似的告警,问题基本上解决了

解决

期间虽然还怀疑是 server.php 配置有问题,以为是用了 SWOOLE_PROCESS 导致资源没分配好,把请求都打到某一个 worker 引发这个问题,不过后面可以排除这个,虽说有点小影响,SWOOLE_BASE 相比 SWOOLE_PROCESS 请求分配会均匀些,但不是本次问题的重点。说下结论

  • 修改定时任务执行策略为 CoroutineStrategy
  • 修改定时任务配置,处理好任务重复执行问题

 

结论

主要是两个问题,一、定时任务执行策略没配置携程策略,导致 worker 进程内存只增不减;二、定时任务配置错误,导致任务重复执行造成内存缓慢泄露

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/55396.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

河道AI智能视频分析识别系统

河道AI智能视频分析识别系统智能检测方式,智能检测分析河道两边意外违反规定问题,确保人民人身安全问题,河道AI智能视频分析识别系统在初期处理伤害安全性的问题,保证水环境生态安全和人民生命安全安全性,使人和水的影响做到和睦情况,使不足的水源为社会经济的协调发展作…

河道水库雨水情视频监控智能分析系统

河道水库雨水情视频监控智能分析系统可以提升水利枢纽的安全性,这个问题一直是防汛管理方法机构重视的一个主要问题。为加强水利枢纽安全性监管,管理方法单位急需河道水库雨水情视频监控智能分析系统,实时监测降水信息内容,为防汛防灾减灾给予精确、立即的数据信息。系统基…

【运维系列】如何为NETCONF开放安全策略

NETCONF(Network Configuration Protocol,网络配置协议)是一种基于XML的网络管理协议,它提供了一种对网络设备进行配置和管理的可编程方法。NETCONF协议的传输层可以是BEEP、SSH、TLS或SOAP。 由于RFC协议规定必须支持SSH,所以目前SSH是NETCONF使用最广泛的传输层协议,当…

【运维系列】如何为SNMP开放安全策略

SNMP是最广泛使用的网络管理协议。 网管软件作为SNMP Manager,向被管设备中的SNMP Agent发出管理操作的请求。 被管设备在检测到异常时,也会主动向SNMP Manager发送Trap信息。 也就是说,网管软件和被管设备都会主动发起连接,如图 6-1 所示。【图】SNMP典型组网和业务访问关…

win10更新在哪里,教你怎么打开电脑win10更新

在Windows 10系统中,打开和查看系统更新的位置相对固定,主要通过“设置”应用来完成。以下是详细的步骤说明: 一、打开Windows 10更新 1.通过“开始”菜单打开“设置”: 点击屏幕左下角的“开始”按钮(Windows徽标)。 在弹出的菜单中,选择并点击“设置”图标(一个齿轮形…

[图文直播]基于ZFile和MinIO搭建私有网盘

前言 ZFile 以下是ZFile的官网,上面也涉及到了搭建方法 https://docs.zfile.vip/install/os-windows 此次仅记录本人按照官方的部署方法进行实操验证。 下载 ibm-semeru-open-jdk_x64_windows_8u372b07_openj9-0.38.0.msi zfile-release.jar 具体下载地址见上面的官网 安装部署…

9.1作业博文

这个作业属于哪个课程 (https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/join?id=CfDJ8AOXHS93SCdEnLt5HW8VuxT_rAhbZKO3TfjMmbv1B0Re5Fp2d0_QACha2ZoYZ4fxF-ZKCCAhfJl7B8mvCfesLYE02X8T6kx_2R8w0SR-ykrgDVRKWkWQOEyI0LT4BHazpS2wjaFQselKyI83UoHD6q4)这个作业要求在哪里 (…

【Internet Protocol】ip介绍,如何组局域网实现远程桌面和文件共享

@目录1.何为“上网”1.1 定义1.2 为什么连了WiFi就能上网了?2.ip2.1 什么是ip2.2 为什么区分广域网和局域网,ip的唯一性2.3 如何查看设备的ip2.4 什么叫"ping"2.5 区分是否两个ip是否在同一局域网2.5.1 最稳妥的方式:ip&mask2.5.2 最方便的方式:ping2.6 ipv4…