欢迎来到李先生的博客

深山的鹿,不知归处;万般皆苦,只可自渡。
扩大
缩小

磁盘告警之---神奇的魔法(Sparse file)

 

一、问题来源

半夜钉钉接到告警,某台机器的磁盘使用率少于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------- 1 root root 60G Sep 19 07:22 test.dat

 

[root@ip-XXXXXXXX data]# du -sh test.dat 
4.4G    test.dat

 

三、排查过程

一点多了,既然已经把告警解决了,保留现场具体为什么明天再看吧,皮肤要紧,虽然睡得再多皮肤还是不太好。睡觉不是个好东西,睡完起来所有的梦想都忘了........,屁颠屁颠跑到公司,吃了个早餐,蒽~~~~,open BaiDu,open Google,Input Why ....,然而一上午过去了,咔咔咔,吃中餐,10点吃早餐,12点吃中餐~~~,吃饭过程中带着点罪恶感,肚肚上的肉肉。睡完午觉起来,继续.....,终于有一点点头绪了,在某个文章里看到了Sparse file这个词,然后使用du查看的时候果然...
 
[root@ip-172-30-38-68 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=1120 count=0   # 相当于创建一个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  6.0G  195G   3% /
devtmpfs        7.7G     0  7.7G   0% /dev
tmpfs           7.7G     0  7.7G   0% /dev/shm
tmpfs           7.7G  428K  7.7G   1% /run
tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/1000

# 创建一个7G的sparse file
[root@master run]# truncate -s 7G lile

[root@master run]# ls -lh lile 
-rw-r--r-- 1 root root 7.0G Sep 19 08:46 lile

# lile这个文件只是一个空的文件,不占存储空间
[root@master run]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p2  200G  6.0G  195G   3% /
devtmpfs        7.7G     0  7.7G   0% /dev
tmpfs           7.7G     0  7.7G   0% /dev/shm
tmpfs           7.7G  428K  7.7G   1% /run
tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/1000

# 使用dd创建一个大小为7G的普通文件
[root@master run]# dd if=/dev/zero of=output bs=1G count=7
7+0 records in
7+0 records out
7516192768 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  6.0G  195G   3% /
devtmpfs        7.7G     0  7.7G   0% /dev
tmpfs           7.7G     0  7.7G   0% /dev/shm
tmpfs           7.7G  7.1G  704M  92% /run
tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
tmpfs           1.6G     0  1.6G   0% /run/user/1000

 

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系统书,是时候搬出来了
 

posted on 2019-09-19 17:56  Captain_Li  阅读(1928)  评论(3编辑  收藏  举报

导航