本篇內(nèi)容主要講解“l(fā)inux下du和df的工作原理”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“l(fā)inux下du和df的工作原理”吧!
創(chuàng)新互聯(lián)建站總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)絡(luò)營銷策劃、網(wǎng)頁設(shè)計、網(wǎng)站維護、公眾號搭建、微信小程序開發(fā)、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動行銷領(lǐng)域創(chuàng)造價值而不懈努力!du命令會對待統(tǒng)計文件逐個調(diào)用fstat這個系統(tǒng)調(diào)用,獲取文件大小。它的數(shù)據(jù)是基于文件獲取的,所以有很大的靈活性,不一定非要針對一個分區(qū),可以跨越多個分區(qū)操作。如果針對的目錄中文件很多,du速度就會很慢了。
df命令使用的事statfs這個系統(tǒng)調(diào)用,直接讀取分區(qū)的超級塊信息獲取分區(qū)使用情況。它的數(shù)據(jù)是基于分區(qū)元數(shù)據(jù)的,所以只能針對整個分區(qū)。由于df直接讀取超級塊,所以運行速度不受文件多少影響。
常見的df和du不一致情況就是文件被刪除的而進程句柄還在導(dǎo)致的問題。當一個文件被刪除后,在文件系統(tǒng)目錄中已經(jīng)不可見了,所以du就不會再統(tǒng)計它了。然而如果此時還有運行的進程持有這個已經(jīng)被刪除了的文件的句柄,那么這個文件就不會真正在磁盤中被刪除,分區(qū)超級塊中的信息也就不會更改,這樣df仍舊會統(tǒng)計這個被刪除了的文件。
首先查看磁盤和路徑
[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命令創(chuàng)建1G大學(xué)的文件
[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結(jié)果,目前是一致的
[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的結(jié)果是不一致的
[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的結(jié)果一致
[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
結(jié)論:
本實驗主要是針對Linux環(huán)境的使用,該問題是由于進程的文件句柄釋放問題導(dǎo)致的,很多情況為清理完日志等文件是du顯示為已釋放空間,但df空間還在使用,此時可以通過echo(或者>)代替rm來避免這種情況,同時也可以查看是哪個進程在使用,可以根據(jù)情況手動清理、重啟應(yīng)用或者等待釋放。
注:當oracle主機某些日志被清理后但df顯示空間沒有被釋放也是同樣的道理,一般來說等一段時間即可,否則需要重啟數(shù)據(jù)庫實例來釋放空間。
到此,相信大家對“l(fā)inux下du和df的工作原理”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!