Solve Disk Space Occupancy Rate in Linux & Clear Docker logs
首选要查找占用大量磁盘空间的文件,基本是长久不清理的日志文件
-
du --exclude=/proc --total -sh /* | sort -hr
-
find / ! -path '/proc*' -size +200M -print
通过上面两台命令可以快速找出大文件,但是不能贸然删除日志文件,否则很可能出现删除文件后,空间仍然得不到释放
删除文件后,空间不释放的情况,很可能是文件被进程锁住,或者是有进程一直往文件写数据.
文件在Linux系统中分两部分:
- 指针部分:存在文件系统的meta-data中,执行rm删除后,指针就从meta-data中被清除了
- 数据部分:数据就是文件本身,当指针被从文件系统meta-data中清除后,数据部分被标记为可用,就可以覆盖,写入新数据了
删除日志文件后,空间得不到释放,就是由于进程还在占用文件,指针并没有从文件系统meta-data中清理掉
我们可以重启进程,甚至重启系统,但对于生产环境是绝对不行的
生产环境最安全的方式是
> file
:> file
echo '' > file
通过上面的方式,会释放占用的磁盘空间,也不会影响进程的继续执行
Experiment:
-
dd if=/dev/zero of=/root/uiop bs=1M count=2048
产生了一个2G的文件,Inode为136198
- 模拟占用文件
tail -F uiop
- 查看磁盘空间
df & du 统计会有一定差异
-
删除文件再次统计
du 统计的结果发生变化,但是df 仍然没变
lsof查看
inode号码是相同的
所以直接删除文件是危险的
下面是清空文件的方式结果
Docker
-
docker logs -f --since 30s container docker logs -f --tail 20 container : > $(docker inspect --format '{{.LogPath}}' container)
-
bash -c 'truncate -s 0 /var/lib/docker/containers/*/*-json.log'
- logrorate
/var/lib/docker/containers/*/*.log { rotate 7 daily compress missingok delaycompress copytruncate }
Once you have configured Logrotate for you Docker container you can test it with
logrotate -fv /etc/logrotate.d/docker-container
. You should get some output and a new log file with suffix[CONTAINER ID]-json.log.1
should be created. This file is compressed in next rotation cycle.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律