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