最近遇到一个服务器问题:磁盘已满,而且使用率为100%~这个问题太常见了,我们先看看哪些文件占用磁盘比较多。1.查看磁盘使用率100%1.1查看磁盘使用情况概况第一个命令是df-h,查看磁盘使用情况。df是diskfree的缩写,用于显示Linux系统上文件系统磁盘当前的使用情况统计。如下图,可以看到磁盘使用率为100%。第一列Filesystem表示文件系统的名称。第二列大小表示文件系统的大小。第三列Used表示已经占用了多少磁盘空间。第四列Avail表示可用磁盘空间的大小。第五列Use%表示磁盘被使用了多少,100%表示磁盘已满。第六列MountedOn表示挂载的目录。从上面的结果我们可以看到有一个文件系统的占用率是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-n100-json.log#也可以通过dockerlogsdockerlogs--tail=100159查看日志,发现都是Logstash解析日志时打印的信息。如下图所示:每次Filebeat收集日志并传输给Logstash时,Logstash都会打印出解析后的日志。而我们的后端服务会打印很多日志,越来越多的日志会传输到Logstash,而ogstash会疯狂的写自己的解析日志。随着时间的推移,磁盘将被填满。问题原因找到了,如何解决?二、容器日志清理解决方案方案一:手动清理日志文件,可以解决燃眉之急,治标不治本。方案二:脚本定期清理日志文件。缺点是日志文件全部丢失,无法追溯。解决方案三:限制所有容器的日志文件大小,解决根本原因。缺点是需要重新创建容器并启动docker镜像。2.1方案一:手动清理方案cat/dev/null>/var/lib/docker/containers/containerid/containerid-json.log注意:这里没有使用rm方式删除文件。使用rm-rf删除日志后,会发现通过df-h并没有释放磁盘空间。原因是在Linux或Unix系统中,通过rm-rf或文件管理器删除文件会从文件系统的目录结构中取消链接(unlink)。如果文件是打开的(正在被一个进程使用),该进程仍然可以读取该文件,并且磁盘空间将始终被使用。正确的姿势是cat/dev/null>*-json.log,当然你也可以通过rm-rf删除后重启docker。2.2方案二:定期清理脚本提供清理脚本;#!/bin/shecho"========开始清理docker容器日志========"logs=$(find/var/lib/docker/containers/-name*-json.log)用于登录$logsdoecho"cleanlogs:$log"cat/dev/null>$logdoneecho"========endcleandockercontainerslogs========"Add脚本权限;chmod+xclean_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,表示容器有3条日志,第2条后写入第一个满500M,第二个满500M就写第三个。如果第三个已满,则清除第一个日志文件并重写第一个日志文件。如下图所示:写入了3个日志文件,最大不超过500M。修改后需要重启dockerdaemon进程。systemctldaemon-reloadsystemctlrestartdocker另外这个方法只对新创建的容器有效,之前的容器不起作用,所以我把之前的Logstash容器删掉,然后重启一个Logstash容器。参考资料:https://www.cnblogs.com/gcgc/p/10521005.htmlLinuxdf命令https://www.runoob.com/linux/linux-comm-df.htmlLinuxdu命令https://www.runoob。com/linux/linux-comm-du.html