頻繁讀寫檔案導致記憶體使用率過高

2021-08-28 20:42:07 字數 1670 閱讀 7302

最近接到乙個客戶反饋,說是伺服器記憶體使用過高,總記憶體16g,使用top命令檢視可用記憶體已經不足1g了。

客戶環境伺服器為linux,部署了3個tomcat,每個tomcat均有大量的日誌產生。

讓客戶使用free -m檢查一下

此處有必要解釋一下free命令返回的各個引數的意思(直接轉了)。

解釋:

可用看到cache已經達到10g了。是什麼導致cache如此之大呢?

網上可用查到解釋:

什麼是cache memory(快取記憶體):

當你讀寫檔案的時候,linux核心為了提高讀寫效能與速度,會將檔案在記憶體中進行快取,這部分記憶體就是cache memory(快取記憶體)。即使你的程式執行結束後,cache memory也不會自動釋放。這就會導致你在linux系統中程式頻繁讀寫檔案後,你會發現可用物理記憶體會很少。

其實這快取記憶體(cache memory)在你需要使用記憶體的時候會自動釋放,所以你不必擔心沒有記憶體可用。如果你希望手動去釋放cache memory也是有辦法的。

為了確認這種情況是由於檔案讀寫造成的,以及該情況下不影響程式正常執行(cache能正確自動釋放),特進行試驗。

記憶體8g,我準備了乙個近2g的檔案。下面進行cp操作並檢查cached的數值。

通過測試可以發現可用記憶體越來越少,cached的記憶體越來越大,經過幾次cp之後可用記憶體已經只有142m了。

此時我啟動了3個tomcat,然後再kill掉這3個tomcat程序。

tomcat程序啟動沒有報記憶體溢位,把3個tomcat程序kill掉之後free明顯多了(原先被檔案讀寫占用的cached內存在free不足的時候**了被tomcat占用,在tomcat被kill之後釋放出來)。

1、linux系統在檔案讀寫時會寫入記憶體快取,導致「看上去」可用記憶體會減少。

2、cached掉的記憶體不用擔心,在需要記憶體時會釋放出來。

3、cached掉的內存在需要釋放時也不是全部釋放的,而是一部分一部分的釋放的。

附手動釋放cached記憶體的方式:

如何釋放cache memory(快取記憶體):

用下面的命令可以釋放cache memory:

to free pagecache:

echo 1 > /proc/sys/vm/drop_caches

to free dentries and inodes:

echo 2 > /proc/sys/vm/drop_caches

to free pagecache, dentries and inodes:

echo 3 > /proc/sys/vm/drop_caches

注意,釋放前最好sync一下,防止丟失資料。

故障排查 記憶體使用率過高

本篇將介紹伺服器記憶體使用率過高的處理方案。記憶體方面主要關注兩個問題,第一 物理記憶體夠不夠用 第二 有沒有記憶體洩露。在linux系統中,free top vmstat等命令都會有系統記憶體使用率的輸出 程序占用 過多 執行時間太久 被植入異常木馬 記憶體洩漏 檢視記憶體佔用率top10的程序 ...

訊息迴圈不會導致cup使用率過高

bool winapi getmessage 阻塞型函式 out lpmsg lpmsg,in opt hwnd hwnd,in uint wmsgfiltermin,in uint wmsgfiltermax while bret getmessage msg,hwnd,0,0 0 else 在呼...

mongodb記憶體使用率過高問題排查

1.在生產環境中,若不限制moongo對記憶體的使用,會導致mongo集群記憶體使用率飆公升。2.物理記憶體和虛擬記憶體區別 物理記憶體和虛擬記憶體 物理記憶體 真正的記憶體 虛擬記憶體 磁碟空間虛擬出的記憶體 3.記憶體飆公升的解決方法 通過設定 config,shard cachesize的大小...