V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
echo404
V2EX  ›  PHP

对于长时间运行的 PHP 程序,各位大佬是如何预防程序假死挂起的呢?

  •  
  •   echo404 · 2018-11-14 17:42:11 +08:00 · 6019 次点击
    这是一个创建于 2190 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,各位大佬有没有什么好的方式去监控假死的程序呢?

    第 1 条附言  ·  2018-11-14 18:25:44 +08:00
    具体的业务是这样的:一个 PHP 程序监听一个队列,从队列中取出消息,转发到另外的几条队列中。如果这个程序假死了,会导致主队列消息挤压,影响业务处理。
    目前我们定的方式是每取出转发一次消息,就往一个固定文件中写入时间戳,然后写个定时任务去读取这个文件内的时间,如果时间超过 5 分钟没有更新就重启进程。
    来这就是想问问各位大佬有没有什么更加合适的解决方案
    20 条回复    2018-11-29 22:04:59 +08:00
    askfilm
        1
    askfilm  
       2018-11-14 17:48:36 +08:00
    定时重启
    OMGZui
        2
    OMGZui  
       2018-11-14 17:52:37 +08:00
    定时重启+supervisor 监控
    echo404
        3
    echo404  
    OP
       2018-11-14 17:54:39 +08:00
    @askfilm 如果在定时重启之前,进程就假死掉了,那么在重启之前,业务岂不是都堵塞在那了
    echo404
        4
    echo404  
    OP
       2018-11-14 17:57:03 +08:00
    @OMGZui supervisor 不是监控进程异常退出么?对于那种假死挂起的进程也能监控出来么?
    cloverstd
        5
    cloverstd  
       2018-11-14 17:58:30 +08:00
    健康检查
    echo404
        6
    echo404  
    OP
       2018-11-14 18:03:47 +08:00
    @cloverstd 怎么健康检查,萌新不是很懂
    skymei
        7
    skymei  
       2018-11-14 18:28:29 +08:00
    如果这种持续运行的消费者,生产者模式,我觉得还是搞清楚为什么假死比较好..,监控手段肯定有一点延迟
    Exceptions
        8
    Exceptions  
       2018-11-14 18:32:47 +08:00
    可以做个心跳包
    x66
        9
    x66  
       2018-11-14 18:37:01 +08:00 via iPhone
    多部署几份,如果全挂了就找原因吧。
    anyele
        10
    anyele  
       2018-11-14 18:44:45 +08:00 via Android
    先找为什么会死
    via
        11
    via  
       2018-11-14 18:53:19 +08:00 via iPhone
    楼主可以参考一下 laravel 的 shedule,或者使用 supervisor 等 pm 工具
    lujiajing1126
        12
    lujiajing1126  
       2018-11-14 19:05:26 +08:00
    为什么不是找到假死的原因
    zakokun
        13
    zakokun  
       2018-11-14 19:06:52 +08:00
    不可能莫名其妙就 i 假死的,要确认具体原因
    pandanrain
        14
    pandanrain  
       2018-11-14 20:31:12 +08:00
    visonme
        15
    visonme  
       2018-11-14 20:39:07 +08:00
    前面都提到了,定时重启,健康检查(模拟网络通信中心跳包方式来处理)
    但是最好的方式还是先假设下可能假死的原因,然后针对各种原因去做方案吧
    0xff0x77
        16
    0xff0x77  
       2018-11-14 21:10:42 +08:00
    一般一个程序,是不可能无缘无故假死的,楼主可能是 windows 程序用多了,得到了假死这个概念。
    假死一定要找到原因,如果是内存溢出,不会找调用栈的话,考虑定时重启,当然治标不治本。
    Joyboo
        17
    Joyboo  
       2018-11-15 10:37:51 +08:00
    我们目前是运维做了一个监控警报,监控那几个进程,挂掉了就电话邮件微信报警,然后每天凌晨定时重启
    geligaoli
        18
    geligaoli  
       2018-11-15 10:53:55 +08:00
    php 长期运行,几乎肯定会死的。我都是每次运行玩一批任务就退出,在 shell 脚本中循环调用。
    qianbi6
        19
    qianbi6  
       2018-11-15 11:49:38 +08:00 via Android
    @geligaoli php 用 swoole 写的一个队列一年都没挂啊
    mingyun
        20
    mingyun  
       2018-11-29 22:04:59 +08:00
    @qianbi6 swoole 这么 6
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5743 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:42 · PVG 09:42 · LAX 17:42 · JFK 20:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.