昨天晚上后台服务突然挂了,赶紧登上去一看,服务进程一个都没了,我们的进程托管是用的pm2 ,
使用pm2 ls 一看,所有服务全没了,
然后有一行报错 , no disk space ...
磁盘满了。然后赶紧看看

df -h

大致是

udev            7.8G  4.0K  7.8G   1% /dev
tmpfs           1.6G  7.6M  1.6G   1% /run
/dev/vda1        50G   18G   31G  37% /
tmpfs           7.8G   24K  7.8G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           7.8G     0  7.8G   0% /sys/fs/cgroup
overlay          50G   50   0  100% /var/lib/docker/overlay2/7e886934ab879d74e652c79951a2ad5025b0b6c942afbc51f688b4e0d1b15b22/merged
shm              64M     0   64M   0% /var/lib/docker/containers/79d703996dbed9c557e09f997aaede5c4224353756b9d2fc72d892036f5467de/mounts/shm
shm              64M     0   64M   0% /var/lib/docker/containers/c9eefc124300ac8f008cbb2cb12434f83e23af10a6a34265ea750c6a50214658/mounts/shm
tmpfs           1.6G     0  1.6G   0% /run/user/500

仔细观察是 overlay 满了,google一下 怀疑是 docker的日志文件满了,但是实际上去看呢,并没有多大的占用,最多也就2g
这个可就奇怪了。
然后执行

docker system df

发现镜像和容器加起来磁盘占用也不到2g,但是清理一下

docker system prune -a

执行完成之后并没有暖用,还是磁盘满的
然后pm2 info 服务进程 找到日志文件,先删了再说,空出来了10g左右的空间,然后把服务器跑起来了
然后在处理剩下的文件

sudo find . -xdev -type f -size +100M -print | xargs ls -lh | sort -k5,5 -h -r

寻找大于100m的文件,发现还有nginx的日志文件也需要清理一下。删完之后,居然还有20g左右的空间找不到占用的地方。。。
查看根目录下的所有文件夹占用

sudo du -s -h /* | sort -nr

加起来才20g 实际磁盘占用40g左右,

又是根据一番查找,发现可能是因为 进程暴毙,文件句柄占用没有被释放,然后没有释放磁盘空间
查看上面的这些进程

lsof | grep deleted
ps -p pid

拿到pid之后,可以看到 pm2托管的进程都没有释放
然后

// 这里释放服务的空间
pm2 reload 服务
// 这里释放pm2本身占用的空间
pm2 update

最后 df -h 一看,舒服了,只占用30%了