发现问题
- 如果是数据库,在客户端操作(比如navicat)数据库的时候,会弹窗报错No space left on device,java应用也会在日志里报这个错;
- 如果是spring-boot spring-cloud,eureka状态会显示DOWN;
- 其他应用程序应该也会出现不同的down,比如连不上、响应速度非常慢等等。
问题验证直接使用df命令查看磁盘占用情况:df -h #output>>>>>>>>>>>>>>>> Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_192-lv_root 50G 44G 3.4G 100% / #output>>>>>>>>>>>>>>>>
发现是真的,解决办法有两种:
- 扩容,可以参考这里:Linux 磁盘扩容
- 查找大文件,确认是什么原因导致磁盘被占满,要么更改一些策略,比如kafka日志清理策略、CDH集群健康日志清理策略等,要么删除大文件。
这里记录查找并删除大文件。查找大文件使用du和df命令定位大文件:# 先确定是哪个文件夹占用较多# 如果文件较多命令执行可能很慢,在知道大概位置的情况下不建议直接对根目录操作# du的–max-depth=1表示只展示第一个层级的目录和文件# sort的-h选项和du的-h选项一个意思,-r表示倒叙,默认升序 du -h / –max-depth=1 | sort -hr | head -n 10 #output>>>>>>>>>>>>>>>>>>>>>>>>>> 50G / 28G /var 6.0G /dfs 4.0G /opt 3.0G /root 2.3G /usr 148M /lib 39M /log 30M /etc 29M /boot #output>>>>>>>>>>>>>>>>>>>>>>>>>># 定位到/var目录占用超过50%(磁盘总量50G)# 继续往下层目录找 du -h /var –max-depth=1 | sort -hr | head -n 10 #output>>>>>>>>>>>>>>>>>>>>>>>>>> 28G /var 24G /var/lib 3.8G /var/log 371M /var/cache … #output>>>>>>>>>>>>>>>>>>>>>>>>>># 继续/var/lib du -h /var/lib –max-depth=1 | sort -hr | head -n 10 #output>>>>>>>>>>>>>>>>>>>>>>>>>> 24G /var/lib 10G /var/lib/mongo 8.4G /var/lib/cloudera-service-monitor 4.5G /var/lib/cloudera-host-monitor 319M /var/lib/mysql … #output>>>>>>>>>>>>>>>>>>>>>>>>>># 最后发现是mongo 数据量太多以及cdh集群健康数据太多# 可以设置mongo journal使用smallfile,否则文件到达1G并且文件所记载的写操作都被使用过了才会删除# cdh日志默认在文件达到10G的时候才会回滚,这里也可以做文章
删除大文件假设找到了对应的文件夹或文件并且可以删除,可以直接使用rm删除,也可以按照时间删除,比如一些日志文件,需要删除靠前的日志,较新的日志暂时还不能删除。按文件大小删除比如需要删除超过500M的文件,而不是删除整个文件夹:# 建一个临时文件夹做测试 cd /tmp mkdir test cd test # 建几个大文件试试# seek表示跳过文件中指定大小的部分,实际上并没有写入任何数据# 生成1000G的文件 dd if=/dev/zero of=test-big1 bs=1G count=0 seek=1000 # 生成1000M的文件 dd if=/dev/zero of=test-big2 bs=1M count=0 seek=1000 #查找 -size参数值中+表示> -表示< 不写表示等于 find /tmp/test -type f -size +200M #output>>>>>>>>>>>>>>> /tmp/test/test-big2 /tmp/test/test-big1 #output>>>>>>>>>>>>>>> find /tmp/test -type f -size +2000M #output>>>>>>>>>>>>>>> /tmp/test/test-big1 #output>>>>>>>>>>>>>>> find /tmp/test -type f -size -2000M #output>>>>>>>>>>>>>>> /tmp/test/test-big2 #output>>>>>>>>>>>>>>># 删除# {} \;不能丢 find /tmp/test -type f -size +2000M -exec rm -rf {} \; ls #output>>>>>>>>>>>>>>> test-big2 #output>>>>>>>>>>>>>>>
按时间和名称删除# 删除修改时间距今超过10天的以.gz结尾的文件# -mtime参数值中 0表示修改时间在24小时内 +x表示修改时间距今超过x天 -x表示距今少于x天 不写正负号表示等于 find tmp/test/* -mtime +10 -name “*.gz” -exec rm -rf {} \;