服务器 Out of memory 实在太难解决了 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
duguxiaohuai
V2EX    问与答

服务器 Out of memory 实在太难解决了

  •  
  •   duguxiaohuai 2018-06-14 08:47:03 +08:00 8456 次点击
    这是一个创建于 2733 天前的主题,其中的信息可能已经有所发展或是发生改变。

    电商系统加了一个 crond 定时任务,其次就是定时任务里面涉及到 PHP 的循环,大概 2 分钟一次,每天凌晨三四点钟,web 服务器就挂了,找到 /var/log/message 里面查看日志,日志如下,请问各位大牛这个怎么解决? 环境 centos lnmp 8G 内存 Jun 14 03:45:08 iZbp14dhkm7u57alou7jitZ kernel: Out of memory: Kill process 18931 (nginx) score 2 or sacrifice child
    Jun 14 03:45:08 iZbp14dhkm7u57alou7jitZ kernel: Killed process 18931, UID 501, (nginx) total-vm:68052kB, anon-rss:23608kB, file-rss:28kB
    Jun 14 03:45:09 iZbp14dhkm7u57alou7jitZ kernel: Out of memory: Kill process 18933 (nginx) score 2 or sacrifice child
    Jun 14 03:45:09 iZbp14dhkm7u57alou7jitZ kernel: Killed process 18933, UID 501, (nginx) total-vm:68052kB, anon-rss:18376kB, file-rss:16kB
    Jun 14 03:45:09 iZbp14dhkm7u57alou7jitZ kernel: Out of memory: Kill process 18932 (nginx) score 2 or sacrifice child
    Jun 14 03:45:09 iZbp14dhkm7u57alou7jitZ kernel: Killed process 18932, UID 501, (nginx) total-vm:68052kB, anon-rss:23608kB, file-rss:8kB
    Jun 14 07:17:55 iZbp14dhkm7u57alou7jitZ kernel: imklog 5.8.10, log source = /proc/kmsg started.

    43 条回复    2018-06-15 00:46:11 +08:00
    lookwi
        1
    lookwi  
       2018-06-14 08:53:11 +08:00 via iPhone
    啥子哦,nNginx 执行定时任务
    Mbin
        2
    Mbin  
       2018-06-14 09:00:00 +08:00 via iPhone
    怀疑你代码内存泄露,跑一段时间就爆了
    duguxiaohuai
        3
    duguxiaohuai  
    OP
       2018-06-14 09:03:44 +08:00
    @lookwi 定时任务的话是 php 和 redis

    @Mbin 代码是 PHP 白天没事 凌晨三四点就挂了 挂的是 NGINX
    des
        4
    des  
       2018-06-14 09:09:21 +08:00 via Android
    一点都没说清楚,
    是有自己加的 nginx 模块吗?
    是每次都是同一时间挂的吗?
    有试过把时间调到其他时间点吗?
    dump 文件有看过吗丁?
    des
        5
    des  
       2018-06-14 09:12:09 +08:00 via Android
    还有既然是 nginx 挂了,没去看 nginx 日志?
    挂掉之前有访问异常吗?
    duguxiaohuai
        6
    duguxiaohuai  
    OP
       2018-06-14 09:16:38 +08:00
    @des nginx 日志一直是这样,一秒钟一回,然后挂了就没错误日志了 2018/06/14 04:33:21 [alert] 1462#0: worker process 22815 exited on signal 9
    2018/06/14 04:33:22 [alert] 1462#0: worker process 22816 exited on signal 9
    2018/06/14 04:33:23 [alert] 1462#0: worker process 22817 exited on signal 9
    2018/06/14 04:33:23 [alert] 1462#0: worker process 22818 exited on signal 9
    2018/06/14 04:33:24 [alert] 1462#0: worker process 22819 exited on signal 9
    2018/06/14 04:33:24 [alert] 1462#0: worker process 22821 exited on signal 9
    2018/06/14 04:33:25 [alert] 1462#0: worker process 22820 exited on signal 9
    2018/06/14 04:33:26 [alert] 1462#0: worker process 22822 exited on signal 9
    2018/06/14 04:33:27 [alert] 1462#0: worker process 22824 exited on signal 9
    2018/06/14 04:33:27 [alert] 1462#0: worker process 22823 exited on signal 9
    2018/06/14 04:33:28 [alert] 1462#0: worker process 22825 exited on signal 9
    a7a2
        7
    a7a2  
       2018-06-14 09:23:35 +08:00
    1、php 什么版本 检查一下漏洞
    2、检查一下 cron 这个 php 的代码 ,可能有问题,可能需要结合业务排查。
    3、看看是不是攻击?例如 http ddos

    直接给我 ssh 权限 我能查出来 收费
    nicevar
        8
    nicevar  
       2018-06-14 09:24:10 +08:00   1
    一天挂一次这么频繁应该很好查的,代码有内存泄漏,稍微压一下观察内存变化分析一下日志就能找到问题所在了
    greenskinmonster
        9
    greenskinmonster  
       2018-06-14 09:38:28 +08:00
    老板,来两斤内存
    quickma
        10
    quickma  
       2018-06-14 09:39:40 +08:00   1
    说明你水平不够
    duguxiaohuai
        11
    duguxiaohuai  
    OP
       2018-06-14 10:15:32 +08:00
    @greenskinmonster 已经 8G 内存 没多少数据量

    @a7a2 PHP5.6 是加了定时任务和 redis 之后挂了

    @nicevar 大哥你说的这个落地难啊
    a7a2
        12
    a7a2  
       2018-06-14 10:17:48 +08:00
    php 本身的日志,再看 php 代码
    nicevar
        13
    nicevar  
       2018-06-14 10:29:30 +08:00
    @duguxiaohuai #11 这个落地还难啊,那些一个月以上才崩一次是不是服务器可以不要了,你这也太弱了,一天就能重现的,压力测试一下,先观察内存占用情况,最蠢的办法部分加载排除也能看出个所以然了
    ming2050
        14
    ming2050  
       2018-06-14 10:30:33 +08:00 via iPhone
    谁让你内存爆了 oom killer 了解一下
    CoderGeek
        15
    CoderGeek  
       2018-06-14 10:37:49 +08:00
    看下 oom score
    huluhulu
        16
    huluhulu  
       2018-06-14 10:49:12 +08:00 via iPhone
    我们一年多丢一次消息导致 kpi peak 一瞬间的 bug 都定位出来了,你这个天天有问题这么容易重现的,不会太麻烦的。
    不可重现的 case 才头疼……
    letitbesqzr
        17
    letitbesqzr  
       2018-06-14 10:55:16 +08:00
    java web 表示... 8g 内存怎么跑. 启动起来就得跑满了...
    icegreen
        18
    icegreen  
       2018-06-14 11:48:23 +08:00
    定位分析问题算是基本素养了;
    一天一次的缕缕思路就找出问题了; 谈不上难.
    misaka19000
        19
    misaka19000  
       2018-06-14 11:52:31 +08:00
    @letitbesqzr #17 我们的 Java 都是跑在 4G 内存上无压力
    Universe
        20
    Universe  
       2018-06-14 11:59:06 +08:00 via Android
    我猜 crontab 分钟写的*
    duguxiaohuai
        21
    duguxiaohuai  
    OP
       2018-06-14 13:18:15 +08:00
    @mringg
    @letitbesqzr PHP 的话内存 8G 足够了啊
    duguxiaohuai
        22
    duguxiaohuai  
    OP
       2018-06-14 13:19:01 +08:00
    @Universe */1 * * * * 这样的 一分钟执行一次
    JasperYanky
        23
    JasperYanky  
       2018-06-14 13:37:45 +08:00
    是不是业务时间太长了 2 分钟没执行完,下面的业务又来了,然后堆积了;可以考虑一个进程 while True sleep(120) 这种方式,当然我不懂 PHP
    duguxiaohuai
        24
    duguxiaohuai  
    OP
       2018-06-14 13:43:46 +08:00
    @JasperYanky 感觉有点像这个问题 但是为什么白天正常 都是凌晨出问题
    3dwelcome
        25
    3dwelcome  
       2018-06-14 13:46:20 +08:00
    8G 内存够不够,又不是你觉得够不够,而是操作系统和程序觉得够不够。

    看一下 top 里的 swap,如果一直用磁盘换内存,在 99%内存的边缘徘徊,那出事是必然的。

    服务器要稳定,就必然要留余地,你内存碎片都没算进去呢,普通情况下,最稳定就是长占用总内存的 70%~80%,不能用太多了。
    JasperYanky
        26
    JasperYanky  
       2018-06-14 13:52:02 +08:00
    @duguxiaohuai 是不是晚上有其他程序跑?我晚上服务器负载比白天还高~
    privil
        27
    privil  
       2018-06-14 13:52:56 +08:00
    ……首先,你服务器的监控呢,内存监控图一眼就看出来了,oom 机制有很多文章详细讲了,不过为什么 nginx 的分数最高,居然是先挂 nginx 而不是先杀 php
    duguxiaohuai
        28
    duguxiaohuai  
    OP
       2018-06-14 13:53:32 +08:00
    @3dwelcome
    Tasks: 1268 total, 2 running, 1266 sleeping, 0 stopped, 0 zombie
    Cpu(s): 54.8%us, 16.7%sy, 0.0%ni, 23.7%id, 0.0%wa, 0.0%hi, 4.8%si, 0.0%st
    Mem: 8193324k total, 5348568k used, 2844756k free, 35780k buffers
    Swap: 0k total, 0k used, 0k free, 1161076k cached
    duguxiaohuai
        29
    duguxiaohuai  
    OP
       2018-06-14 13:55:57 +08:00
    @privil 老兄 给介绍一个监控软件吧 我也十分奇怪 循环的话应该是 php-fpm 挂掉,redis 也没挂掉,居然是 nginx 挂了,而且更奇怪的是半夜没有流量的,除了 2 点的数据备份,夜间没有其他操作
    duguxiaohuai
        30
    duguxiaohuai  
    OP
       2018-06-14 13:56:34 +08:00
    @JasperYanky 除了 2 点的备份 但是挂在三四点钟
    JasperYanky
        31
    JasperYanky  
       2018-06-14 13:58:03 +08:00
    @duguxiaohuai 我还是倾向于定时任务堆积的问题,你改了试试看,我印象深刻的原因,是我以前也这么干过,一模一样的感觉
    3dwelcome
        32
    3dwelcome  
       2018-06-14 14:01:31 +08:00   1
    swap 还是要的,不能设到 0k,关键时候,可以救命。要不然内存不够的话,进程就只有被杀的命。
    3dwelcome
        33
    3dwelcome  
       2018-06-14 14:02:58 +08:00
    "redis 也没挂掉"

    redis 对于 oom 有特殊的处理,代码写的和普通程序不一样。哪怕内存再少,也不会挂。
    deadEgg
        34
    deadEgg  
       2018-06-14 15:50:21 +08:00
    压力测试看内存增长 是否能复现该情况。
    我估计是有内存泄露。
    sparkssssssss
        35
    sparkssssssss  
       2018-06-14 17:00:17 +08:00
    如果不想被杀,调高评分即可
    pandaMao
        36
    pandaMao  
       2018-06-14 17:06:15 +08:00
    #20 #23 +1
    每次任务执行一次的时间是多长?
    defunct9
        37
    defunct9  
       2018-06-14 17:24:54 +08:00   1
    开 ssh,让我上去看看
    pcdRob
        38
    pcdRob  
       2018-06-14 17:49:58 +08:00
    哈哈 楼上老哥又来了
    fangxing204
        39
    fangxing204  
       2018-06-14 17:55:18 +08:00 via Android
    试试用 monit 监控下
    chengxiao
        40
    chengxiao  
       2018-06-14 21:15:28 +08:00
    我觉得老哥 可以看看 redis 的占用
    mingyun
        41
    mingyun  
       2018-06-14 22:28:02 +08:00
    不会是 for 循环里查数据库吧
    mafic
        42
    mafic  
       2018-06-14 22:51:00 +08:00 via iPhone
    @mingyun 我们这也有类似的问题 for 循环查数据的话咋整
    wwhc
        43
    wwhc  
       2018-06-15 00:46:11 +08:00
    8G 内存没有 Swap ? 请安装 zram
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2441 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 04:43 PVG 12:43 LAX 20:43 JFK 23:43
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86