首页 > 系统相关 >记一次Hyperf定时任务内存异常问题

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

时间:2024-09-01 17:25:28浏览次数:10  
标签:worker 任务 问题 Hyperf 内存 进程 定时

背景

最近时不时收到 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 进程内存只增不减;二、定时任务配置错误,导致任务重复执行造成内存缓慢泄露

 

标签:worker,任务,问题,Hyperf,内存,进程,定时
From: https://www.cnblogs.com/lyc94620/p/18391495

相关文章

  • 单片机中的定时器:精确时间的掌控者
    在单片机的世界里,定时器就像是一个精确的时间守护者,默默地为各种任务提供准确的时间基准。从简单的定时功能到复杂的实时控制系统,定时器都发挥着至关重要的作用。本文将深入探讨单片机中的定时器,包括其工作原理、应用场景以及编程实现等方面,旨在帮助读者更好地理解和应用这一重......
  • Linux实时查看GPU (NVIDIA),CPU及内存使用情况
    GPU方法一:需要用到一个工具gpustatpipinstallgpustat#安装工具gpustat-cp#输出当前状态gpustat-cp-i1#持续监视方法二:使用nvidia-smi命令nvidia-smi-lsecondsnvidia-smi--loop=seconds上述两个命令都可以,要把seconds换成你想刷新的时间间隔。按......
  • C# 定时器 Timer 如何精确到 1-2 毫秒以内
    最近在排查项目OTA的一个问题,触发了一毫秒或者2毫秒执行一次进程间通信的,导致通信阻塞的问题。这样就需要用到模拟触发1ms或者2ms触发事件。这让我第一时间想到了C#的定时器。由于我们项目用到的框架是基于.NETFramwork4.8的,所以我就建立了一个.NETFramwork4.8的WPFDemo去验证......
  • 【项目日记】高并发内存池---实现中心缓存
    年少的梦啊,有些很幸运地实现了,有些被遗忘在了风中---董卿---高并发内存池---实现中心缓存1整体理念2SpanList的实现3CentralCache的实现4请求内存联动1整体理念实现中心缓存之前,我们先理解中心缓存需要做那些事情,具有哪些特性?我们把中心缓存的功能......
  • 操作系统基础——内存管理
    ###内存管理####1.**分页(Paging)**1.**定义**:-分页是一种内存管理技术,将物理内存分成固定大小的块,称为“页框”(PageFrame),同时将逻辑内存分成相同大小的块,称为“页”(Page)。2.**页表(PageTable)**:-页表是一个数据结构,用于存储逻辑地址到物理地址的映射关系。-每......
  • CUDA教程之 10 掌握 CUDA 矩阵乘法:共享内存、Tile 内存合并和 Bank 冲突简介(教程含源
    介绍在使用CUDA进行GPU编程的世界中,优化性能是关键。实现此目标的最强大技术之一是使用共享内存。本博客将引导您完成使用共享内存执行矩阵乘法的CUDA程序,特别关注理解分块内存合并和存储体冲突。在本文结束时,您将牢固掌握共享内存如何显著加快您的计算速度以及如何......
  • day10(IO进程)进程间的通信---共享内存
    目录1.特点2.步骤3.函数接口4.命令1.特点1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读......
  • 【Linux】阿里巴巴开源系统性能监视工具tsar:支持收集和报告系统的各种性能数据,包括CPU
    tsar是一个功能强大且用户友好的系统性能监视工具,广泛应用于开发者和系统管理员中。本文将带你从tsar的基础知识开始,逐步深入到中级和高级用法,帮助你全面掌握tsar的强大功能。......
  • Linux内存操作之free命令
    在Linux操作系统中,free命令是一个非常重要的工具,用于显示系统内存(包括物理内存和交换空间)的使用情况。基本语法free[选项]常用选项-b或--bytes:以字节为单位显示内存信息。-k或--kilo:以千字节(KB)为单位显示内存信息。-m或--mega:以兆字节(MB)为单位显示内存信息(这......
  • 内存管理-32-系统内存统计-4-/proc/vmstat
    基于msm-5.4一、打印内容1.打印格式#cat/proc/vmstat/*1.打印全局数组vm_zone_stat[]的值,enumzone_stat_item描述各条目*/nr_free_pages617775nr_zone_inactive_anon16518nr_zone_active_anon979541nr_zone_inactive_file698879nr_zone_active_file17223......