Linux服務器運行一段時間後,因爲其內存管理機制,會將暫時不用的內存轉爲buff/cache,這樣在程序使用到這一部分數據時,可以很快的取出,從而提升系統的運行效率,因此這也正是linux內存管理中很是出色的一點,因此乍一看內存剩餘的很是少,可是在程序真正須要內存空間時,linux會將緩存讓出給程序使用,這樣達到對內存的最充分利用,因此真正剩餘的內存是free+buff/cachenode
可是有些時候大量的緩存佔據空間,這時候應用程序回去使用swap交換空間,從而使系統變慢,這時候須要手動去釋放內存,釋放內存的時候,首先執行命令 sync 將全部正在內存中的緩衝區寫到磁盤中,其中包括已經修改的文件inode、已延遲的塊I/O以及讀寫映射文件,從而確保文件系統的完整性linux
說到清理內存,那麼不得不提到/proc這一個虛擬文件系統,這裏面的數據和文件都是內存中的實時數據,不少參數的獲取均可以從下面相應的文件中獲得,好比查看某一進程佔用的內存大小和各項參數,cpu和主板的詳細信息,顯卡的參數等等;相應的關於內存的管理方式是在/proc/sys/vm/drop_chches文件中,必定要注意這個文件中存放的並非具體的內存內容,而是0-3這幾個數字,經過文件大小隻有1B也能夠知道,而這些代號分別告訴系統表明不一樣的含義以下:緩存
0:0是系統默認值,默認狀況下表示不釋放內存,由操做系統自動管理服務器
1:釋放頁緩存性能
2:釋放dentries和inodes優化
3:釋放全部緩存spa
因此根據上面的說明,分別將1,2,3這3個數字重定向到drop_caches中能夠實現內存的釋放,通常釋放內存都是重定向3到文件中,釋放全部的緩存操作系統
那麼下面舉個例子,好比這裏只釋放頁緩存,首先使用 free -h 查看當前內存剩餘設計
當前內存剩餘570M左右,另外buff/cache是1.3G,根據上面說的如今真正的剩餘內存應該是1.8G左右,首先寫緩存到文件系統:3d
sync
手動執行sync命令(描述:sync 命令運行 sync 子例程。若是必須中止系統,則運行sync 命令以確保文件系統的完整性。sync 命令將全部未寫的系統緩衝區寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件)
而後執行下面命令釋放內存(頁緩存buff/cache):
echo 1 > /proc/sys/vm/drop_caches
執行完以後,再次查看內存剩餘:
會發現內存被釋放了,可用內存確實變爲1.8G左右
到這裏內存就釋放完了,如今drop_caches中的值爲1,若是如今想讓操做系統從新分配內存,那麼設置drop_caches的值爲0便可:
echo 0 > /proc/sys/vm/drop_caches
另外須要注意的是,在生產環境中的服務器咱們不要頻繁的去釋放內存,只在必要時候清理內存便可,更重要的是咱們應該從應用程序層面去優化內存的利用和釋放,常常清理內存可能只是暫時屏蔽的應用程序中的一些bug,因此更重要的是程序的調優,其餘的交給操做系統來管理
######### Linux釋放內存的相關知識 ###############
在Linux系統下,通常不須要去釋放內存,由於系統已將內存管理的很好。但也有例外,有時內存會被緩存佔用掉,致使系統使用SWAP空間影響性能,例如當你在linux下頻繁存取文件後,物理內存會很快被用光,當程序結束後,內存不會被正常釋放,而是一直做爲caching。此時就須要執行釋放內存(清理緩存)的操做了。
Linux系統的緩存機制是至關先進的,他會針對dentry(用於VFS,加速文件路徑名到inode的轉換)、Buffer Cache(針對磁盤塊的讀寫)和Page Cache(針對文件inode的讀寫)進行緩存操做。但在進行了大量文件操做以後,緩存會把內存資源基本用光。實際上文件操做已完成,這部分緩存已用不到了。這時,有必要來手動進行Linux下釋放內存的操做,實際上是釋放緩存的操做了。/proc是一個虛擬文件系統,咱們可經過對它的讀寫操做作爲與kernel實體間進行通訊的一種手段.也就是說可經過修改/proc中的文件,來對當前kernel的行爲作出調整.那麼可經過調整/proc/sys/vm/drop_caches來釋放內存。要達到釋放緩存的目的,首先須要瞭解下關鍵的配置文件/proc/sys/vm/drop_caches。這個文件中記錄了緩存釋放的參數,默認值爲0,也就是不釋放緩存。
通常複製了文件後,可用內存會變少,都被cached佔用了,這是linux爲了提升文件讀取效率的作法:爲了提升磁盤存取效率, Linux作了一些精心的設計, 除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換), 還採起了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁盤塊的讀寫,後者針對文件inode的讀寫。這些Cache有效縮短了 I/O系統調用(好比read,write,getdents)的時間。
釋放內存前先使用sync命令作同步,以確保文件系統的完整性,將全部未寫的系統緩衝區寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件。不然在釋放緩存的過程當中,可能會丟失未保存的文件。
[root@fcbu.com ~]# free -m
total used free shared buffers cached
Mem: 7979 7897 82 0 30 3918
-/ buffers/cache: 3948 4031
Swap: 4996 438 4558
第一行用全局角度描述系統使用的內存情況:
total 內存總數
used 已經使用的內存數,通常狀況這個值會比較大,由於這個值包括了cache 應用程序使用的內存
free 空閒的內存數
shared 多個進程共享的內存總額
buffers 緩存,主要用於目錄方面,inode值等(ls大目錄可看到這個值增長)
cached 緩存,用於已打開的文件
第二行描述應用程序的內存使用:
-buffers/cache 的內存數:used - buffers - cached
buffers/cache 的內存數:free buffers cached
前個值表示-buffers/cache 應用程序使用的內存大小,used減去緩存值
後個值表示 buffers/cache 全部可供應用程序使用的內存大小,free加上緩存值
第三行表示swap的使用:
used 已使用
free 未使用
可用的內存=free memory buffers cached。
爲何free這麼小,是否關閉應用後內存沒有釋放?
實際上,這是由於Linux對內存的管理與Windows不一樣,free小並非說內存不夠用了,應該看的是free的第二行最後一個值:-/ buffers/cache: 3948 4031 ,這纔是系統可用的內存大小。
實際項目中的經驗告訴咱們,若是由於是應用有像內存泄露、溢出的問題,從swap的使用狀況可比較快速判斷的,但free上反而比較難查看。既然核心是可快速清空buffer或cache,但核心並無這樣作(默認值是0),不該隨便去改變它。
通常狀況下,應用在系統上穩定運行了,free值也會保持在一個穩定值的,雖然看上去可能比較小。當發生內存不足、應用獲取不到可用內存、OOM錯誤等問題時,更應該去分析應用方面的緣由,如用戶量太大致使內存不足、發生應用內存溢出等狀況,不然,清空buffer,強制騰出free的大小,可能只是把問題給暫時屏蔽了,因此說通常狀況下linux都不用常常手動釋放內存。