首页 > 其他分享 >一次磁盘占用率 100% 的排查记录

一次磁盘占用率 100% 的排查记录

时间:2022-12-16 12:33:07浏览次数:72  
标签:容器 log 100% Logstash 磁盘 docker 占用率 日志

你好,我是悟空。

最近遇到一个服务器的问题:磁盘满了,占用率 100%~

这个问题太常见了,于是先来排查一波是哪些文件占用了大量磁盘。

一、排查磁盘占用率100%

1.1 查看磁盘使用的大致情况

第一个命令就是 df -h,来查看磁盘的占用情况。df 是 disk free 的缩写,用于显示目前在 Linux 系统上的文件系统磁盘的使用情况统计。

如下图所示,可以看到磁盘占用率 100%。

一次磁盘占用率 100% 的排查记录_磁盘

第一列 ​​Filesystem​​ 代表文件系统的名称。

第二列 ​​Size​​ 表示文件系统的大小。

第三列 ​​Used​​ 表示已占用多大的磁盘空间。

第四列 ​​Avail​​ 表示可用磁盘空间的大小。

第五列 ​​Use%​​ 表示磁盘使用率多大,100% 表示磁盘占满了。

第六列 ​​Mounted On​​ 表示挂载在哪个目录。

从上面的结果可以看到有个文件系统占用率为 100%,为​​/dev/sda2​​​,挂载的目录为 ​​/​​,那我们就来看下这个目录下都存放哪些大文件吧。

1.2 查看目录下的大文件

使用 du 命令来显示目录或文件所占用的磁盘空间大小。

