nginx占用大量磁碟空間問題分析

2022-05-02 21:03:07 字數 1488 閱讀 1720

昨日線上一台機器上的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一些資料,即使該語句沒有匹配的資料,這個命令也會儲存到日誌檔案中...