linux如何排查磁盤的占用情況以及如何排查到底是哪個目錄或文件占用了大部分的磁盤空間

相信有些小伙伴有過軟件壓力測試的經歷。我們做壓力測試時為了追求性能極致,會要求得將服務器的某個或某些性能指標跑滿:
比如網卡跑滿了,那么網卡就是軟件的性能瓶頸,要想性能更好,得提帶寬;
linux如何監控網卡流量,我這里給出一個常用的命令:
sar -n DEV x,這個命令是動態監控網卡的流量情況,其中x表示每隔多久打印一次各網卡的流量信息,如sar -n DEV 2。

如果cpu跑滿了,那么cpu就是制約軟件性能得瓶頸,我們得看是不是cpu核數太少了,還是服務器上跑的應用太多了,占用了cpu資源,結合實際情況如資金情況、擴容成本等來考慮要不要擴容;
看cpu指標,我們一般用top命令查看,我們重點關注cpu信息的話,可以在執行top命令后,再執行shift+c,表示對cpu指標列按占用情況進行降序。

如果是磁盤跑滿了,那么磁盤就是制約性能的因素。
現在我想重點寫下磁盤資源的占用情況怎么看,如果知道了某個文件系統的磁盤占用率過高,那么我們又該怎么確定該文件系統下到底是哪個目錄或者文件占用了主要的磁盤空間。

首先我們查看下linux文件系統磁盤的占用情況,查看文件系統磁盤的占用情況我們常用df命令,那我們先來看看df命令該怎么用、我使用的一些常用參數是什么以及這些參數的含義


df命令參數

它的用法是:df [可選參數] [文件]
-B Byte,用于指定block-size的值,計算結果為該文件系統的總占用空間/block-size,顯示得是占用得磁盤塊數,如1024B等于1k,那么計算的塊大小就是1k,總占用空間/1k得到總的磁盤占用塊數,這是磁盤占用情況的反映形式之一。


-B參數的作用

-a 表示把虛擬文件系統的磁盤占用情況也顯示出來。
-h 表示以人們通俗易懂的方式顯示,如以k/M/g為單位進行顯示,而不是以Byte為單位。

-H 表示做換算時不是以1024來進行換算而是近似地以1000進行換算。
-i 列出文件系統的inode使用率。
注:Inodes表示文件系統的inode數量;IUsed表示已使用的inode數量;IFree表示空閑的inode數量;IUse%表示inode的使用率。


查看文件系統的inode使用率

-k 表示默認指定block-szie的值為1k。
-l 表示只顯示本地文件系統的磁盤占用信息。

如df -hl,以高可讀性的方式顯示本次文件系統磁盤占用情況;


顯示本地文件系統的磁盤占用情況

從上圖中我們可以看到,/dev/sda2這個磁盤分區的占用情況比較大,達到43%了,那到底是什么占用了43%的空間呢?這個能知道嗎?要怎么查看?

答案是可以的。


我們可以看到/dev/sda2這個磁盤分區的掛載點(Mounted on)是根目錄/,那么我們就切換到根目錄,查看下根目錄下占用磁盤空間最大的那幾個目錄(或文件)是什么,然后再針對找出的那幾個目錄進行進一步的分析,以最終確定占用了大量磁盤資源的文件。

那我們如何查看linux目錄占用的磁盤空間大小呢?又怎么找出占用最多的那幾個目錄呢?

1、linux查看目錄占用磁盤空間的大小一般使用du命令,它的用法為:du [可選參數] [文件]
我使用du命令常用的幾個參數有:
-h 表示以人們通俗易懂的方式顯示,如以k/M/g為單位進行顯示,而不是以Byte為單位。
-s 表示只顯示該目錄占用磁盤空間的總大小。
--max-depth=x 表示顯示目錄的最大深度,其中x表示最大深度。
-m 以M為單位進行顯示。
-k 以k為單位進行顯示。
注意:沒有-g參數,即沒有以g為單位顯示的參數。

如:du -h --max-depth=1 ./
表示顯示當前目錄的占用磁盤空間的大小以及它的下一級子目錄占用的磁盤空間的大小,因為--max-depth的值為,所以當前目錄向下的最大深度為1。

銜接上面說的那個問題,我們知道了該怎么查看目錄占用的磁盤空間后,現在要做的就是找出占用磁盤空間最大的那幾個目錄:
du -h -m --max-depth=1 ./ | sort -nr


查找占用當前目錄下占用磁盤空間最大的那幾個目錄

