linux 系統的 cache 過大,解決方案


linux buff/cache過大,清理腳本

三條指令:

sync

echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

執行完這三條指令后通過free -m命令查看,free可用內存馬上增多,buff/cache列值變小,說明內存被釋放了,但是不能總是手動的執行這三條指令,所以最后寫了一個shell腳本,開啟Linux定時任務crond,每天早上檢查一次free內存,當小於4G時執行這三條命令(注:系統內容20G)。

注意:在執行這三條命令之前一定要先執行sync命令(描述:sync 命令運行 sync 子例程。如果必須停止系統,則運行sync 命令以確保文件系統的完整性。sync 命令將所有未寫的系統緩沖區寫到磁盤中,包含已修改的 i-Node、已延遲的塊 I/O 和讀寫映射文件)

 

解決方案(手動)

1. 修改/proc/sys/vm/drop_caches,釋放Slab占用的cache內存空間(參考drop_caches的官方文檔):

 

[plain]  view plain  copy
 
 
 
 
  1. Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.  
  2. To free pagecache:  
  3. * echo 1 > /proc/sys/vm/drop_caches  
  4. To free dentries and inodes:  
  5. * echo 2 > /proc/sys/vm/drop_caches  
  6. To free pagecache, dentries and inodes:  
  7. * echo 3 > /proc/sys/vm/drop_caches  
  8. As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.  
  9. This tunable was added in 2.6.16.  

注意:在執行這三條命令前先執行sync命令

 

 

解決方案(自動)

1、編寫shell定時任務腳本freemem.sh

 

[plain]  view plain  copy
 
 
 
 
  1. #! /bin/sh  
  2. used=`free -m | awk 'NR==2' | awk '{print $3}'`  
  3. free=`free -m | awk 'NR==2' | awk '{print $4}'`  
  4. echo "===========================" >> /app/memory/logs/mem.log  
  5. date >> /app/memory/logs/mem.log  
  6. echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/memory/logs/mem.log  
  7. if [ $free -le 4000 ] ; then  
  8.                 sync && echo 1 > /proc/sys/vm/drop_caches  
  9.                 sync && echo 2 > /proc/sys/vm/drop_caches  
  10.                 sync && echo 3 > /proc/sys/vm/drop_caches  
  11.                 used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`  
  12.                 free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`  
  13.                 echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/memory/logs/mem.log  
  14.                 echo "OK" >> /app/memory/logs/mem.log  
  15. else  
  16.                 echo "Not required" >> /app/memory/logs/mem.log  
  17. fi  
  18. exit 1  

2、使用crontab -e命令編輯當前用戶的crontab

 

 

[plain]  view plain  copy
 
 
 
 
  1. 0 6 * * * /usr/local/tomcat/sztFileFront/bin/freemem.sh  

 

定時任務編寫參考:http://www.jb51.net/article/15008.htm


3、重啟crond服務

 

[plain]  view plain  copy
 
 
 
 
  1. /sbin/service crond restart  

4、查看crond服務是否重啟成功

 

 

[plain]  view plain  copy
 
 
 
 
  1. /sbin/service crond status  

 


最后,問題解決。我設定的定時任務是每天早上6點執行一次freemem.sh腳本。
 
 

Linux中Cache內存占用過高解決辦法

 

 

在Linux系統中,我們經常用free命令來查看系統內存的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態:

1.png

這里的默認顯示單位是kb,我的服務器是128G內存,所以數字顯得比較大。這個命令幾乎是每一個使用過Linux的人必會的命令,但越是這樣的命令,似乎真正明白的人越少(我是說比例越少)。一般情況下,對此命令輸出的理解可以分這幾個層次:

  1. 不了解。這樣的人的第一反應是:天啊,內存用了好多,70個多G,可是我幾乎沒有運行什么大程序啊?為什么會這樣?Linux好占內存!

  2. 自以為很了解。這樣的人一般評估過會說:嗯,根據我專業的眼光看的出來,內存才用了17G左右,還有很多剩余內存可用。buffers/cache占用的較多,說明系統中有進程曾經讀寫過文件,但是不要緊,這部分內存是當空閑來用的。

  3. 真的很了解。這種人的反應反而讓人感覺最不懂Linux,他們的反應是:free顯示的是這樣,好吧我知道了。神馬?你問我這些內存夠不夠,我當然不知道啦!我特么怎么知道你程序怎么寫的?

