热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一次磁盘占用率100%的排查经历!

最近遇到一个服务器的问题:磁盘满了,占用率100%~这个问题太常见了,于是先来排查一波是哪些文件占用了大量磁盘。一、排查磁盘占用率100%1.1查看磁盘使用的大致情况第一个命令就是

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

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


一、排查磁盘占用率 100%


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

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

如下图所示,可以看到磁盘占用率 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。


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

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

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

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

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

 

 

每次 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 就写第三个,如果第三个满了,就清空第一个日志文件,重新写第一个日志文件。如下图所示:

 

 

写了 3 个日志文件,最大不超过 500M

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

systemctl daemon-reload
systemctl restart docker

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

参考资料:

https://www.cnblogs.com/gcgc/p/10521005.html

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

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



推荐阅读
  • 本文介绍了如何查看PHP网站及其源码的方法,包括环境搭建、本地测试、源码查看和在线查找等步骤。 ... [详细]
  • 本文为初学者提供了一条清晰的学习路线,帮助他们逐步成长为优秀的Web开发人员。通过十个关键步骤,涵盖从基础到高级的各个方面,确保每位学习者都能找到适合自己的学习方向。 ... [详细]
  • C语言是计算机科学和编程领域的基石,许多初学者在学习过程中会感到困惑。本文将详细介绍C语言的基本概念、关键语法和实用示例,帮助你快速上手C语言。 ... [详细]
  • 从零开始编译Linux系统:第16章 全新起点
    本章将详细介绍如何从零开始编译一套完整的Linux系统,涵盖关键组件如glibc库的介绍及其重要性。通过本文,读者将了解从源代码构建Linux系统的全过程。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 如何配置VisualSVN以确保提交时必须填写日志信息
    在软件开发团队中,成员们有时会忘记在提交代码时添加必要的备注信息。为了规范这一流程,可以通过配置VisualSVN来强制要求团队成员在提交文件时填写日志信息。本文将详细介绍如何设置这一功能。 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • 微服务优雅上下线的最佳实践
    本文介绍了微服务上下线的正确姿势,避免使用 kill -9 等粗暴手段,确保服务的稳定性和可靠性。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文详细介绍了如何在PHP中记录和管理行为日志,包括ThinkPHP框架中的日志记录方法、日志的用途、实现原理以及相关配置。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • Bootstrap 插件使用指南
    本文详细介绍了如何在 Web 前端开发中使用 Bootstrap 插件,包括自动触发插件的方法、插件的引用方式以及具体的实例。 ... [详细]
  • Python 3 Scrapy 框架执行流程详解
    本文详细介绍了如何在 Python 3 环境下安装和使用 Scrapy 框架,包括常用命令和执行流程。Scrapy 是一个强大的 Web 抓取框架,适用于数据挖掘、监控和自动化测试等多种场景。 ... [详细]
author-avatar
hro5028136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有