磁碟告警之—神奇的魔法(Sparse file)
- 2019 年 10 月 3 日
- 筆記
一、問題來源
半夜釘釘接到告警,某台機器的磁碟使用率少於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系統書,是時候搬出來了