Linux中磁盘空间的占用情况分析与垃圾清理方案
Linux中磁盘空间的占用情况分析与垃圾清理方案
这里以一台基于Docker部署微服务和中间件的虚拟机为例, 首先使用df -h
查看文件系统整体的磁盘空间占用情况
1 | df -h |
磁盘空间几乎被占满, 尤其是根分区/
和Docker的overlay
文件系统
清理Docker的占用空间
查看 Docker 镜像和容器的磁盘使用情况
docker system df -v
清理未使用的 Docker 镜像、容器、网络和数据卷
docker system prune -a
查找大文件和目录
使用du
命令查找占用大量空间的文件和目录
查看根目录下各个子目录的大小,
sort -hr
倒序排列du -h --max-depth=1 / | sort -hr
进一步深入查看占用空间较大的目录
1
2
3du -h --max-depth=1 /var
du -h --max-depth=1 /var/lib
du -h --max-depth=1 /var/lib/docker
优雅删除
查找并删除旧的日志文件
批量/var/log删除日志文件名为*.log
文件
find /var/log -type f -name "*.log" -delete
批量删除当前路径日志文件名不包含当日的时间戳的文件, 在删除之前务必要检查你的工作路径
find . -type f ! -name "*.2024-07-21.log" -exec rm {} \;
不确定会删除哪些文件的话, 可以先移除掉-exec rm {} \;
看看哪些文件会筛选出来
有保留的删除文件
使用ls
命令列出所有的备份文件, 使用-t
参数来按修改时间排序, -r
参数来反向排序(最新的文件在前)
列出特定文件名的文件
ls -rt /var/atlassian/application-data/confluence/backups/backup-*.zip
使用head
命令来筛选除了最新的三个文件之外的所有文件列表
ls -rt | head -n -3
搭配xargs
命令来删除这些文件
ls -rt | head -n -3 | xargs rm
使用清空而不是删除文件
truncate
命令可以用来清空文件, 使其大小变为0
ls -t /var/atlassian/application-data/confluence/backups/backup-*.zip | head -n -3 | xargs truncate -s 0
使用>
重定向操作符, 它将一个空文件的内容重定向到指定的文件, 从而清空文件内容
ls -t /var/atlassian/application-data/confluence/backups/backup-*.zip | head -n -3 | xargs -I {} > {}
清理僵尸文件
有时, 删除的文件仍被进程占用, 导致空间未释放, 查找并清理僵尸文件
lsof | grep delete | sort -k7 -rn | more
通过重启相关进程或服务器来释放这些文件占用的空间
检查inode使用情况
如果inode
用完了, 即使有可用空间也无法创建新文件
查看inode
使用情况
df -i
清理占用大量inode
的文件或目录
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
什么时候清空文件, 什么时候删除文件
如果文件非常大, 清空文件可能会比删除文件消耗更多的资源, 可能需要更多的磁盘I/O
来写入零值
但是涉及到文件正在被引用时, 直接删除并不会释放空间, 参考Linux文件删除后空间没有被释放的原因和解决方案, 这个时候就应该选择清空而不是删除