linux下du和df結果不一致的原因及處理
本實驗結果是在RHEL6.4-64bit下得出
1. 原理介紹
1 .1du 的工作原理
du 命令會對待統計檔案逐個呼叫fstat這個系統呼叫,獲取檔案大小。它的資料是基於檔案獲取的,所以有很大的靈活性,不一定非要針對一個分割槽,可以跨越多個分割槽操作。如果針對的目錄中檔案很多,du速度就會很慢了。
1.2 df 的工作原理
df 命令使用的事statfs這個系統呼叫,直接讀取分割槽的超級塊資訊獲取分割槽使用情況。它的資料是基於分割槽後設資料的,所以只能針對整個分割槽。由於df直接讀取超級塊,所以執行速度不受檔案多少影響。
2. 實驗模擬
常見的df和du不一致情況就是檔案被刪除的而程式控制程式碼還在導致的問題。當一個檔案被刪除後,在檔案系統目錄中已經不可見了,所以du就不會再統計它了。然而如果此時還有執行的程式持有這個已經被刪除了的檔案的控制程式碼,那麼這個檔案就不會真正在磁碟中被刪除,分割槽超級塊中的資訊也就不會更改,這樣df仍舊會統計這個被刪除了的檔案。
首先檢視磁碟和路徑
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 42G 201G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]#
[root@zhjk115 app]# pwd
/app
用 dd 命令建立 1G 大學的檔案
[root@zhjk115 app]# dd if=/dev/zero of=/app/test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 4.31891 s, 243 MB/s
檢視 df 和 du 結果,目前是一致的
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 43G 200G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]# du -sh
43G
模擬程式在使用 test.iso 檔案
[root@zhjk115 app]# tail -f test.iso &
[1] 22349
[root@zhjk115 app]# ps -ef |grep tail
root 22349 21633 28 09:56 pts/1 00:00:01 tail -f test.iso
root 22353 21633 0 09:56 pts/1 00:00:00 grep tail
刪除 test.iso 檔案, 可以看出 df 和 du 的結果是不一致的
[root@zhjk115 app]# rm -rf test.iso
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 43G 200G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
[root@zhjk115 app]# du -sh
42G
用 lsof 檢視哪個程式在使用 /app/test.iso
[root@zhjk115 app]# lsof |grep test.iso
tail 22349 root 3r REG 253,2 1048576000 12 /app/test.iso
手動 kill 佔有 test.iso 檔案的程式,此時, du 和 df 的結果一致
[root@zhjk115 app]# kill -9 22349
[1]+ Killed tail -f test.iso
[root@zhjk115 app]# du -sh
42G
[root@zhjk115 app]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
45G 8.0G 35G 19% /
tmpfs 4.0G 1.5G 2.5G 37% /dev/shm
/dev/mapper/VolGroup-lv_app
255G 42G 201G 18% /app
/dev/sda1 485M 38M 422M 9% /boot
結論:
本實驗主要是針對Linux環境的使用,該問題是由於程式的檔案控制程式碼釋放問題導致的,很多情況為清理完日誌等檔案是du顯示為已釋放空間,但df空間還在使用,此時可以透過echo(或者>)代替rm來避免這種情況,同時也可以檢視是哪個程式在使用,可以根據情況手動清理、重啟應用或者等待釋放。
注:當oracle主機某些日誌被清理後但df顯示空間沒有被釋放也是同樣的道理,一般來說等一段時間即可,否則需要重啟資料庫例項來釋放空間。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26964624/viewspace-2564207/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- linux 命令之du與dfLinux
- Linux 基礎教程 40-df和du命令Linux
- du 及 df 命令的使用(附帶示例)
- 009 Linux 檔案大小統計與排序( du於df和sort)Linux排序
- Linux檔案系統df、du、fsck命令講解Linux
- Linux系統下ifconfig命令使用及結果分析Linux
- ORA-32701錯誤原因分析及處理方法
- unity中取樣深度圖的結果處理Unity
- Spark Task 的執行流程④ - task 結果的處理Spark
- springboot2.0-統一處理返回結果和異常情況Spring Boot
- MySQL主從複製延遲原因及處理思路MySql
- Linux基礎命令---duLinux
- 封裝springmvc處理ajax請求結果封裝SpringMVC
- .NET 結果與錯誤處理利器 FluentResults
- wordpress外掛上傳的失敗原因和處理方案
- Linux檔案過濾及內容編輯處理命令總結!Linux
- Linux下使用Ansible處理批量操作Linux
- 深入理解Spark 2.1 Core (四):運算結果處理和容錯的原理Spark
- go 如何處理資料庫返回的多結果集Go資料庫
- Linux基礎命令---dfLinux
- Linux基礎命令—dfLinux
- AOP的具體實踐-簡化結果返回的處理
- Linux下Jmeter+nmon+nmon analyser實現效能監控及結果分析LinuxJMeter
- Linux 和 Windows 下編碼問題處理 codestyle 解決方法LinuxWindows
- linux下gdb如何處理coredump錯誤Linux
- Handler處理器 和 Opener 及CookieCookie
- (反射+內省機制的運用)處理jdbc的結果集反射JDBC
- LINUX磁碟使用命令DU的改進Linux
- SSL證書稽核失敗的常見原因及處理方法(綜合篇)
- [求助] LR 測試的結果和 fiddler 抓取的時間為什麼不一致?
- Spark解決SQL和RDDjoin結果不一致問題(工作實錄)SparkSQL
- JavaScript 中正則匹配時結果不一致的問題JavaScript
- Linux環境下段錯誤的產生原因及除錯方法小結Linux除錯
- 幾個與文字處理相關的Linux命令總結Linux
- linux故障處理Linux
- 資訊的表示和處理 及 CS:APP 15213 datalabAPP
- python使用flask接收前端資料,處理後返回結果PythonFlask前端
- 多對一處理 和一對多處理的處理