V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
duguxiaohuai
V2EX  ›  问与答

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

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

    电商系统加了一个 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
    老板,来两斤内存
    x7395759
        10
    x7395759  
       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 这个落地还难啊,那些一个月以上才崩一次是不是服务器可以不要了,你这也太弱了,一天就能重现的,压力测试一下,先观察内存占用情况,最蠢的办法部分加载排除也能看出个所以然了
    mringg
        14
    mringg  
       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
    压力测试看内存增长 是否能复现该情况。

    我估计是有内存泄露。
    coolloves
        35
    coolloves  
       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   ·   实用小工具   ·   3130 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:57 · PVG 21:57 · LAX 05:57 · JFK 08:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.