• 请不要在回答技术问题时复制粘贴 AI 生成的内容
guoyu4126
V2EX  ›  程序员

怎样实时监控服务器运行状态?求助一点思路

  •  1
     
  •   guoyu4126 · May 16, 2018 · 9764 views
    This topic created in 2919 days ago, the information mentioned may be changed or developed.

    php-fpm 在运行长时间后会突然出现假死情况,导致网站无法访问。还好客服反应快,能及时反馈到技术。 看了看日志 大概 2 个月左右会出现一次,问题一直没有排查出来。 也找不到原因

    想到一种方案,在某个业务上写一些代码。 定时执行,如果返回非 200 直接发送短信到手机。。

    不知道大 pro 们能不能提供一些思路, 如果能彻底解决问题更好了。

    56 replies    2018-05-16 22:05:16 +08:00
    miyavis
        1
    miyavis  
       May 16, 2018
    心跳 检测?
    wwqgtxx
        2
    wwqgtxx  
       May 16, 2018 via iPhone
    不是有一些专门的监控网站比如监控宝之类的能隔多少分钟检测你的网站能否正常访问,一旦有问题就会给你发短信
    owenliang
        3
    owenliang  
       May 16, 2018 via Android
    考虑升级一下版本先,按道理不存在那么严重的问题哈。
    defunct9
        4
    defunct9  
       May 16, 2018
    直接 curl 发请求,1 分钟一次,如果掉了,拉起来。
    tomczhen
        5
    tomczhen  
       May 16, 2018 via Android
    php - fpm 配置参数了解一下。
    Luckyray
        6
    Luckyray  
       May 16, 2018
    直接写个脚本一分钟检测一次...
    Quarter
        7
    Quarter  
       May 16, 2018 via iPhone
    服务器放一个定时任务,检测可不可以访问,不可以就重启服务?
    alexsunxl
        8
    alexsunxl  
       May 16, 2018
    php-fpm 的子进程设置是不是太少了
    你要别人帮忙, 要把配置也发出来呀
    liwl
        9
    liwl  
       May 16, 2018
    supervisord
    wr410
        10
    wr410  
       May 16, 2018
    免费的公网监测有 pingdom 可以了解一下

    实际上监控不如自己写一个 crontab,挂了重启或者干脆直接定时重启就好了
    d0m2o08
        11
    d0m2o08  
       May 16, 2018
    zabbix 有站点监控 或者 curl 获取状态码 非 200 调用钉钉机器人报警 加到 cron
    nosay
        12
    nosay  
       May 16, 2018   ❤️ 1
    楼上已经说了那么多了,我来个另类的思路。
    每月定时重启一下 php-fpm,最好是整个服务器。
    蹓了蹓了..
    alen
        13
    alen  
       May 16, 2018
    monitorix 了解下
    ucun
        14
    ucun  
       May 16, 2018
    @defunct9 不用开 ssh 看看?
    zhixiao
        15
    zhixiao  
       May 16, 2018
    wwek
        16
    wwek  
       May 16, 2018
    zhaojjxvi
        17
    zhaojjxvi  
       May 16, 2018 via iPhone
    Uptimerobot 可以做到宕了有提醒
    defunct9
        18
    defunct9  
       May 16, 2018   ❤️ 1
    开 ssh,让我上去看看
    guoyu4126
        19
    guoyu4126  
    OP
       May 16, 2018
    @defunct9 ...... 不可以有这等操作。
    guoyu4126
        20
    guoyu4126  
    OP
       May 16, 2018
    @alexsunxl

    ;pm = dynamic
    pm=ondemand

    ; The number of child processes to be created when pm is set to 'static' and the
    ; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
    ; This value sets the limit on the number of simultaneous requests that will be
    ; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
    ; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
    ; CGI. The below defaults are based on a server without much resources. Don't
    ; forget to tweak pm.* to fit your needs.
    ; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
    ; Note: This value is mandatory.
    pm.max_children = 50

    ; The number of child processes created on startup.
    ; Note: Used only when pm is set to 'dynamic'
    ; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
    pm.start_servers = 10

    ; The desired minimum number of idle server processes.
    ; Note: Used only when pm is set to 'dynamic'
    ; Note: Mandatory when pm is set to 'dynamic'
    pm.min_spare_servers = 5

    ; The desired maximum number of idle server processes.
    ; Note: Used only when pm is set to 'dynamic'
    ; Note: Mandatory when pm is set to 'dynamic'
    pm.max_spare_servers = 15

    ; The number of seconds after which an idle process will be killed.
    ; Note: Used only when pm is set to 'ondemand'
    ; Default Value: 10s
    ;pm.process_idle_timeout = 10s;

    ; The number of requests each child process should execute before respawning.
    ; This can be useful to work around memory leaks in 3rd party libraries. For
    ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
    ; Default Value: 0
    ;pm.max_requests = 500


    这里自己配置的。
    realityone
        21
    realityone  
       May 16, 2018
    每天晚上低峰期重启下不就行了嘛
    Kinnice
        22
    Kinnice  
       May 16, 2018 via Android
    guoyu4126
        23
    guoyu4126  
    OP
       May 16, 2018
    @Kinnice 谢谢建议
    timchou
        24
    timchou  
       May 16, 2018
    LZ,第一步,欢迎先使用 ifuptime 来监控网站 down 机情况,好让你第一时间知道 down 了
    https://www.ifuptime.com
    注册码:v2exifuptime0502

    第二部,可能就需要去增加一些 debug 信息,来分析 down 机时候发生了什么,来具体分析了:)
    DavidNineRoc
        25
    DavidNineRoc  
       May 16, 2018
    探针?
    defunct9
        26
    defunct9  
       May 16, 2018 via iPhone
    不开就自己搞定,无难度撒
    onion83
        27
    onion83  
       May 16, 2018   ❤️ 2
    12 楼的做法在某种意义上来是正确的,在业务低峰定时重启 PHP-FPM,也基本上有点经验运维的标准操作。

    nginx+php-fpm 502 的问题,主要有两个:

    1、php-fpm 的子进程数不够,无法再接受更多的请求(衍生思考:php-fpm 进程管理的三种模式 )
    2、因为业务原因:如慢查询、内核参数,程序本身 bug 导致,甚至是 php 自己 core 掉.

    传统意义上监控,例如 ps aux 查看进程数,其实无法发现问题的,因为进程都在,只是它们都死了。
    如果真的要监控,建议走 httpcheck 7 层的检查,直接检查是否包含指定内容,如果有负载均衡的话直接屏蔽掉。

    开发视觉:
    -----------------
    如果确实要分析问题的话,可以通过三个参数 error_log、slowlog、request_slowlog_timeout 来定位,如有可能上日志分析或者自建 ELK,进行实时告警和分析.

    运维视觉:
    -----------------
    关注 emergency_restart_interval、pm.max_requests、request_terminate_timeout 三个参数,尤其后者,可以作为对服务器资源保护的最后强制暴力手段。

    “重启可以快速解决 90% 的问题” 对运维来说确实是最佳实践,对 PHP-FPM 尤其适用。
    vus520
        28
    vus520  
       May 16, 2018
    如果有多个 upstream,直接定时重启后端的 php-fpm 就行。
    guoyu4126
        29
    guoyu4126  
    OP
       May 16, 2018
    salmon5
        30
    salmon5  
       May 16, 2018
    supervisor+其插件 superlance 了解下,就别造轮子了
    DRcoding
        31
    DRcoding  
       May 16, 2018
    如果你只是想监控一个 http 返回状态,写个定时任务,发送一个 head 请求到你的域名或者 IP,然后买个短信接口,返回不是 200,就调用发短信的接口发短信呗。

    另外,一般云服务厂商都是会提供这种简单的 http 监控功能,如我所知,阿里云。
    opengps
        32
    opengps  
       May 16, 2018
    2 月一次,应该不是 cpu 资源问题
    关注下内存,系统句柄数,网络连接数,系统端口数等资源消耗情况,我以前的 socket 服务器,因为句柄的泄露,压力大的的时候,每周都需要手动重启下释放掉泄漏的句柄,直到后来找到问题,现在稳定运行,系统不死程序就不挂
    fortunezhang
        33
    fortunezhang  
       May 16, 2018
    宝塔
    一个客户用的宝塔,从来没有过假死情况。不过问题是和 lampp 的 php 不一样,具体说不出来,我遇到过几次。 很蛋疼。
    opengps
        34
    opengps  
       May 16, 2018
    @timchou 试用了下,感觉比 360,阿里云的更简单易用,点赞!
    lwldcr
        35
    lwldcr  
       May 16, 2018
    prometheus 了解一下
    xsec
        36
    xsec  
       May 16, 2018
    内存泄露?
    guoyu4126
        37
    guoyu4126  
    OP
       May 16, 2018
    @DRcoding 我就是这么想的。。。。。。。。。。。
    dorothyREN
        38
    dorothyREN  
       May 16, 2018
    两个月一次?那你计划任务每个月重启一次不就行了?
    7sDream
        39
    7sDream  
       May 16, 2018
    https://github.com/firehol/netdata
    我自己没试过,不负责任的推荐
    jssyxzy
        40
    jssyxzy  
       May 16, 2018
    这个不就是 health check 么,搜搜一堆解决方案.
    自己写, crontab + 脚本.
    aiseo
        41
    aiseo  
       May 16, 2018
    @timchou 想体验下,邀请码失效了
    timchou
        42
    timchou  
       May 16, 2018 via iPhone
    @aiseo hi 用这个 weiboifuptime
    dishuibaby
        43
    dishuibaby  
       May 16, 2018
    监控宝啊
    vibbow
        44
    vibbow  
       May 16, 2018
    php-fpm 不是会自动回收的么?
    liujinsong668
        45
    liujinsong668  
       May 16, 2018
    说个简单的恢复办法,自己写个 shell,定期 curl 这个网站的域名,一旦检测到状态不对,直接重启 php-fpm,可以恢复业务;但是最好找到问题的根源好一些,看看 php-fpm 的配置文件
    vibbow
        46
    vibbow  
       May 16, 2018
    LZ 了解一下 PHP_FCGI_MAX_REQUESTS 这个参数
    cabing
        47
    cabing  
       May 16, 2018
    了解下 php-fpm 启动固定数目的进程
    jsjscool
        48
    jsjscool  
       May 16, 2018
    https://github.com/laynefyc/xhgui-branch 大厂都在用的 PHP 性能监控了解下
    Aalen
        49
    Aalen  
       May 16, 2018
    关注一波 serverchan 吧,跟微信关联的
    jimmyczm
        50
    jimmyczm  
       May 16, 2018
    我自己搭的 workpress 也会有这个问题,调整了 php frm 的参数就行了
    cxbig
        51
    cxbig  
       May 16, 2018
    多数情况是因为 PHP 配置不当或代码问题导致内存泄漏
    图省事可以监控 log 里的相关错误信息,到达一定阈值触发重启 fpm 服务
    想追踪具体问题,得装系统监控工具
    lfzyx
        52
    lfzyx  
       May 16, 2018
    白盒监控了解一下?
    musclepanda
        53
    musclepanda  
       May 16, 2018
    我自己家的路由器我都设置凌晨 3 点重启下。。
    shiny
        54
    shiny  
    PRO
       May 16, 2018
    这种直接阿里云监控添加一个监控任务就行了,出现问题短信、邮件、钉钉都可以通知你。
    shiny
        55
    shiny  
    PRO
       May 16, 2018
    这种情况考虑下是不是可用的 fpm 进程耗尽。首先确定下内存是否耗完,如果有空余内存,可以调高最大进程数,然后把 fpm 的 status 也监控起来,观察下是不是有代码阻塞导致超时。
    Admstor
        56
    Admstor  
       May 16, 2018
    运维路过
    首先无论有没有故障,适当时机对服务进行重启都是有必要的,uptime 的意义在我看了除了秀一下也没啥,当然了 linux 本身健壮性挺好的,重启有关服务就 OK,更何况热补丁也是成熟技术,apache 用的少,nginx 下都有平滑重启,低峰时段对用户基本无感知

    其次日志记录很重要,日志虽然会影响一部分性能,但是出现异常 /新版本上线之后都应该有适当提高日志等级的必要,尤其是没有 AB 测试.

    然后监控系统很有必要,若自己没有监控系统,那么至少需要 2 个第三方监控作为相互监督,监控点也最好选择物理距离较远避免区域网络波动造成的异常报警,例如你在服务器在上海,主要客户群体在江浙沪,那么在选择在上海本地异地机房 /江浙沪范围内一个机房 /北京一个机房这样 3 个监测点相互检测,也大致可以提供整体网络波动情况

    自动异常处理,楼上很多都说了,写个脚本之类,但是建议自动异常处理也要做一个日志输出,短时间频繁触发也是很不正常,需要进一步分析的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3659 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 179ms · UTC 04:40 · PVG 12:40 · LAX 21:40 · JFK 00:40
    ♥ Do have faith in what you're doing.