磁盘满了别急着删日志,我踩过这个坑
【摘要】 删了日志磁盘还是满?多半是文件被进程占着没释放。用 lsof 找出这类文件,truncate 清空比 rm 管用,顺手把 logrotate 配上。
磁盘写满的那一刻,第一反应永远是删日志。我第一次遇到也这么干,删了 8 个 G,df -h 一看,还是 100%。
命令敲下去的时候心里挺有底气,觉得这么大一块日志删掉肯定够用。结果刷新一下,使用率一点没变。
后来才搞明白,Linux 上你 rm 一个正在被进程打开的文件,目录项是没了,但占用的块不会释放。进程还拿着那个 fd 在写,内核就当这个文件还活着。磁盘该满还是满。
判断方法很简单:
lsof | grep deleted
列出来的就是这种"删了但没真删"的文件,第二列是进程 PID,后面有文件大小。我那台机器上,nginx 的两个 worker 各占着 3 个 G 的 access.log,加起来比我想清空的还多。
处理有两条路。要么重启对应进程,让它把 fd 关掉,空间自然回笼。要么更稳妥一点,先 truncate -s 0 把文件截断,进程还能继续写,但内容清空了。生产环境一般选后者,重启有风险。
我当时的做法是先 truncate,再给 nginx 配 logrotate,按天切分保留七天。配完顺手把 rsyslog 也调了,它才是真正的日志大户。
还有个细节:真正卡住的不一定是空间,也可能是 inode。df -i 看一下 inode 使用率,小文件太多的时候,空间还有一半,inode 先满了,表现一样是"磁盘满",但删大文件完全没用。
现在我的习惯是出事先看三个数:df -h、df -i、lsof | grep deleted。三个都看完再动手,比上来就 rm 安全得多。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)