一、问题来源

半夜钉钉接到告警,某台机器的磁盘使用率少于20%,于是迷糊中爬起来,咔咔咔 find / -size +1G,咔咔咔,把几个只有4-5G的日志文件echo空值了一下,然后吓蒙了,刚刚使用的还有160G,怎么把两个日志文件一清空,就只使用了25G了,是不是刚刚没清醒把数据文件删了,但是仔细仔细的看了看执行的命令,没有啊...,我在梦游吗?
 
 
 
 
 
 

二、出现的问题

然后就发现了另外一个神奇的现象了,是有魔法吗?在这个/data目录下的一个文件查看有60G,但是为什么使用df -h查看的时候Used才25G,为什么文件使用的大小还大于Used...... ,原本以为是句柄数没释放,但是我前面使用的是echo,而不是rm;使用lsof |grep deleted 也没有看到没有释放的句柄。后面才发现ls -lh查看与du查看到的大小不一样......
 
  1. [root@ip-XXXXXXXX data]# ls -lh test.dat
  2. -rw------- root root 60G Sep : test.dat
  1. [root@ip-XXXXXXXX data]# du -sh test.dat
  2. .4G test.dat

三、排查过程

一点多了,既然已经把告警解决了,保留现场具体为什么明天再看吧,皮肤要紧,虽然睡得再多皮肤还是不太好。睡觉不是个好东西,睡完起来所有的梦想都忘了........,屁颠屁颠跑到公司,吃了个早餐,蒽~~~~,open BaiDu,open Google,Input Why ....,然而一上午过去了,咔咔咔,吃中餐,10点吃早餐,12点吃中餐~~~,吃饭过程中带着点罪恶感,肚肚上的肉肉。睡完午觉起来,继续.....,终于有一点点头绪了,在某个文章里看到了Sparse file这个词,然后使用du查看的时候果然...
 
  1. [root@ip---- data]# du -h --apparent-size test.dat
  2. 60G test.dat

四、Sparse file

既然找到问题了,就得好好看看这是个啥东西,看了之后第一反应就是这个文件预分配了60G,但实际上只使用了4.4G...,蒽~~,就这么个意思......

1、定义

什么是Sparse files?Sparse files是一个分配了大小但实际上没有填充的文件,如上面的案例中,分配了60G,实际上只用了4.4G。可以看一下下面这两张图
 

2、其他使用场景

Mysql、Oracle、虚拟机等
 
虚拟机:在我们平时在自己电脑上创建虚拟机时,需要指定磁盘容量大小,这里的最大磁盘大小就是Sparse file,指定一个最大使用容量就可以了(一般为20G)。指定后,如果虚拟机只使用了1G,那么使用物理磁盘也是1G,而不是20G都使用了;并不是我原先的以为分配了20G给虚拟机,这20G物理磁盘就只能虚拟机用,并不是的。
 
 
 
3、创建命令
  1. dd of=sparse-file bs=7M seek= count= # 相当于创建一个7G的空文件,不占磁盘上的存储数据

或者

  1. truncate -s 7G lile # 相当于创建一个7G的空文件,不占磁盘上的存储数据

4、测试

当我在/run目录下创建一个7G的sparse file时,磁盘的存储空间是否改变,是否占用了磁盘存储空间?
  1. # 可以看到/run目录下是7.7G
  2. [root@master run]# df -h
  3. Filesystem Size Used Avail Use% Mounted on
  4. /dev/nvme0n1p2 200G .0G 195G % /
  5. devtmpfs .7G .7G % /dev
  6. tmpfs .7G .7G % /dev/shm
  7. tmpfs .7G 428K .7G % /run
  8. tmpfs .7G .7G % /sys/fs/cgroup
  9. tmpfs .6G .6G % /run/user/
  10.  
  11. # 创建一个7G的sparse file
  12. [root@master run]# truncate -s 7G lile
  13.  
  14. [root@master run]# ls -lh lile
  15. -rw-r--r-- root root .0G Sep : lile
  16.  
  17. # lile这个文件只是一个空的文件,不占存储空间
  18. [root@master run]# df -h
  19. Filesystem Size Used Avail Use% Mounted on
  20. /dev/nvme0n1p2 200G .0G 195G % /
  21. devtmpfs .7G .7G % /dev
  22. tmpfs .7G .7G % /dev/shm
  23. tmpfs .7G 428K .7G % /run
  24. tmpfs .7G .7G % /sys/fs/cgroup
  25. tmpfs .6G .6G % /run/user/
  26.  
  27. # 使用dd创建一个大小为7G的普通文件
  28. [root@master run]# dd if=/dev/zero of=output bs=1G count=
  29. + records in
  30. + records out
  31. bytes (7.5 GB) copied, 3.5524 s, 2.1 GB/s
  32.  
  33. # 可以看到是成功的,这就说明sparse文件预分配的大小不影响磁盘存储空间,不影响其他文件使用存储空间
  34. [root@master run]# df -h
  35. Filesystem Size Used Avail Use% Mounted on
  36. /dev/nvme0n1p2 200G .0G 195G % /
  37. devtmpfs .7G .7G % /dev
  38. tmpfs .7G .7G % /dev/shm
  39. tmpfs .7G .1G 704M % /run
  40. tmpfs .7G .7G % /sys/fs/cgroup
  41. tmpfs .6G .6G % /run/user/

5、总结及注意

1)Sparse files并不占用磁盘存储空间

2)平时我们使用ls -lh查看文件大小、find / -size +1G 找出来的日志大小并不一定准确,尽量再一遍使用du -sh确认

3)ls命令和du命令在一定程度上可以这样表示

五、其他

