一次 KVM 虚拟机磁盘占满的排查过程

一次 KVM 虚拟机磁盘占满的排查过程

KVM 虚拟机系统为 CentOS,文件系统为 XFS。

现象如下:

  1. 使用 df -h 命令发现磁盘剩余空间为30k(总大小为30G),使用 df -i 发现 inode 可用数量为 800(总数为18w,正常状态为1000w+)
  2. 虚拟机为初始状态时,磁盘空间使用都正常

排查如下:

  1. 查看了几个日志,大小都在10M以下,并且这些日志几乎一一对应,不存在某个日志比其它多几个数量的问题,又因为是远程客户,于是漏了个文件,干
  2. 使用 du 命令(记住这个命令)排查具体是哪个目录占用的磁盘空间较多,du -h --max-depth=1 / 的结果显示磁盘空间只占用了 25% 左右,另寻它法
  3. 在网上搜索有磁盘文件删除未释放的说法,使用命令 lsof | grep deleted 找到未释放的文件小的可怜只有 10M 左右,这个不成立
  4. 既然磁盘看不出有啥问题,那就从 inode 数量看看,看看哪个目录下打开的文件数量较多 find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n -r | head -n 20 最多的目录还是 man 下的,最多5000,最多的20个目录下的数量相加不足50%,这个也不成立
  5. 从文件系统的角度看看,是不是碎片太多了需要回收一些这个碎片,找到磁盘号 df -aT | grep -w xfs,如果我的文件系统是 /dev/vda3, 那么通过xfs文件系统的命令 xfs_db -c frag -r /dev/vda3 看到只有 1.7% 的碎片,清理碎片 xfs_fsr /dev/vda3, 然而并没啥用处,再次查看只减少了 0.1% 的碎片
  6. 检测是否有坏道,badblocks -vs -b 4096 -c 32 /dev/vda3 发现都正常
  7. 找不到解决方案,于是向红帽发了封邮件(未回)

因为一下拿不出解决方案,只能硬着头皮把这个虚拟机从客户那搞回来,恢复现场,有了进展

  1. 解压完后这个镜像文件有 30G,没多想,就是觉得有的大
  2. 尝试对这个镜像文件进行磁盘扩容,qemu-img resize , 在这之前实验了一下一个临时的虚拟机,其中一个命令 qemu-img info 发现两个虚拟机的 virtual size 都是30G,但是显示临时虚拟机的disk size 只有6G,而那个有问题的虚拟机 disk size 刚好是 30G,目前这个虚拟机还没有启动,肯定是里面真的占用了这么多磁盘
  3. 于是准备把里面的日志文件拿出来在 vscode 中看一下,然后使用 virt-copy-out 一个文件时发现有一步巨慢,好了后看了一下这个文件 20G+,du的结果加上这个文件大小刚好就是总的大小,磁盘的问题就解决了,至于为什么这么大那是业务的东西了

由于和业务相关,所以写的还是有点模糊,这里解释一下

  1. xfs 文件系统的 inode 总数是会变的,在剩余磁盘空间不足5%时,开始减少
  2. 最最最重要的一个点,那个忽略的文件是被隐藏的(挂载内核),ls du 等命令是发现不了这个文件的,刚好人为的疏忽加上隐藏的特性导致排查的困难
  3. 碎片的清理功能还是很有用的,在宿主机上清理一下有几十的碎片被清理

posted on 2020-11-03 17:53  小胖西瓜  阅读(1728)  评论(0编辑  收藏  举报

导航