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

news/2024/11/15 16:19:16/文章来源:https://www.cnblogs.com/lyc94620/p/18391495

背景

最近时不时收到 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.hqwc.cn/news/790608.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

河道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典型组网和业务访问关…

MySQL中的group by的意义

这是一道leetcode上数据库的题目,一开始确实是没有想明白哦。

算法-动态规划-多重背包

LeetCode算法刷题 动态规划之多重背包0. 动态规划五部曲:确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组

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 具体下载地址见上面的官网 安装部署…

在关卡蓝图中获得actor的信息

在蓝图中想获得actor的属性,可使用get actor of class 如下例子是根据导轨的位置调节场景中定向光的方向。利用以上方法结合曲线编辑器可以计算出当前帧在总帧中的占比,另一个方法是直接用get current time获得运行时间,但是暂时没有找到好的方法直接获得渲染的总时长。

Leangoo领歌Scrum管理工具,轻松实现Scrum敏捷转型

​ 在当今快速变化的商业环境中,企业面临着前所未有的挑战。如何在激烈的竞争中保持领先?如何快速响应市场需求?答案就在于敏捷转型。而在这一过程中,有一个高效的敏捷工具至关重要——Leangoo领歌(Leangoo领歌 - 免费一站式敏捷研发协同平台,Scrum工具,SAFe敏捷工具,敏捷…

Markdown语法与Latex公式汇总

1 基本语法 1.1 标题 语法如下:效果如下:1.2 字体样式语法 效果普通正文字体 普通正文字体*倾斜字体* 倾斜字体**加粗字体** 加粗字体***倾斜加粗字体*** 倾斜字体~~划线字体~~ 倾斜字体1.3 分割线 语法如下:效果如下:1.4 引用 语法如下:效果如下:1.5 列表 有序列表 语法…