解析以下這個命令:
使用du查看目錄占用磁盤空間的大小,-h表示以人們易讀的方式顯示,-m表示以M為單位顯示,--max-depth=1表示除了顯示當前目錄占用磁盤空間的大小之外,還顯示當前目錄所有的下一級目錄的磁盤占用情況,sort -nr表示對第一列的數值(即磁盤空間占用情況)進行降序排序,-n表示進行數值比較,-r表示進行降序排序,因為有排序比較,所以前面我使用了-m來統一單位。
我們找到的占用磁盤空間最大的前幾個目錄是jmeter、test123以及software,其中jmeter的空間占用遠遠大于test123和software,所以說明占據大頭的就是jmeter了,所以我們就需要接著分析jmeter目錄下又是什么占據了主要空間的,到這里是不是有了一個較完整的思路了,我們就是這樣一層一層地抽絲剝繭,直到最終定位到占據主要磁盤空間的源頭數據在哪。

我們依然是用剛才的方法了,先切換到jmeter目錄,然后執行:
du -h -m --max-depth=2 ./ | sort -nr
這里我設置了最大顯示深度為2了,這個看自己的實際情況來定,如果目錄樹不是很深、目錄數不是很多的話,可以設置大點。


繼續查找jmeter目錄下占據最多磁盤空間的目錄

這里我們可以看到占用最多的是./apache-jmeter-5.2.1/bin目錄,占了46G,整個jmeter目錄才占用了47G左右。
那我們就按剛才的思路,繼續追蹤下去,切花到./apache-jmeter-5.2.1/bin,執行:
du -h -m --max-depth=2 ./ | sort -nr
這樣一步步地最終就可以找到到底是哪個文件占用最多磁盤空間的了。


但是我這里有個現象挺有意思的,剛剛我們查找了./apache-jmeter-5.2.1/bin目錄占用磁盤空間最多,但是如下圖所示,你可以發現,bin目錄的磁盤占用大小為46G,而其各子目錄之和才16M,這也相差太多了吧,這幾十G的占用情況到哪去了?被誰偷了?


bin目錄下磁盤占用大小與其子目錄的占用大小相距甚遠

請教有經驗的同事后我才明白:
linux文件系統中,當一個文件(linux萬物皆文件)沒有被任何進程打開(讀寫),那么當使用rm操作刪除文件時,該文件將直接被徹底刪除;
但是如果在執行rm操作刪除某個文件時,該文件正在被某些進程打開了,那么該rm操作其實并不是徹底刪除了文件,此時該文件處于標記刪除狀態(通過deleted進行標記),linux只是刪除了刪除了指向文件inode的鏈接,但是實際上數據并沒有被真正刪除,具體表現為:你查找不到該文件節點,但是該文件依然占用著原先的磁盤資源。
雖然文件并沒有真正被刪除,但是由于該文件鏈接不存在了,所以du工具在統計時就跳過了該文件的磁盤占用統計,所以就出現了上圖所示的46G與16M的巨大差異。

有人可能有疑問了,那這個占用的磁盤資源是不是永遠釋放不了了?不會的,我們上面不是說過嗎?該文件被某個或某些進程占用著,我們找到這些占用該文件的進程,將它們kill掉后,文件就會被真正刪除了。

那我們如何查找一個文件被哪些進程占用著呢?我們使用lsof命令來查看,lsof(list open files)命令的作用是列出被打開的文件,即列出那些正被進程讀寫的文件的信息


lsof命令列舉的每列的含義解析

COMMAND 進程名
PID 進程id
USER 哪個用戶下啟動的進程
FD 文件描述符
TYPE 文件類型
NODE 文件在文件系統目錄樹的節點編號
NAME 被打開的文件的名稱


如果一個被進程占用著的文件被刪除了,那么lsof得到的記錄中末尾處會被打上標記(deleted),表示該文件只是被標記刪除了,但未尚未真正刪除,如下圖:


被進程占用著的文件被刪除后會被打上deleted標簽

可以在root執行如下命令來找到我們想要查找的標記刪除文件:
lsof | grep deleted | grep "apache-jmeter-5.2.1/bin"
找到是哪些進程打開的文件后,如果我們想要立即釋放磁盤資源,那么我們可以將找到的各個進程kill掉,通過kill pid殺掉進程,然后文件就會被真正刪除了,之前占用的磁盤資源就會被釋放了。


換個角度想一下,如果我們不是想要釋放磁盤資源,而是我們誤刪了某個重要文件,此時是不是會來一句臥槽,怎么辦?這么重要的數據被誤刪了?
此時上面的問題是不是也可能會成為一種解決問題的思路:
1、我們可以先在root下執行lsof | grep deleted | grep filename
看能不能找到這個被誤刪了但卻處于標記刪除階段的文件,如果可以找到的話,那我們還是有機會恢復的;
恢復方法,請參考:https://segmentfault.com/a/1190000000461077

2、如果沒有的話,我暫時也沒轍了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,327評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,996評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,316評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,406評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,128評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,524評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,576評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,759評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,310評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,065評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,249評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,821評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,479評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,909評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,140評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,984評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,228評論 2 375