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

2018-06-14 08:47:03 +08:00
 duguxiaohuai

电商系统加了一个 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.

7937 次点击
所在节点    问与答
43 条回复
duguxiaohuai
2018-06-14 13:18:15 +08:00
@mringg
@letitbesqzr PHP 的话内存 8G 足够了啊
duguxiaohuai
2018-06-14 13:19:01 +08:00
@Universe */1 * * * * 这样的 一分钟执行一次
JasperYanky
2018-06-14 13:37:45 +08:00
是不是业务时间太长了 2 分钟没执行完,下面的业务又来了,然后堆积了;可以考虑一个进程 while True sleep(120) 这种方式,当然我不懂 PHP
duguxiaohuai
2018-06-14 13:43:46 +08:00
@JasperYanky 感觉有点像这个问题 但是为什么白天正常 都是凌晨出问题
3dwelcome
2018-06-14 13:46:20 +08:00
8G 内存够不够,又不是你觉得够不够,而是操作系统和程序觉得够不够。

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

服务器要稳定,就必然要留余地,你内存碎片都没算进去呢,普通情况下,最稳定就是长占用总内存的 70%~80%,不能用太多了。
JasperYanky
2018-06-14 13:52:02 +08:00
@duguxiaohuai 是不是晚上有其他程序跑?我晚上服务器负载比白天还高~
privil
2018-06-14 13:52:56 +08:00
……首先,你服务器的监控呢,内存监控图一眼就看出来了,oom 机制有很多文章详细讲了,不过为什么 nginx 的分数最高,居然是先挂 nginx 而不是先杀 php
duguxiaohuai
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
2018-06-14 13:55:57 +08:00
@privil 老兄 给介绍一个监控软件吧 我也十分奇怪 循环的话应该是 php-fpm 挂掉,redis 也没挂掉,居然是 nginx 挂了,而且更奇怪的是半夜没有流量的,除了 2 点的数据备份,夜间没有其他操作
duguxiaohuai
2018-06-14 13:56:34 +08:00
@JasperYanky 除了 2 点的备份 但是挂在三四点钟
JasperYanky
2018-06-14 13:58:03 +08:00
@duguxiaohuai 我还是倾向于定时任务堆积的问题,你改了试试看,我印象深刻的原因,是我以前也这么干过,一模一样的感觉
3dwelcome
2018-06-14 14:01:31 +08:00
swap 还是要的,不能设到 0k,关键时候,可以救命。要不然内存不够的话,进程就只有被杀的命。
3dwelcome
2018-06-14 14:02:58 +08:00
"redis 也没挂掉"

redis 对于 oom 有特殊的处理,代码写的和普通程序不一样。哪怕内存再少,也不会挂。
deadEgg
2018-06-14 15:50:21 +08:00
压力测试看内存增长 是否能复现该情况。

我估计是有内存泄露。
coolloves
2018-06-14 17:00:17 +08:00
如果不想被杀,调高评分即可
pandaMao
2018-06-14 17:06:15 +08:00
#20 #23 +1
每次任务执行一次的时间是多长?
defunct9
2018-06-14 17:24:54 +08:00
开 ssh,让我上去看看
pcdRob
2018-06-14 17:49:58 +08:00
哈哈 楼上老哥又来了
fangxing204
2018-06-14 17:55:18 +08:00
试试用 monit 监控下
chengxiao
2018-06-14 21:15:28 +08:00
我觉得老哥 可以看看 redis 的占用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/462957

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX