linux磁碟異常占用

2021-09-20 17:59:13 字數 3561 閱讀 7238

某伺服器報警,/根目錄下磁碟超設定閾值。

1:檢視磁碟占用情況 

df -h 

可以看出根目錄已經占用了86%: 

從上述資訊可以看出根目錄的檔案系統對應的裝置是/dev/sda2。

注:disk free(df,檢查檔案系統磁碟使用情況) 

2:根目錄的掛載情況 

執行du -h -x --max-depth=1

檢視是哪個目錄占用的這麼多空間,這個命令中的-x引數會讓du命令不統計不在同乙個磁碟分割槽上目錄,或換句話說,忽略其他的磁碟掛載點。結果出乎意料,根本沒有沒有df中顯示的8g那麼多。 

du的英文原義為「disk usage」,含義為顯示磁碟空間的使用情況,統計目錄(或檔案)所佔磁碟空間的大小。該命令的功能是逐級進入指定目錄的每乙個子目錄並顯示該目錄占用檔案系統資料塊(1024位元組)的情況。 

du是以檔名、目錄名為依據計算空間使用的,而df是以硬碟塊使用情況來計算空間使用的。 

當乙個應用程式正在寫乙個大檔案的時候,比如rm或者mv了這個檔案,應用程式會占有控制代碼,並根據控制代碼所指磁碟位置直接寫磁碟,而不會檢查該檔案是否被刪除。

3:猜測:是否是因為有些程序使用已經被刪除的檔案? 

當程序開啟了某個檔案時,只要該程序保持開啟該檔案,即使將其刪除,它依然存在於磁碟中。這意味著,程序並不知道檔案已經被刪除,它仍然可以向開啟該檔案時提供給它的檔案描述符進行讀取和寫入。除了該程序之外,這個檔案是不可見的,因為已經刪除了其相應的目錄條目。 

為此採用lsof(「list open files」)命令檢查開啟的檔案,進而定位相應的程序。 

lsof的命令結果: 

command、pid 和 user 列分別表示程序的名稱、程序識別符號 (pid) 和所有者名稱。device、size/off、node 和 name 列涉及到檔案本身的資訊,分別表示指定磁碟的名稱、檔案的大小、索引節點(檔案在磁碟上的標識)和該檔案的確切名稱。 

lsof | grep '8,2' | grep 'deleted'

從執行結果發現有異常程序,其使用的檔案已經被刪除,但是該程序仍然持有該檔案。 

從下圖可以看出父程序11864和子程序共用201508——26746.txt這個檔案,但是該檔案已經在物理磁碟中被刪除。 

通過cd /proc/11864進入該程序的系統位置資訊: 

4:檢視父程序: 

由此可以確定該程序啟動的指令碼位置資訊,從而確定該程序的具體任務資訊。 

對該程序進行kill操作,再次檢視檔案系統的磁碟的使用情況: 

從上述可以知,根目錄的磁碟占用已經降到30%。從而確證是該程序所引起的根目錄磁碟占用問題。

5:總結 

乙個檔案建立,就新生成了乙個inode節點,且inode節點的引用計數為1。當檔案被乙個程序開啟,則在記憶體中緩衝建立此inode節點快取,且其引用計數加1。乙個檔案可以被多次開啟,建立多個檔案描述符,但對應的inode節點只有乙個,對應的磁碟儲存只有乙個,只是引用計數每開啟一次加1

當檔案被rm,在作業系統內部其實是呼叫了unlink操作,其目錄項被刪除(du統計時就會忽略),如果其對應的inode節點的引用計數為0,則刪除對應的inode節點和清除inode節點點陣圖中對應的位,其對應磁碟可被再申請;但如果此檔案被其他程序開啟,則其對應的inode節點的引用計數不為0,則不會刪除對應的inode節點和清除inode節點點陣圖中對應的位,其對應磁碟不能被再申請,也就是在lsof下可以看到deleted控制代碼;當前檔案被所有使用程序close後,系統刪除對應的inode節點和清除inode節點點陣圖中對應的位,其對應磁碟可被再申請。

乙個被程序開啟的檔案被rm後,其目錄項被刪除了,在du命令下是不能被統計到,而其inode沒有被刪除,在df命令下是可以被統計到的,這就是在du和df存在較大差別的原因。

/proc 是乙個目錄,其中包含了反映核心和程序樹的各種檔案。這些檔案和目錄並不存在於磁碟中,因此當您對這些檔案進行讀取和寫入時,實際上是在從作業系統本身獲取相關資訊。大多數與 lsof 相關的資訊都儲存於以程序的 pid 命名的目錄中,所以 /proc/1234 中包含的是 pid 為 1234 的程序的資訊。 

在 /proc 目錄的每個程序目錄中存在著各種檔案,它們可以使得應用程式簡單地了解程序的記憶體空間、檔案描述符列表、指向磁碟上的檔案的符號鏈結和其他系統資訊。lsof 實用程式使用該資訊和其他關於核心內部狀態的資訊來產生其輸出。所以如果乙個程序使用的檔案被刪除了, 

通過在該程序的目錄中進行查詢,此時可以訪問程序的檔案描述符。 

向 lsof 傳遞檔名時,比如在 lsof /file/i/deleted 中,它首先使用 stat() 系統呼叫獲得有關該檔案的資訊,不幸的是,這個檔案已經被刪除。在不同的作業系統中,lsof 可能可以從核心記憶體中捕獲該檔案的名稱。

# lsof | grep error_log

輸出結果:

httpd      2452     root    2w      reg       33,2      499    3090660                         /var/log/httpd/error_log (deleted) httpd      2452     root    7w      reg       33,2      499    3090660                         /var/log/httpd/error_log (deleted)     ... more httpd processes ...123456
在這個示例中,可以看到 pid 2452 開啟檔案的檔案描述符為 2(標準錯誤)和 7。因此,可以在 /proc/2452/fd/7 中檢視相應的資訊,即可查詢刪除的檔案:

cat /proc/2452/fd/7 [sun apr 30 04:02:48 2006] [notice] digest: generating secret for digest authentication [sun apr 30 04:02:48 2006] [notice] digest: done [sun apr 30 04:02:48 2006] [notice] ldap: built with openldap ldap sdk12345

Linux磁碟被占用找不到占用檔案,磁碟空間沒釋放

新公司的測試機磁碟空間空餘很小,日誌很多,也很大,做個日誌壓縮指令碼,在夜裡4 30自動執行,第二天後發現磁碟空間又滿了,只好刪除沒用的日誌,清空空間,可詭異的是怎麼刪除沒用的檔案,空間還是占用很大。如圖 用du 根目錄下,發現這些檔案加一塊也達不到占用的空間大小。如圖 我也有遇見過此類問題,一般都...

Linux 檢視磁碟占用空間

我們的服務有時會應為某種原因宕機,其中就有磁碟空間太大沒有即使清理而導致的,今天學習了一下磁碟的維護日誌維護,順手做個筆記,以防後面bu y不用給忘記了 1 檢視磁碟占用空間 df h,這個命令用於檢視伺服器空間,執行後的效果圖如下 2 檢視當前目錄,哪個檔案占用記憶體最大 就可以看到logs佔的記...

linux 查詢磁碟占用情況

root study df ahikhtm 目錄或檔名 選項與引數 a 列出所有的檔案系統,包括系統特有的 proc等檔案系統 k 以kbytes的容量顯示各檔案系統 m 以mbytes的容量顯示各檔案系統 h 以m 1000k取代m 1024k的進製方式 t 連同該partition的filesy...