1、本想看一下跟sparse file相关的unix系统方面的,但是感觉自己知识点不太足,有点难度....

 
2、遇到问题一定要深究,说来惭愧,做运维3年之久了,还是第一次听说sparse file...
 
3、自己买的那些Linux系统书,是时候搬出来了
 

磁盘告警之---神奇的魔法(Sparse file)的更多相关文章

  1. 第17章 内存映射文件(3)_稀疏文件(Sparse File)

    17.8 稀疏调拨的内存映射文件 17.8.1 稀疏文件简介 (1)稀疏文件(Sparse File):指的是文件中出现大量的0数据,这些数据对我们用处不大,但是却一样的占用空间.NTFS文件系统对此 ...

  2. SQL Server ->> Sparse File(稀疏文件)

    Sparse File(稀疏文件)不是SQL Server的特性.它属于Windows的NTFS文件系统的一个特性.如果某个大文件中的数据包含着大量“0数据”(这个应该从二进制上看),这样的文件就可以 ...

  3. Linux 磁盘告警分析

    硬件配置 cat /etc/redhat-release && dmidecode -s system-product-name && cat /proc/cpuinf ...

  4. 转 由一次磁盘告警引发的血案:du 和 ls 的区别

    如果你完全不明白或者完全明白图片含义, 那么你不用继续往下看了. 否则, 这篇文章也许正是你需要的. 背景 确切地说,不是收到的自动告警短信或者邮件告诉我某机器上的磁盘满了,而是某同学人肉发现该机器写 ...

  5. 用windows自带的fsutil来创建1G稀疏文件(sparse file)

    fsutils file createnew  a.dat 1073741824 fsutil sparse setflag a.dat fsutil sparse setrange a.dat 0  ...

  6. 基于【磁盘】操作的IO接口:File

    基本操作Api import org.apache.commons.lang3.time.DateFormatUtils; import java.io.*; import java.util.Dat ...

  7. 神奇的魔法数字0x61c88647

    来源JDK源码,产生的数字分布很均匀 用法代码如下. # -*- coding: utf-8 -*- HASH_INCREMENT = 0x61c88647 def magic_hash(n): fo ...

  8. KVM虚拟化技术(六)磁盘管理

    KVM支持的虚拟磁盘类型 raw 这并非是一种真正的磁盘格式,而是代表虚拟机所使用的原始镜像:它并不存储元数据,因此可以作为保证虚拟机兼容性的候选方案,然而也正因为 它不存储元数据,因此不能支持某些高 ...

  9. Python监控SQL Server数据库服务器磁盘使用情况

    本篇博客总结一下Python采集SQL Server数据库服务器的磁盘使用信息,其实这里也是根据需求不断推进演化的一个历程,我们监控服务器的磁盘走了大概这样一个历程: 1:使用SQL Server作业 ...

随机推荐

  1. python+unittest框架第二天unittest之简单认识Test Suite:测试套件

    今天了解下测试套件Test Suite,什么是测试套件,测试套件是由多个Test Case测试用例组成的,当然也可以由多个子测试套件组成. 接下来看下如果构建测试套件,构建测试套件的方法: 1.用un ...

  2. 在使用Lists.transform时,不会直接生成PurchaseOrderVo的集合对象,而是生成一个Function的集合

    但是在使用Lists.transform时,不会直接生成PurchaseOrderVo的集合对象,而是生成一个Function的集合,在循环的时候,会去调用apply 生成一个PurchaseOrde ...

  3. Zabbix遇到的问题集锦

    一.Web界面上显示Zabbix server is not running 二.Zabbix显示中文字体 三.利用Python发送告警注意细节 四.zabbix上发告警信息不发恢复信息 五.Agen ...

  4. Hive 系列(五)—— Hive 分区表和分桶表

    一.分区表 1.1 概念 Hive 中的表对应为 HDFS 上的指定目录,在查询数据时候,默认会对全表进行扫描,这样时间和性能的消耗都非常大. 分区为 HDFS 上表目录的子目录,数据按照分区存储在子 ...

  5. EOS源码分析:transaction的一生

    最近在处理智能合约的事务上链问题,发现其中仍旧有知识盲点.原有的认识是一个事务请求会从客户端设备打包签名,然后通过RPC传到非出块节点,广播给超级节点,校验打包到可逆区块,共识确认最后变为不可逆区块. ...

  6. 01 Python网络爬虫简介

    什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后去互联网上爬取/获取数据的过程. 爬虫的分类 - 通用爬虫:就是爬取互联网中的一整张页面内容. - 聚焦爬虫:根据指定的需求爬取页面中指定的局部内容 ...

  7. 程序员过关斩将--cookie和session的关系其实很简单

    月高风下,下班路上.... 菜菜哥,告诉你一个秘密,但是不允许告诉任何人 这么秘密,你有男票了?~ 不是,昨天我偷偷去面试了,结果挂了 这不是好事吗,上天让公司留住你..... 好吧,不过还是要请教你 ...

  8. ECMAScript---数据类型的分类

    数据值是一门编程语言生产的材料,JS中包含的值有以下类型: 1.基本数据类型(值类型):包含 数字 number.字符串string .布尔 boolean .null(其他语言都有的类型) .und ...

  9. unity_小功能实现(敌人追踪主角)

    1.敌人发现主角有两种形式: a.看见主角(主角出现在敌人的视野之内) b.听见主角(听见主角走路声或者是跑步声) a:看(see) 首先判断主角是否在敌人视野角度内,那么我们只需要判断B<0. ...

  10. Mac OS 下包管理器 homebrew的安装

    homebrew :熟悉mac os的小伙伴们一定都知道这个包管理工具,它非常方便且好用,安装它只需要打开终端并将以下代码粘贴到终端中运行即可: /usr/bin/ruby -e "$(cu ...