磁盤告警之---神奇的魔法(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系統書,是時候搬出來了
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM