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

 

1、問題來源

半夜釘釘接到告警,某臺機器的磁盤使用率少於20%,因而迷糊中爬起來,咔咔咔 find / -size +1G,咔咔咔,把幾個只有4-5G的日誌文件echo空值了一下,而後嚇蒙了,剛剛使用的還有160G,怎麼把兩個日誌文件一清空,就只使用了25G了,是否是剛剛沒清醒把數據文件刪了,可是仔細仔細的看了看執行的命令,沒有啊...,我在夢遊嗎?
 
 
 
 
 
 

2、出現的問題

而後就發現了另一個神奇的現象了,是有魔法嗎?在這個/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

 

3、排查過程

一點多了,既然已經把告警解決了,保留現場具體爲何明天再看吧,皮膚要緊,雖然睡得再多皮膚仍是不太好。睡覺不是個好東西,睡完起來全部的夢想都忘了........,屁顛屁顛跑到公司,吃了個早餐,蒽~~~~,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

 

4、Sparse file

 既然找到問題了,就得好好看看這是個啥東西,看了以後第一反應就是這個文件預分配了60G,但實際上只使用了4.4G...,蒽~~,就這麼個意思......sql

一、定義app

什麼是Sparse files?Sparse files是一個分配了大小但實際上沒有填充的文件,如上面的案例中,分配了60G,實際上只用了4.4G。能夠看一下下面這兩張圖
 

二、其餘使用場景運維

Mysql、Oracle、虛擬機等
 
虛擬機:在咱們平時在本身電腦上建立虛擬機時,須要指定磁盤容量大小,這裏的最大磁盤大小就是Sparse file,指定一個最大使用容量就能夠了(通常爲20G)。指定後,若是虛擬機只使用了1G,那麼使用物理磁盤也是1G,而不是20G都使用了;並非我原先的覺得分配了20G給虛擬機,這20G物理磁盤就只能虛擬機用,並非的。
 
 
 
三、建立命令
dd of=sparse-file bs=7M seek=1120 count=0   # 至關於建立一個7G的空文件,不佔磁盤上的存儲數據

或者測試

truncate -s 7G lile   # 至關於建立一個7G的空文件,不佔磁盤上的存儲數據

 

四、測試spa

當我在/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

 

五、總結及注意3d

1)Sparse files並不佔用磁盤存儲空間unix

2)平時咱們使用ls -lh查看文件大小、find / -size +1G 找出來的日誌大小並不必定準確,儘可能再一遍使用du -sh確認日誌

3)ls命令和du命令在必定程度上能夠這樣表示code

 

5、其餘

一、本想看一下跟sparse file相關的unix系統方面的,可是感受本身知識點不太足,有點難度....
 
二、遇到問題必定要深究,說來慚愧,作運維3年之久了,仍是第一次據說sparse file...
 
三、本身買的那些Linux系統書,是時候搬出來了
相關文章
相關標籤/搜索