大家好,我是程序员soulmate,今天和大家分享一起线上服务器爆表事故。
事情是这样的,近来有运营同事反馈,说线上的服务报错了,让我排查一下。果不其然,一打开Xshell工具,服务器连不上了,赶忙去阿里云看一下资源使用情况,结果就是CPU一直飙升不下。
如下图所示:
看着这图CPU资源也不是特别高啊,但是结合整体的资源监控来看,不仅仅是CPU飙升,还有内网带宽、公网带宽、磁盘读写、内存基本上是同时飙高,然后我就有点慌,是不是中了什么病毒。
但仔细一想,谨小慎微的我,一般只开80、443端口,其他端口要开放也是指定IP进行开放的,按理不会有攻击的风险。
于是便去和阿里云售后工程师进行battle,因为我已经连不上那台服务器了,只能找客服看一下具体什么问题,然后售后给我的回复是有一个进程一直在占用CPU资源,该进程叫 kube-apiserver,心里咯噔一下,是因为我们服务器有集群的K8S界面化操作工具 KubeSphere。
让我想想,按理来说,只有从服务挂了才会有这种问题,因为之前从节点服务器忘记续费就导致过这种问题,但我去看了一下两台从节点服务器,都能连上的呀,都是正常运行的(只是简单看了一下能否连上,没有去看CPU、内存、磁盘等资源信息)。
然后我就去使用重启大法,看一下能不能解决掉这个问题,重启完之后发现过几分钟就直接连不上了,那就说明还有其他问题,重启解决不了。
由于没空,实在没时间处理了,我就简单把线上使用频繁使用的一些服务迁移到了一台资源容量更大的服务器上,也还没有去排查服务器CPU资源被打满的具体原因,就先搁置吧。
于是,一天后。。。
又一台服务器爆了,是从节点的一台服务器,先是数据库报错Caused by: java.sql.SQLException: The table 'sys_log_login' is full
,然后又看到Redis服务报错,
Caused by: io.lettuce.core.RedisCommandExecutionException: MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
看到这些报错的下意识就是磁盘满了,命令查看,果不其然,就是磁盘满了,使用率100%,头皮发麻。
# 查一下根目录的磁盘使用情况
du --max-dept=1 -h /
# 查看磁盘占用情况
df -h
首先定位到 /var/lib/docker/overlay2/
这个目录占了整个磁盘的80%,使用量是100%。
docker镜像?容器?日志?
这就需要一个一个去排查了,然后镜像基本上我更新服务都会清理旧的镜像,不使用的容器更是没有,那就清理一下日志吧。
日志清理脚本
#!/bin/bash
echo "======== start clean docker containers logs ========"
logs=$(find /var/lib/docker/containers/ -name *-json.log)
for log in $logs
do
fileSizeByte=$(wc -c $log |awk '{print $1}')
((fileSizeKB=$fileSizeByte/1024))
echo "clean logs :$fileSizeByte Bytes $fileSizeKB KB - $log"
cat /dev/null > $log
done
echo "======== end clean docker containers logs ========"
执行完这个脚本之后,磁盘使用量直接空出了40多个G,那就是因为日志堆积导致的磁盘被占满,切记及时清理不要用的日志信息。。。
直到到这里,之前是不是说Master节点的CPU资源被占满,这时我才反应过来,可能就是因为node1服务磁盘爆满,然后kubesphere一直重连,从节点服务器node1又磁盘满了kubesphere报错了,因为是集群的,所以就影响到了Master节点服务器,果然,再去查看Master节点服务器就莫名的可以了,CPU也不飙升了,服务器也正常了。
血的教训啊!!!
-
一定要做监控服务器资源,当资源额度剩余10%或者其他值的时候要有警告信息,不然真的很累人。
-
还有就是一定要及时清理日志和临时文件!