昨日線上一台機器上的nginx rt飆高,@明儼 調查發現這台機器上的metaserver記憶體占用很高,同時還有個奇怪的現象,df發現/home的空間占用在增長飛快,但metaserver和nginx的日誌檔案增長都很慢,通過du -sh /home統計home下檔案的總大小,發現跟df命令/home占用的空間小10+g,到底誰占用了我的磁碟空間?
後來把nginx程序都停掉後(當時應該先通過lsof或/proc/pid/fd/看看nginx當時開啟的檔案情況),df顯示/home的空間一下降下來了,跟du統計的結果能匹配上,說明這些磁碟空間都被nginx程序占用著。核心組的同事告訴我們,乙個檔案被程序開啟後,在關閉前如果檔案被刪除,此時這個檔案已經在它父目錄的目錄項中被刪除掉(在父目錄ls已經看不到這個檔案),但該程序依然能夠正常的讀寫檔案,直到檔案被該程序關閉後,這個檔案的空間才會被**,通過下面乙個小例子解釋下。
點選(此處)摺疊或開啟int main(
)lseek(fd, 0, seek_set);/
/ keep writing, but don't make it increase
sleep(5);}
return 0;
}
# g++ filetest.cpp
# ls
a.out filetest.cpp 沒有afile這個檔案
# du -sh
16k .
# df -m | grep home
/dev/sda9 63940652125585148 86% /home
# ./a.out & 執行測試程式,持續寫檔案前100m的空間
# ls
a.out filetest.cpp 沒有afile這個檔案
# du -sh
16k .
# df -m | grep home
/dev/sda9 63940652135585048 86% /home
# killall a.out 殺掉測試程式
# df -m | grep home
/dev/sda9 63940652125585148 86% /home
nginx有個特性,post請求的body如果超過2個page(可配置),就會把body的資料寫到磁碟暫存,等請求處理完後,再刪除臨時的檔案。nginx在open建立臨時檔案後,會先unlink掉這個檔案(為什麼要這麼做,有什麼好處?),然後在請求處理完後close掉檔案。告警的伺服器當時由於metaserver占用了大部分的記憶體,已經出現了swap的情況,而通過nginx寫的檔案平均大小在60-70k左右,基本都要寫臨時檔案,導致nginx的服務越來越慢,積壓大量的post請求,這些請求對應的臨時檔案一直占用著磁碟空間,但因為檔案已經刪除,外面已經看不到這些檔案的存在,從而導致du,df顯示的結果相差很大。
檢視mysql占用磁碟空間
查詢所有資料庫占用磁碟空間大小的sql語句 select table schema,concat truncate sum data length 1024 1024,2 mb as data size,concat truncate sum index length 1024 1024,2 mb ...
詭異的Linux磁碟空間被占用問題。
新公司的測試機磁碟空間空餘很小,日誌很多,也很大,做個日誌壓縮指令碼,在夜裡4 30自動執行,第二天後發現磁碟空間又滿了,只好刪除沒用的日誌,清空空間,可詭異的是怎麼刪除沒用的檔案,空間還是占用很大.如圖 用du 根目錄下,發現這些檔案加一塊也達不到占用的空間大小.如圖 我也有遇見過此類問題,一般都...
centos mysql占用磁碟空間過大解決方法
安裝了mysql以後,過一段時間發現磁碟空間不足了,查一下,發現是 mysql bin.000001 mysql bin 000002等檔案占用了空間,那麼這些檔案是幹嗎的?這是資料庫的操作日誌,例如update乙個表,或者delete一些資料,即使該語句沒有匹配的資料,這個命令也會儲存到日誌檔案中...