
机器用久了很容易生成很多临时或者无用的文件占用大量空间造成磁盘不够用。尤其是服务器当磁盘不够用时系统会出现莫名其妙的问题数据库可能会造成数据损坏。此时快速定位可以删除的大文件并及时释放空间是非常重要的。目录第一步、查看磁盘整体使用情况第二步、查找占用空间大的文件和目录2.1 查找占用最大的前十个文件或目录2.2 查看当前目录所有子文件和子目录的大小2.3 查看包含隐藏文件夹的大小第三步、系统日志清理第四步、Docker日志清理第五步、可能涉及的场景【参考】第一步、查看磁盘整体使用情况这里使用df命令它可以查看所有已挂载磁盘的使用情况 df -h-h 把输出中的磁盘空间按照友好形式显示比如MGT等等。输出类似这里着重注意两列Avail可用空间直接看那些空间不够用的磁盘Mounted on挂载点确定了有问题的磁盘后查看对应的挂载点一般一个磁盘就是根目录 / 。第二步、查找占用空间大的文件和目录这里使用du命令他可以查看特定目录默认当前目录下所有文件、目录和自目录的占用情况。2.1 查找占用最大的前十个文件或目录 du -c | sort -nr | head -10du -c 显示已列出文件总的大小sort -nr 表示按数字大小倒序排列head -10 表示显示前10个输出类似可以看出来示例中最占用空间的是mysql的数据文件还有一个系统日志文件。这里每个人的情况不一样也可能会找到别的大文件确认是否可以腾出空间。接下来讲一下系统日志的清理。2.2 查看当前目录所有子文件和子目录的大小 du -sh *这里层层往下找的时候很好用找到最大的目录然后查看它下面的占用分布然后再找到其中最大的一层层递进很容易找到问题点。输入类似可以看到/var/log占用了4.1G此时可以 cd 到此目录然后继续运行此命令直到找到问题所在。2.3 查看包含隐藏文件夹的大小有些隐藏文件夹会很大比如缓存文件等。 du -sh .[!.]* * | sort -h # 或 du -sh .[^.]* .??* * | sort -h能看到诸如 .cache、.npm、.vnc、.bash_history、.local/share/Trash 等隐藏目录/文件它们往往把空间吃掉了。 du -ah --max-depth1 /root | sort -hr | head把 /root 下所有条目含隐藏按大小排序一眼就能定位到“元凶”。第三步、系统日志清理在linux系统中journal和syslog都是比较基础的日志服务很多时候会发现journal日志变得越来越大可以通过配置来释放空间。查看配置 journalctl --disk-usage发现占用了4G我们配置成500M journalctl --vacuum-size0.5G可以看到配置大小后相关日志马上被清理了。还可以配置日志存储的期限 journalctl --vacuum-time1months需要注意的一点是因为缩短了保存时间和减小了空间大小建议定期做好系统的备份。第四步、Docker日志清理如果有安装docker注意有些应用可能造成日志爆盘。4.1、先用df -h查看整体使用df -h可以看到/var/lib/docker是元凶overlay2 目录已经撑满。4.2、查看日志情况du -h /var/lib/docker/containers/*/*-json.log 2/dev/null | sort -rh | head可以看到第一个容器占用的日志有46G可以判断这是对应容器出了问题。4.3、查找容器通过上面输出日志路径/var/lib/docker/containers/a4318930029c386725e97f2f9b36d6d856f527cf9093932ce5a39169e28547fc/a4318930029c386725e97f2f9b36d6d856f527cf9093932ce5a39169e28547fc-json.log取前12位即为容器IDa4318930029c4.4、查看最新日志输出docker logs --tail 100 a4318930029c可以看到该容器试图访问nacos结果没有成功然后反复重启反复报错。也可以用下面命令统计重复的日志输出# 取最后 1 万行统计出现最多的内容 # tail -n 10000 日志文件路径 | awk -Flog: {print $2} | sort | uniq -c | sort -rn | head -20 tail -n 10000 /var/lib/docker/containers/a4318930029c386725e97f2f9b36d6d856f527cf9093932ce5a39169e28547fc/a4318930029c386725e97f2f9b36d6d856f527cf9093932ce5a39169e28547fc-json.log | awk -Flog: {print $2} | sort | uniq -c | sort -rn | head -20这会告诉你“哪条日志被刷了最多遍”基本就能锁定罪魁祸首。找到问题原因后接下来就是从应用层面修复问题比如这里修复nacos的问题。4.5、清空日志修复容器内应用的问题后就可以清空该日志文件不要rmrm后 Docker 仍持有文件句柄空间不会释放truncate -s 0 /var/lib/docker/containers/a4318930029c386725e97f2f9b36d6d856f527cf9093932ce5a39169e28547fc/a4318930029c386725e97f2f9b36d6d856f527cf9093932ce5a39169e28547fc-json.log4.6、配置docker限制日志输出为了避免docker内部署应用不可预料的行为建议从docker级别来限制日志输出。4.6.1、全局配置编辑/etc/docker/daemon.json没有就新建{ log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 } }含义每个容器日志最大 100M最多保留 3 个文件滚动单个容器最多占 300M。然后重启 Docker会重启所有容器注意业务影响。daemon.json 的日志配置只对新创建的容器生效。4.6.2、单应用配置docker run --log-opt max-size100m --log-opt max-file3 ...或在docker-compose.yml中services: your-service: logging: driver: json-file options: max-size: 100m max-file: 3这些配置也是只有在创建时配置才生效。第五步、可能涉及的场景5.1、访问网页提示 net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)在chrome中使用开发者工具发现错误GET https://www.demo.com/static/js/echarts.dbf449d8.jsnet::ERR_INCOMPLETE_CHUNKED_ENCODING 200 (OK)这个错误表示 Nginx 在向浏览器传输文件这里是echarts.js时数据没有完整发送就被意外中断了。这个错误通常发生在使用“分块传输编码”Chunked Transfer Encoding传输响应时客户端浏览器没有收到结束标志或者收到的数据不完整。Nginx 在磁盘满的状态下reload、写临时文件、缓存管理都可能表现异常。【参考】Linux环境下通过journal命令查看和管理日志_linux journal-CSDN博客centos7下解决journal日志越来越大的问题-腾讯云开发者社区-腾讯云