干货|disk.usage告警,看这一遍就够了原创
背景
磁盘利用率告警持续1天了
看到有线上ECS磁盘告警持续一天了。
问了下,已经处理过,该删都删了,但是告警还是消不掉。目前超的不是太多,就没有再管了
如果一直触发告警,担心影响到处理其它重要告警,就花时间去处理一下
问题描述
想了解查看大文件的详情命令?见文章末尾
2、删除老的日志文件
【日志文件一般保留90天即可】 查看最后修改时间大于90天,且文件大小大于500M的文件。 find / -type f -size +500M -mtime +90 |xargs rm -f tips: 这个可以设置一个crontab任务来定期清理的
5、难道是删除了被Linux线程正在使用的文件?
查看已被删除,但文件句柄仍未释放的文件
lsof |grep deleted tips: 有些机器可能未安装这个工具。 Unix-like OS可以使用命令 yum -install lsof 安装 其它操作系统上的安装办法,在度娘上可以找到的哦
问题已经搞清楚了,来整体梳理下
故障原因
持续告警原因分析
直接使用rm命令删除
解决办法
优化措施
echo "">/z/java/apache-tomcat-8.5.11/logs/catalina.out 或 cat /dev/null >/z/java/apache-tomcat-8.5.11/logs/catalina.out
故障小结
文件系统告警排查问题小结
一个疑问:为什么不使用du的执行结果
du命令是用户级的程序,它不考虑Meta Data;
关于Meta Data的介绍详见文末
https://zhuanlan.zhihu.com/p/560196301
加餐环节
du - man page描述 du:estimate file space usage。它的原理是深度优先遍历目标文件目录下的所有文件(非orphan inode),使用stat()家族获取文件信息。它的数据是基于文件获取,可以跨多个分区操作。包含了分配给文件及目录的磁盘块数。 df - man page描述 df:report file system disk space usage。coreutils中的df使用了glibc的statvfs(),间接地调用系统调用statfs()家族,数据来源于文件系统的super block。包含了用户数据(文件及目录)和Meta Data。
Meta Data:
文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等。 这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data。
查看大文件的命令:
查看最后修改时间大于90天,且文件大小大于500M的文件。 日志文件一般保留90天即可 find / -type f -size +500M -mtime +90 |xargs du -ksh 如果确认涉及的文件都可以删除,则可以使用命令 find / -type f -size +500M -mtime +90 2 |xargs rm -f 说明:“/”代表的是根目录。如果只想搜指定的目录,更新这个参数即可,譬如查看/opt目录 find /opt -type f -size +500M -mtime +90 |xargs du -ksh
Permission denied
find / -type f -size +500M -mtime +90 2>/dev/null |xargs du -ksh
find / -type f -size +500M -mtime +90 2>/dev/null |xargs rm -f
du命令报错了:No such file or director
find / -type f -size +500M -mtime +90 2>/dev/null |xargs du -ksh 2>/dev/null
find / -type f -size +500M -mtime +90 2>/dev/null |xargs rm -f
Linux的保留文件描述符
Linux 文件描述符到底是什么?
文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。 一个 Linux 进程可以打开成百上千个文件,为了表示和区分已经打开的文件,Linux 会给每个文件分配一个编号(一个 ID),这个编号就被称为文件描述符(File Descriptor)。 一个 Linux 进程启动后,会在内核空间中创建一个 PCB【Process Control Block】,PCB 内部有一个文件描述符表(File descriptor table),记录着当前进程所有可用的文件描述符,也即当前进程所有打开的文件。 0、1、2 这三个是特殊的文件描述符: 标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。 标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。 标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件。
文件描述符-文件表-i-node表的作用域及之间的关系
FD使用规则
/dev/null又是什么呢?
/dev/null 属于字符特殊文件,它属于空设备,是一个特殊的设备文件,它会丢弃一切写入其中的数据,写入它的内容都会永远丢失,而且没有任何可以读取的内容。俗称“黑洞”,只进不出之意。
2>/dev/null
所做的重定向是将命令错误的输出到 /dev/null ,也就是将命令执行时发生的错误信息的输出重定向到 /dev/null 。然后 /dev/null 只做一件事,那就是将这些信息都全部丢弃掉。
find /opt -type f -size +500M -mtime +90 -exec du -ksh {} \; 2>/dev/null find /opt -type f -size +500M -mtime +90 -exec rm -f {} \; 2>/dev/null
find命令配置exec使用时,结束标志“;”前要加转义符\
{}与结束标志之间要加空格
如何发现被应用程序引用了“已删除”文件呢?
lsof:list open files 使用lsof查看打开的文件。
lsof命令查看deleted状态的文件
Used和Avail加起来不够Size,莫名被吃掉一部分
tune2fs -m 1 /dev/vda1
通过下图可以看到前后对比:
调整预留空间比例
这样被吃掉的空间,就释放出来了!
参考:
https://mp.weixin.qq.com/s/ViMNsRnfVkmQO7mvrbWrWQ
https://mp.weixin.qq.com/s/oCK0chpOmJcCnPdMhcketw
https://cloud.tencent.com/developer/article/1492195
https://www.jianshu.com/p/8c8a19048179
http://c.biancheng.net/view/3066.html
https://www.cnblogs.com/softidea/p/3965093.html
https://www.jianshu.com/p/8df4e9ff6628