情景
有天看到有開發(fā)同事A在討論群里說埠褪,一測試環(huán)境中某服務(wù)打印了大量的日志,把磁盤打滿了挤庇。這位同事把日志清理了钞速,并請群里的相關(guān)人員看下是否需要重啟各自的服務(wù)。過一會兒嫡秕,同事B說其中一服務(wù)雖然重新啟動了渴语,但并未正常啟動,因?yàn)閱尤罩局幸廊伙@示著... No space left on device ...
昆咽。
前有同事A說磁盤滿并把日志清了驾凶,后有同事說磁盤還是沒有剩余空間。這前后矛盾的現(xiàn)象掷酗,激起了我的興趣调违,于是我登錄到該測試環(huán)境服務(wù)器上一探究竟。
分析
BTW:
上述所說服務(wù)的路徑均在/opt目錄下泻轰,產(chǎn)生的文件也都在/opt目錄的相關(guān)子目錄下技肩。所以,下面示例中關(guān)注/opt路徑的磁盤空間即可浮声。
使用df
命令查看:
df -lh
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/cl-root 92G 12G 80G 13% /
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 0 7.8G 0% /dev/shm
tmpfs 7.8G 75M 7.7G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/sda1 1014M 138M 877M 14% /boot
/dev/mapper/vg_data2-lv_data2 200G 200G 20K 100% /opt
在/opt
目錄下使用du
命令查看:
sudo du -h --max-depth=1
6.4M ./blueset
9.7G ./lanxin
16K ./mysqlback
86M ./logs
9.8G .
由上可知:
du
命令得到/opt
目錄只占用了9.8G的空間虚婿,而df
命令則顯示200G全部被占滿。為什么會這樣呢泳挥?du和df得到的磁盤占用的數(shù)值不應(yīng)該一致的么雳锋?
原理
經(jīng)過一番搜索,發(fā)現(xiàn)了df
和du
的差別:
- 正常情況下羡洁,兩者的輸出其實(shí)也并不完全相同玷过,但只是稍有差異;
du命令得到的是將指定文件系統(tǒng)中所有的目錄筑煮、符號鏈接和文件使用的塊數(shù)累加辛蚊,即該文件系統(tǒng)使用的總塊數(shù);
df命令得到的是文件系統(tǒng)磁盤塊分配情況真仲,包括總塊數(shù)袋马、剩余塊數(shù)等。
文件系統(tǒng)分配其中的一些磁盤塊用來記錄它自身的一些數(shù)據(jù)秸应,如inode虑凛,磁盤分布圖碑宴,間接塊,超級塊等桑谍。這些數(shù)據(jù)對大多數(shù)用戶級的程序來說是不可見的延柠,通常稱為Meta Data(元數(shù)據(jù))
。
du命令是用戶級的程序锣披,它不考慮Meta Data贞间,而df命令則查看文件系統(tǒng)的磁盤分配圖并考慮Meta Data。
因此正常情況下雹仿,df計(jì)算的USED空間會比du計(jì)算的結(jié)果要稍大些增热。
- 特殊情況下,兩者輸出的結(jié)果差異很大胧辽;
上述碰到的問題就是這種特殊情況峻仇。
du是以文件名、目錄名等為依據(jù)計(jì)算空間使用的邑商,而df是以硬盤塊使用情況來計(jì)算空間使用的摄咆。
當(dāng)一個應(yīng)用程序正在寫一個大文件的時候,雖然我們可以對這個文件進(jìn)行刪除或挪走奠骄,但應(yīng)用程序依然占有著句柄,并根據(jù)句柄所指磁盤位置直接寫磁盤番刊,而不檢查該文件是否存在含鳞。
對應(yīng)到上面的場景中,服務(wù)在向日志文件中寫入時芹务,因?yàn)榇疟P空間不足蝉绷,所以把日志文件刪除了。但由于服務(wù)并沒有停止枣抱,所以它還占用著句柄熔吗,因而兩者得到的數(shù)據(jù)也不一樣。
解決方案
對于當(dāng)前存在的df和du結(jié)果不一致問題佳晶,可選的解決方案有:
1 重新掛載這個分區(qū)桅狠;
2 將未關(guān)閉的服務(wù)停掉,釋放句柄轿秧;
如果在一開始A同事發(fā)現(xiàn)磁盤空間不足時中跌,應(yīng)該怎么做?
應(yīng)清空日志文件的內(nèi)容(echo ' ' > server.log
)菇篡,而不是直接刪除文件漩符。通過這種方法,磁盤空間可以立即釋放驱还,進(jìn)程可以繼續(xù)向文件寫入日志嗜暴,而不必重啟服務(wù)凸克。
如果日志文件內(nèi)容需要保留,可以先復(fù)制一份保存起來闷沥,再清空原文件萎战。
相關(guān)鏈接
http://itindex.net/detail/39369-linux-df-du
http://www.chinaunix.net/old_jh/6/465673.html
該帖中摘要了一篇來自2001年發(fā)布的網(wǎng)文片段,對du和df區(qū)別的介紹很詳細(xì)狐赡,推薦仔細(xì)閱讀撞鹉。