电商系统加了一个 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.
1
lookwi 2018-06-14 08:53:11 +08:00 via iPhone
啥子哦,nNginx 执行定时任务🙀
|
2
Mbin 2018-06-14 09:00:00 +08:00 via iPhone
怀疑你代码内存泄露,跑一段时间就爆了
|
3
duguxiaohuai OP |
4
des 2018-06-14 09:09:21 +08:00 via Android
一点都没说清楚,
是有自己加的 nginx 模块吗? 是每次都是同一时间挂的吗? 有试过把时间调到其他时间点吗? dump 文件有看过吗丁? |
5
des 2018-06-14 09:12:09 +08:00 via Android
还有既然是 nginx 挂了,没去看 nginx 日志?
挂掉之前有访问异常吗? |
6
duguxiaohuai OP @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 |
7
a7a2 2018-06-14 09:23:35 +08:00
1、php 什么版本 检查一下漏洞
2、检查一下 cron 这个 php 的代码 ,可能有问题,可能需要结合业务排查。 3、看看是不是攻击?例如 http ddos 直接给我 ssh 权限 我能查出来 收费 |
8
nicevar 2018-06-14 09:24:10 +08:00 1
一天挂一次这么频繁应该很好查的,代码有内存泄漏,稍微压一下观察内存变化分析一下日志就能找到问题所在了
|
9
greenskinmonster 2018-06-14 09:38:28 +08:00
老板,来两斤内存
|
10
x7395759 2018-06-14 09:39:40 +08:00 1
说明你水平不够
|
11
duguxiaohuai OP |
12
a7a2 2018-06-14 10:17:48 +08:00
php 本身的日志,再看 php 代码
|
13
nicevar 2018-06-14 10:29:30 +08:00
@duguxiaohuai #11 这个落地还难啊,那些一个月以上才崩一次是不是服务器可以不要了,你这也太弱了,一天就能重现的,压力测试一下,先观察内存占用情况,最蠢的办法部分加载排除也能看出个所以然了
|
14
mringg 2018-06-14 10:30:33 +08:00 via iPhone
谁让你内存爆了 oom killer 了解一下
|
15
CoderGeek 2018-06-14 10:37:49 +08:00
看下 oom score
|
16
huluhulu 2018-06-14 10:49:12 +08:00 via iPhone
我们一年多丢一次消息导致 kpi peak 一瞬间的 bug 都定位出来了,你这个天天有问题这么容易重现的,不会太麻烦的。
不可重现的 case 才头疼…… |
17
letitbesqzr 2018-06-14 10:55:16 +08:00
java web 表示... 8g 内存怎么跑. 启动起来就得跑满了...
|
18
icegreen 2018-06-14 11:48:23 +08:00
定位分析问题算是基本素养了;
一天一次的缕缕思路就找出问题了; 谈不上难. |
19
misaka19000 2018-06-14 11:52:31 +08:00
@letitbesqzr #17 我们的 Java 都是跑在 4G 内存上无压力
|
20
Universe 2018-06-14 11:59:06 +08:00 via Android
我猜 crontab 分钟写的*
|
21
duguxiaohuai OP |
22
duguxiaohuai OP @Universe */1 * * * * 这样的 一分钟执行一次
|
23
JasperYanky 2018-06-14 13:37:45 +08:00
是不是业务时间太长了 2 分钟没执行完,下面的业务又来了,然后堆积了;可以考虑一个进程 while True sleep(120) 这种方式,当然我不懂 PHP
|
24
duguxiaohuai OP @JasperYanky 感觉有点像这个问题 但是为什么白天正常 都是凌晨出问题
|
25
3dwelcome 2018-06-14 13:46:20 +08:00
8G 内存够不够,又不是你觉得够不够,而是操作系统和程序觉得够不够。
看一下 top 里的 swap,如果一直用磁盘换内存,在 99%内存的边缘徘徊,那出事是必然的。 服务器要稳定,就必然要留余地,你内存碎片都没算进去呢,普通情况下,最稳定就是长占用总内存的 70%~80%,不能用太多了。 |
26
JasperYanky 2018-06-14 13:52:02 +08:00
@duguxiaohuai 是不是晚上有其他程序跑?我晚上服务器负载比白天还高~
|
27
privil 2018-06-14 13:52:56 +08:00
……首先,你服务器的监控呢,内存监控图一眼就看出来了,oom 机制有很多文章详细讲了,不过为什么 nginx 的分数最高,居然是先挂 nginx 而不是先杀 php
|
28
duguxiaohuai OP @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 |
29
duguxiaohuai OP @privil 老兄 给介绍一个监控软件吧 我也十分奇怪 循环的话应该是 php-fpm 挂掉,redis 也没挂掉,居然是 nginx 挂了,而且更奇怪的是半夜没有流量的,除了 2 点的数据备份,夜间没有其他操作
|
30
duguxiaohuai OP @JasperYanky 除了 2 点的备份 但是挂在三四点钟
|
31
JasperYanky 2018-06-14 13:58:03 +08:00
@duguxiaohuai 我还是倾向于定时任务堆积的问题,你改了试试看,我印象深刻的原因,是我以前也这么干过,一模一样的感觉
|
32
3dwelcome 2018-06-14 14:01:31 +08:00 1
swap 还是要的,不能设到 0k,关键时候,可以救命。要不然内存不够的话,进程就只有被杀的命。
|
33
3dwelcome 2018-06-14 14:02:58 +08:00
"redis 也没挂掉"
redis 对于 oom 有特殊的处理,代码写的和普通程序不一样。哪怕内存再少,也不会挂。 |
34
deadEgg 2018-06-14 15:50:21 +08:00
压力测试看内存增长 是否能复现该情况。
我估计是有内存泄露。 |
35
coolloves 2018-06-14 17:00:17 +08:00
如果不想被杀,调高评分即可
|
36
pandaMao 2018-06-14 17:06:15 +08:00
#20 #23 +1
每次任务执行一次的时间是多长? |
37
defunct9 2018-06-14 17:24:54 +08:00 1
开 ssh,让我上去看看
|
38
pcdRob 2018-06-14 17:49:58 +08:00
哈哈 楼上老哥又来了
|
39
fangxing204 2018-06-14 17:55:18 +08:00 via Android
试试用 monit 监控下
|
40
chengxiao 2018-06-14 21:15:28 +08:00
我觉得老哥 可以看看 redis 的占用
|
41
mingyun 2018-06-14 22:28:02 +08:00
不会是 for 循环里查数据库吧
|
43
wwhc 2018-06-15 00:46:11 +08:00
8G 内存没有 Swap ? 请安装 zram
|