一、问题来源

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

二、出现的问题

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

三、排查过程

一点多了,既然已经把告警解决了,保留现场具体为什么明天再看吧,皮肤要紧,虽然睡得再多皮肤还是不太好。睡觉不是个好东西,睡完起来所有的梦想都忘了........,屁颠屁颠跑到公司,吃了个早餐,蒽~~~~,open BaiDu,open Google,Input Why ....,然而一上午过去了,咔咔咔,吃中餐,10点吃早餐,12点吃中餐~~~,吃饭过程中带着点罪恶感,肚肚上的肉肉。睡完午觉起来,继续.....,终于有一点点头绪了,在某个文章里看到了Sparse file这个词,然后使用du查看的时候果然...
 
[root@ip---- data]# du -h --apparent-size test.dat
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、创建命令
dd of=sparse-file bs=7M seek= count=   # 相当于创建一个7G的空文件,不占磁盘上的存储数据

或者

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

4、测试

当我在/run目录下创建一个7G的sparse file时,磁盘的存储空间是否改变,是否占用了磁盘存储空间?
# 可以看到/run目录下是7.7G
[root@master run]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 200G .0G 195G % /
devtmpfs .7G .7G % /dev
tmpfs .7G .7G % /dev/shm
tmpfs .7G 428K .7G % /run
tmpfs .7G .7G % /sys/fs/cgroup
tmpfs .6G .6G % /run/user/ # 创建一个7G的sparse file
[root@master run]# truncate -s 7G lile [root@master run]# ls -lh lile
-rw-r--r-- root root .0G Sep : lile # lile这个文件只是一个空的文件,不占存储空间
[root@master run]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 200G .0G 195G % /
devtmpfs .7G .7G % /dev
tmpfs .7G .7G % /dev/shm
tmpfs .7G 428K .7G % /run
tmpfs .7G .7G % /sys/fs/cgroup
tmpfs .6G .6G % /run/user/ # 使用dd创建一个大小为7G的普通文件
[root@master run]# dd if=/dev/zero of=output bs=1G count=
+ records in
+ records out
bytes (7.5 GB) copied, 3.5524 s, 2.1 GB/s # 可以看到是成功的,这就说明sparse文件预分配的大小不影响磁盘存储空间,不影响其他文件使用存储空间
[root@master run]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p2 200G .0G 195G % /
devtmpfs .7G .7G % /dev
tmpfs .7G .7G % /dev/shm
tmpfs .7G .1G 704M % /run
tmpfs .7G .7G % /sys/fs/cgroup
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. Spring Cloud版本

    Spring Cloud版本 Spring Cloud版本演进情况如下: 版本名称 版本 Finchley snapshot版 Edgware snapshot版 Dalston SR1 当前最新稳定 ...

  2. DNS解析综合学习案例

    DNS解析综合学习案例 #图右侧为做题前环境配置 #命令为红色 #命令加载内容为绿色 #vi编辑内容为蓝色 1.用户需把/dev/myvg/mylv逻辑卷以支持磁盘配额的方式挂载到网页目录下 [roo ...

  3. 一文搞懂Python可迭代、迭代器和生成器的概念

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  4. csdn论坛页抓取

    抓取csdn论坛 实现功能 获取论坛分类所有链接,并拼接成推荐精华页的完成的链接 获取推荐精华页的帖子状态,赏分,帖子标题,作者,发布时间,回复量,查看量,最后发表时间 置顶内容不爬取,只打印置顶内容 ...

  5. vue路由传参的三种方式以及解决vue路由传参页面刷新参数丢失问题

    最近项目中涉及到跨页面传参数和后台进行数据交互,看到需求之后第一反应就是用路由传参来解决:Vue中给我们提供了三种路由传参方式,下面我们一个一个的来看一下: 方法一:params传参: this.$r ...

  6. Python程序包的构建和发布过程

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  7. 在linux系统中配置NVMe over TCP

    1. 准备环境 1.1 准备linux系统 要求的linux系统可以是运行在物理机上,也可以是虚拟机上: 建议有个linux系统,一个做host,一个做target,如果资源紧张也可以把host和ta ...

  8. 简单架构:反射实现抽象工厂+IDAL接口完全独立DAL

    一.普通架构中存在的问题 StudentDB数据库,包含一张StudentInfoTB表,结构如下: s_id int primary key identity(1,1), s_name Nvarch ...

  9. textRNN & textCNN的网络结构与代码实现!

    1. 什么是textRNN textRNN指的是利用RNN循环神经网络解决文本分类问题,文本分类是自然语言处理的一个基本任务,试图推断出给定文本(句子.文档等)的标签或标签集合. 文本分类的应用非常广 ...

  10. 利用ShardingSphere-JDBC实现分库分表--配置中心的实现

    在之前的文章中我详细描述了如何利用ShardingSphere-JDBC进行分库分表,同时也实现了简单的精确分库算法接口,详情见下面的链接: 利用ShardingSphere-JDBC实现分库分表 但 ...