一、问题来源

半夜钉钉接到告警,某台机器的磁盘使用率少于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入门(九):运行时值注入

    Spring提供了2种方式在运行时注入值: 属性占位符(Property placeholder) Spring表达式语言(SpEL) 1. 属性占位符 1.1 注入外部的值 1.1.1 使用Envi ...

  2. c#自定义控件中的事件处理

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...

  3. Netbeans courier new 乱码问题

    Netbeans 默认的字体 monospaced,显示英文的单引号及字体非常的不好看,在网上查了下资料可以变得很好看. 1.仍然保持默认字体 monospaced 2.在Netbeans 的安装目  ...

  4. Kendo-Grid for Vue API and Template

    写此博客的原因:在做项目时前端用的vue,后端用的jfinal.在前端veu中调用了kendo grid插件,但是在官方文档中对kendo grid for vue 的api和template都不太详 ...

  5. 【redis】redis基础命令学习集合

    写在前面 Redis是一个高速的内存数据库,它的应用十分广泛,可以说是服务端必学必精的东西.然而,学以致用,无用则无为.学了的东西必须反复的去用,去实践,方能有真知.这篇文章记录了我在redis学习过 ...

  6. docker学习1:docker前世今生

    Docker简介 Docker是2013发起的一个项目,早在2013年,Docker自诞生起,就是整个技术界的明星项目,当时我还在上海实习,就在各种技术媒体上看到了Docker的介绍文章,很多技术媒体 ...

  7. .net core 实现 api网关 进行 api版本控制

    场景: 由一次大的项目改动引起的app端api不兼容问题,这时候就需要对api做版本控制了,权衡之后因为用户不多,选择了强更,没人想在已经写了8000行代码的单个svc文件中维护好几个版本的接口或者继 ...

  8. 启xin宝app的token算法破解——逆向篇(二)

    启xin宝app的token算法破解--抓包分析篇(一)文章已经对该app进行了抓包分析,现在继续对它进行逆向. 对于一个app而言,我们要逆向app,需要知道什么呢? 逆向工具 Java基础,甚至c ...

  9. python 17 内置模块

    目录 1. 序列化模块 1.1 json 模块 1.2 pickle 模块 2. os 模块 3. sys 模块 4. hashlib 加密.摘要 4.1 加密 4.2 加盐 4.3 文件一致性校验 ...

  10. switch语句(上)(转载)

    switch语句是C#中常用的跳转语句,可以根据一个参数的不同取值执行不同的代码.switch语句可以具备多个分支,也就是说,根据参数的N种取值,可以跳转到N个代码段去运行.这不同于if语句,一条单独 ...