突然502
今天突然发现网站突然 502 Bad Gateway ,说明后端服务崩了。我赶紧看了一下,发现SSH正常。试着重启nginx,无效,试着重启PHP-FPM,有效。说明PHP-FPM崩溃或无响应了。
第一反应是担心被黑客入侵,但是立马发现心跳信号应用也崩溃了,最后一个指令是killed,说明可能是被系统内核干掉了。经过排查,实际上相当一部分原因来自于 内存不足(OOM-Killer)。下面结合一次真实的案例,总结从怀疑被黑到确认是系统内存问题的排查流程。
入侵排查
安全排查
先排除安全问题,查看登录日志,主要检查是否有可疑的远程登录 IP。
last -a
检查自己的网页目录是否有新建或者篡改的文件,筛查思路是筛选出最近两天新增的文件,如下:
sudo find /var/www/html -type f -mtime -2
查看监听端口,确认是否有陌生服务在监听:
sudo ss -tulnp
系统日志排查
查看内核OOM日志:
dmesg -T | grep -i kill
sudo journalctl -xe | grep -i kill
如果看到 Out of memory 和 Killed process ...,说明是 内存不足触发 OOM-Killer。
我排查日志就发现,凌晨 1:51 左右内存耗尽,内核触发了 OOM-Killer,连续杀掉了多个服务:tuned、php-fpm、network-dispatcher、cron等。
这说明当时系统真的内存不够,而不是什么入侵事件。
排查云监控
现在用的是阿里云服务器,排查一下云监控,发现当时cpu飙升到60%,内存一下掉了33%,说明就是被强制终止释放内存了。
交换内存
检查swap
我是设置过交换内存的,按理来说,不应该出现OOM问题。检查是否启用了swap:
swapon --show
free -h
如果显示没有挂载文件,或者 Swap
一行是 0B,说明未设置交换文件或者未启用。
检查是否写入 fstab。只有写入了,下次重启才会自动开机挂载,否则只有这次生效:
cat /etc/fstab | grep swap
设置swap
如果没有设置,或者有问题,参考以下代码设置并且启用。可以自己修改交换文件的位置,并且最好给文件设置为root所有,并且给600权限。
# 创建文件
sudo fallocate -l 2G /swap/swapfile
# 设置为root所有,可读写,禁止其他用户读写
sudo chown root:root /swap/swapfile
sudo chmod 600 /swap/swapfile
# 激活交换内存,并且保证开机自动挂载
sudo mkswap /swap/swapfile
sudo swapon /swap/swapfile
echo '/swap/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
检查内核参数
即使 Swap 存在,Linux 内核也可能不使用!!!
这也是为什么这次会爆发OOM事件。究竟是使用物理内存还是使用交换内存是由 vm.swappiness 决定的。它是Linux内核的一个参数,决定了操作系统在内存和交换空间(swap)之间的调度策略。这个参数的值可以在0到100之间调整,影响系统使用swap的倾向。
swappiness
值越低,表示最大限度地使用物理内存,物理内存使用完毕后,才会使用swap分区。swappiness
值越高,表示积极地使用swap分区,并且把内存中的数据及时地置换到swap分区。- 0:表示几乎不用 swap,宁可 OOM也不使用交换内存,就白设置交换内存了
- 60(默认):平衡使用内存和 swap,意味着物理内存少于60%时才使用swap分区。
对于Linux内核3.5及以后的版本,将vm.swappiness设置为0意味着系统将不会使用swap,除非内存不足以应对当前的负载,这可能会增加内存不足(Out Of Memory, OOM)的风险。
查看当前的设定:
cat /proc/sys/vm/swappiness
而目前直接就看到设置的数值是0!!!这可能是云服务厂商自己设置的……
临时修改可以这么改(数值自己调):
sudo sysctl vm.swappiness=60
永久修改的话需要改文件,编辑/etc/sysctl.conf
文件,追加:
vm.swappiness=60
然后使用命令:
sudo sysctl -p
关闭swap分区
如果有需要,可以这样关闭swap分区。执行以下命令,关闭swap分区。
sudo swapoff /swap/swapfile
编辑etc/fstab
文件,并删除类似以下的swap相关挂载信息,取消swap自动挂载。
保存并退出,然后执行swapon --show
看看,确认swap分区是否已经关闭如果回显为空,则表示已经关闭swap分区。
小结
通过以上的一番操作,内存占用水平从1.3G降到了1.1G,应该不会再那么容易OOM了。
另外,我之前是检查过swap文件使用是0%还觉得很奇怪,去问某大模型,他告诉我这很正常,放心……乐。果然还是要多方查证哇。
Comments NOTHING