磁盘占用100%怎么解决(磁盘100严重排查和解决方案)
最近遇到一个服务器问题:磁盘满了,占用率100%~
这个问题太普遍了,我们先来看看哪些文件占用了很多磁盘。
I .检查磁盘占用率是否为100%
1.1检查磁盘使用的总体情况。
第一个命令是df -h,用于检查磁盘使用情况。Df是disk free的缩写,用于显示Linux系统上文件系统磁盘的使用情况统计。
如下图所示,可以看到磁盘占用率为100%。
第一列Filesystem表示文件系统的名称。
第二列的大小表示文件系统的大小。
使用的第三列表示已经占用了多少磁盘空。
第四列Avail表示可用磁盘之间的大小空。
在第五列中,Use%表示磁盘使用了多少,100%表示磁盘已满。
第六列“安装在”表示它安装在哪个目录中。
从上面的结果可以看出,有一个文件系统的占用率为100%,挂载的目录是/,那么我们就来看看这个目录下存放了哪些大文件。
1.2查看目录中的大文件
使用du命令显示目录或文件占用的磁盘空的大小。
#先进入到根目录`/`cd/#列出当前目录或文件的总大小,并按倒叙排序du-sh/*|sort-nr找到最大的目录var,占用100 g以上,进入这个目录,再次执行du命令。
du-sh/var/*|sort-nr这样就可以找到空之间占用空间最大的文件。
最后发现Logstash容器的日志文件占用过多,截图如下。你可以看到,它占用了4.8G,这是我清理日志后的大小。之前这个集装箱占了90多克。
1.3为什么logstash容器会占用这么大的磁盘?
为什么Logstash容器中有这么多日志???
让我们来看看这个日志的内容。使用tail命令查看文件中的最后100行数据。
tail-n100-json.log#也可以通过dockerlogs来查看日志dockerlogs--tail=100159发现Logstash解析日志时,所有信息都打印出来了。如下图所示:
每次Filebeat收集日志并传输到Logstash时,Logstash都会打印一个解析后的日志。
而且我们的后端服务会打印很多日志,越来越多的日志会传输到Logstash。Logstash会疯狂的写自己的解析日志,久而久之磁盘就会被占用。
问题的原因已经找到了,那么解决方法是什么呢?
二、容器日志清理方案
注意:这里不使用rm删除文件。用rm -rf删除日志后,你会发现disk 空并不是通过df -h H释放的,原因是在Linux或者Unix系统中,通过rm -rf或者file manager删除文件会与文件系统的目录结构解除链接。如果文件是打开的(有一个进程在使用),那么这个进程仍然能够读取文件,并且磁盘空将一直被占用。正确的姿势是cat/dev/null >*-json.log,当然也可以通过rm -rf删除,重启docker。
2.2选项2:定期清理脚本。
提供一个清理脚本。
#!/bin/shecho"========startcleandockercontainerslogs========"logs=$(find/var/lib/docker/containers/-name*-json.log)forlogin$logsdoecho"cleanlogs:$log"cat/dev/null>$logdoneecho"========endcleandockercontainerslogs========"向脚本添加权限
chmod+xclean_docker_log.sh执行脚本的命令
./clean_docker_log.sh可以将执行脚本的命令添加到Linux的调度任务中,这里不展开。
我要说的是我目前使用的方案。
2.3选项3:限制Docker容器日志大小。
创建/etc /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时,写入第三个日志。如果第三个日志已满,清除空第一个日志文件并重写第一个日志文件。如下图所示:
已经写入了三个日志文件,最大大小为500M。
更改之后,您需要重新启动docker守护进程。
systemctldaemon-reloadsystemctlrestartdocker另外,这个方法只对新创建的容器有效,之前的容器无效,所以我删除了之前的Logstash容器,重新启动了一个Logstash容器。
发表评论