# 先进入到根目录 `/`
cd /
# 列出当前目录或文件的总大小,并按倒叙排序
du -sh /* | sort -nr

找到最大的目录 ​​var​​,占用 100 多个 G。进入到这个目录中,然后再次执行 du 命令

du -sh /var/* | sort -nr

这样一级一级的找,就能找到占用空间最大的文件了。

最后发现是 Logstash 容器的日志文件占用太大,截图如下。大家看到的占用 4.8G,这是我清理日志之后的大小,之前这个容器占用 ​​90​​ 多个 G。

一次磁盘占用率 100% 的排查记录_日志_02

1.3 Logstash 容器为什么占用磁盘这么大

为啥 Logstash 容器会有这么多日志???

我们看下这个日志里面的内容就知道了。使用 tail 命令查看文件的最后 100 行数据。

tail -n 100 <容器 id>-json.log
# 也可以通过 docker logs 来查看日志
docker logs --tail=100 159

发现全都是 Logstash 解析日志时打印的信息。如下图所示:

一次磁盘占用率 100% 的排查记录_日志_03

每次 Filebeat 采集日志后,传输给 Logstash 后,Logstash 都会打印一条解析后的日志。

而我们的后端服务会打印很多日志,传输给 Logstash 的日志会越来越多,Logstash 又会疯狂的写自己的解析日志,久而久之,磁盘就被占满了

问题原因找到了,那解决方案是什么呢?

二、容器日志清理方案

  • 方案一:手动清理日志文件,可解燃眉之急,治标不治本。
  • 方案二:脚本定期清理日志文件,缺点是日志文件全丢了,无法追溯。
  • 方案三:限制所有容器的日志文件大小,治本,缺点是需要重新创建容器和启动 docker 镜像。

2.1 方案一:手动清理方案

cat /dev/null > /var/lib/docker/containers/容器id/容器id-json.log

注意:这里没有使用 ​​rm​​​ 方式来删除文件。使用 ​​rm -rf​​​ 方式删除日志后,通过 ​​df -h​​​ 会发现磁盘空间并没有释放。原因是在Linux或者Unix系统中,通过 ​​rm -rf​​ 或者文件管理器删除文件,将会从文件系统的目录结构上解除链接(unlink)。如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。正确姿势是cat /dev/null > *-json.log,当然你也可以通过rm -rf删除后重启docker。

2.2 方案二:脚本定期清理

提供一个清理脚本

#!/bin/sh 

echo "======== start clean docker containers logs ========"

logs=$(find /var/lib/docker/containers/ -name *-json.log)

for log in $logs
do
echo "clean logs : $log"
cat /dev/null > $log
done

echo "======== end clean docker containers logs ========"

给脚本添加权限

chmod +x clean_docker_log.sh

执行脚本的命令

./clean_docker_log.sh

大家可以把执行脚本的命令加到 Linux 的​​定时任务​​中就可以了,这里不做展开。

下面要说的是我目前使用的方案。

2.3 方案三:限制 Docker 容器日志大小

新建 /etc/docker/daemon.json,若有就不用新建了。

vim /etc/docker/daemon.json

配置内容如下:

{
"log-driver":"json-file",
"log-opts": {"max-size":"500m", "max-file":"3"}
}

max-size=500m,表示容器的日志文件大小上限是 500M,
max-file=3,表示容器有三个日志,第一个满了 500M之后就写第二个,第二个满了 500M就写第三个,如果第三个满了,就清空第一个日志文件,重新写第一个日志文件。如下图所示:

一次磁盘占用率 100% 的排查记录_100%_04

改完之后需要重启 docker 守护进程

systemctl daemon-reload
systemctl restart docker

另外这种方式只对新建的容器有效的,之前的容器不生效,所以我又把之前的 Logstash 容器删除了,然后重新启动了一个 Logstash 容器。

参考资料:

Linux df 命令 ​​https://www.runoob.com/linux/linux-comm-df.html​

Linux du 命令 ​​https://www.runoob.com/linux/linux-comm-du.html​

关于我

8 年互联网开发经验,擅长微服务、分布式、架构设计。目前在一家大型上市公司从事基础架构和性能优化工作。

签约作者、蓝桥签约作者、阿里云专家博主、51CTO 红人。

标签:容器,log,100%,Logstash,磁盘,docker,占用率,日志
From: https://blog.51cto.com/u_11950846/5947136

相关文章

  • Linux挂载新磁盘
    Linux挂载新磁盘1.查看磁盘#df-lh#查看磁盘占用情况,同时可以查看已挂载的磁盘及其挂载位置#fdisk-l#查看所有的磁盘分区图中/dev/sdb下无分区信息,表示未......
  • 创建虚拟磁盘
    1.1dd命令简介(部分说明来自dd(Unix)wiki)dd命令用于转换和复制文件,不过它的复制不同于cp。之前提到过关于Linux的很重要的一点,一切即文件,在Linux上,硬件的设备驱动(如......
  • S1 - Lesson 99 - 100
    Wordsow slipbecarefulslipperyfloorcautionwetfloor  downstairsgodownstairs hurthurthurthurt backmybackthebackdoor strandup ......
  • 惠普笔记本电脑更新BISO时,Firmware Updete 100%后卡住
    一般来说只会卡5-10分钟,耐心等待半小时后应该会好,如果半小时后还是没有反应,可按如下步骤尝试:1、长按开机键关机。2、轻按开机键开机。3、若是步骤2无效,拔掉电源线,以及所......
  • ASEMI肖特基二极管MBR10100FCT图片,MBR10100FCT大小
    编辑-ZASEMI肖特基二极管MBR10100FCT参数:型号:MBR10100FCT最大重复峰值反向电压(VRRM):100V最大RMS电桥输入电压(VRMS):70V最大直流阻断电压(VDC):100V最大平均正向整流输出电......
  • 磁盘加密
    题目要求:创建一块新的磁盘,对该卷进行磁盘加密,解锁密码为“CSK2022!”映射到/dev/mapper/crypt分区上;格式化成ext4分区;挂载到/mut/crypt目录;配置开机自动挂载;题目实施......
  • LeetCode HOT 100:旋转图像
    题目:48.旋转图像题目描述:给你一个正方形矩阵数组,将其中的所有元素都顺时针旋转90度,得到旋转之后的矩阵数组。本题要求必须在原地修改,不能使用额外空间。思路:看到这个......
  • linux扩容磁盘
    某天腾讯云的某台机器不能访问了,后面发现是磁盘满了写不了日志了,马上进行扩容。在扩容之后,发现磁盘空间还是没变。使用fdisk-l  发现磁盘空间有了,但是没有分......
  • es磁盘使用为啥这么不均匀
    解决方案如下过下面的命令查到集群reblance属性是noneGET_cluster/settings使用下面的命令恢复平衡PUT_cluster/settings{"persistent":{"cluster.routing.rebalanc......
  • LeetCode HOT 100:全排列
    题目:46.全排列题目描述:给你一个没有重复元素的数组,返回其所有可能的全排列。全排列是什么呢?举个简单的例子,数组[1,2,3],其中一个排列为[2,1,3],该数组所有的全排列为[......