根據目前網絡上技術文檔的內容,我相信絕大多數了解一點Linux的人應該處在第二種層次。大家普遍認為,buffers和cached所占用的內存空間是可以在內存壓力較大的時候被釋放當做空閑空間用的。但真的是這樣么?在論證這個題目之前,我們先簡要介紹一下buffers和cached是什么意思:

什么是buffer/cache?

buffer和cache是兩個在計算機技術中被用濫的名詞,放在不通語境下會有不同的意義。在Linux的內存管理中,這里的buffer指Linux內存的:Buffer cache。這里的cache指Linux內存中的:Page cache。翻譯成中文可以叫做緩沖區緩存和頁面緩存。在歷史上,它們一個(buffer)被用來當成對io設備寫的緩存,而另一個(cache)被用來當作對io設備的讀緩存,這里的io設備,主要指的是塊設備文件和文件系統上的普通文件。但是現在,它們的意義已經不一樣了。在當前的內核中,page cache顧名思義就是針對內存頁的緩存,說白了就是,如果有內存是以page進行分配管理的,都可以使用page cache作為其緩存來管理使用。當然,不是所有的內存都是以頁(page)進行管理的,也有很多是針對塊(block)進行管理的,這部分內存使用如果要用到cache功能,則都集中到buffer cache中來使用。(從這個角度出發,是不是buffer cache改名叫做block cache更好?)然而,也不是所有塊(block)都有固定長度,系統上塊的長度主要是根據所使用的塊設備決定的,而頁長度在X86上無論是32位還是64位都是4k。

明白了這兩套緩存系統的區別,就可以理解它們究竟都可以用來做什么了。

什么是page cache?

Page cache主要用來作為文件系統上的文件數據的緩存來用,尤其是針對當進程對文件有read/write操作的時候。如果你仔細想想的話,作為可以映射文件到內存的系統調用:mmap是不是很自然的也應該用到page cache?在當前的系統實現里,page cache也被作為其它文件類型的緩存設備來用,所以事實上page cache也負責了大部分的塊設備文件的緩存工作。

什么是buffer cache

Buffer cache則主要是設計用來在系統對塊設備進行讀寫的時候,對塊進行數據緩存的系統來使用。這意味着某些對塊的操作會使用buffer cache進行緩存,比如我們在格式化文件系統的時候。一般情況下兩個緩存系統是一起配合使用的,比如當我們對一個文件進行寫操作的時候,page cache的內容會被改變,而buffer cache則可以用來將page標記為不同的緩沖區,並記錄是哪一個緩沖區被修改了。這樣,內核在后續執行臟數據的回寫(writeback)時,就不用將整個page寫回,而只需要寫回修改的部分即可。

如何回收cache?

Linux內核會在內存將要耗盡的時候,觸發內存回收的工作,以便釋放出內存給急需內存的進程使用。一般情況下,這個操作中主要的內存釋放都來自於對buffer/cache的釋放。尤其是被使用更多的cache空間。既然它主要用來做緩存,只是在內存夠用的時候加快進程對文件的讀寫速度,那么在內存壓力較大的情況下,當然有必要清空釋放cache,作為free空間分給相關進程使用。所以一般情況下,我們認為buffer/cache空間可以被釋放,這個理解是正確的。

但是這種清緩存的工作也並不是沒有成本。理解cache是干什么的就可以明白清緩存必須保證cache中的數據跟對應文件中的數據一致,才能對cache進行釋放所以伴隨着cache清除的行為的,一般都是系統IO飆高。因為內核要對比cache中的數據和對應硬盤文件上的數據是否一致,如果不一致需要寫回,之后才能回收。

在系統中除了內存將被耗盡的時候可以清緩存以外,我們還可以使用下面這個文件來人工觸發緩存清除的操作:

[root@tencent64 ~]# cat /proc/sys/vm/drop_caches 
1

方法是:

echo 1 > /proc/sys/vm/drop_caches

當然,這個文件可以設置的值分別為1、2、3。它們所表示的含義為:

echo 1 > /proc/sys/vm/drop_caches:表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches:表示清除回收slab分配器中的對象(包括目錄項緩存和inode緩存)。slab分配器是內核中管理內存的一種機制,其中很多緩存數據實現都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches:表示清除pagecache和slab分配器中的緩存對象。

優化后截圖如下:

2.png

學好計算機,走遍天下都不怕


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM