1. 程式人生 > >Linux中Cache記憶體佔用過高解決辦法

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中的資料和對應硬碟檔案上的資料是否一致,如果不一致需要寫回,之後才能回收。

在系統中除了記憶體將被耗盡的時候可以清快取以外,我們還可以使用下面這個檔案來人工觸發快取清除的操作:

[[email protected] ~]# 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

相關推薦

LinuxCache記憶體佔用解決辦法

在Linux系統中,我們經常用free命令來檢視系統記憶體的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態: 這裡的預設顯示單位是kb,我的伺服器是128G記憶體,所以數字顯得比較大。這個命令幾乎是每一個使用過Linux的人必會的命令,但越是這樣的命令,似乎真正明白的人越少(

Linuxbuff/cache記憶體佔用解決辦法

如何回收cache? Linux核心會在記憶體將要耗盡的時候,觸發記憶體回收的工作,以便釋放出記憶體給急需記憶體的程序使用。一般情況下,這個操作中主要的記憶體釋放都來自於對buffer/cache的釋放。尤其是被使用更多的cache空間。既然它主要用來做快

解決Linux buffer/cache記憶體佔用辦法

-------原文地址 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html --------本文只是搬運 在Linux系統中,我們經常用free命令來檢視系統記憶體的使用狀態。在一個RHEL6的系統上,fr

Spring cloud開發記憶體佔用解決方法

https://blog.csdn.net/wanhuiguizong/article/details/79289986   版權宣告:本文為博主原創文章,轉載請宣告文章來源和原文連結。 https://blog.csdn.net/wanhuiguizong/article/details/79

MySQL 5.6記憶體佔用解決方案【總結】

最近把MySQL升級到了5.6版本,無意中在工作管理員發現MySQL記憶體佔用達到400+M,這是怎麼回事呢?以前的版本可沒有遇到過這種情況啊。開始的時候還以為是快取了某個資料量較大的表的資料。於是重啟MySQL服務,但結果出乎意料,MySQL服務一起啟動,記憶體就又飆

LinuxCache內存占用解決辦法

格式化 left ack 當前 區別 專業 技術分享 表示 進行 在Linux系統中,我們經常用free命令來查看系統內存的使用狀態。在一個RHEL6的系統上,free命令的顯示內容大概是這樣一個狀態: 這裏的默認顯示單位是kb,我的服務器是128G內存,所以數字顯得

正確理解Linux記憶體佔用的問題

最近有個月經問題,老有人問為何開機後,還沒有其他服務,mem就被用完了?是不是記憶體洩露?是否要重啟服務?只能說不要看現象,要看本質才能找到問題的根源。往往給出這樣的結果,懷疑記憶體用了90%:Mem: 4146788k total, 3825536k used, 3212

Redis過期--淘汰機制的解析和記憶體佔用解決方案

echo編輯整理,歡迎轉載,轉載請宣告文章來源。歡迎新增echo微信(微訊號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!! Redis在我們平時的開發或者練習的時候,往往很容易忽略一個問題,那就是我們的Redis記憶體佔滿的問題。但是在

Sublime Text 3 CPU佔用率 && WebStorm記憶體佔用

  用Sublime Text 3或WebStorm進行前端開發時,遇到了同樣的問題:當專案檔案比較多或檔案比較大時,CPU佔用率或記憶體佔用持續比較高,後來經查閱發現是index files導致的,可以理解為:Sublime Text 3或WebStorm需要不斷重新整理檔案索引,不斷將專案檔案從硬碟中讀到

記憶體佔用,快取不釋放導致宕機處理方案

故障現象: 1、某分行部署的某臺伺服器記憶體佔用過高,導致宕機; 2、程式碼層面檢查暫未發現問題,伺服器硬重啟持續一段時間後(3-5天)再次佔滿。 發現問題: 趕往現場後進行檢查,當時是一切正常的,今有DB2程序佔用18%,在正常範圍內; 在crontab 中發現有兩個指

Linux磁碟滿了以及負載解決辦法

原文地址:http://blog.csdn.net/zheshijieyouwo/article/details/769448451. 磁碟滿了如果一臺機器磁碟滿了,首先我們需要確定其位置,命令為 df(或者df -h) //顯示結果 Filesystem 512-bl

tomcat占用cpu解決辦法

title 情況 處理 顯示 pri grep tar jstack 16進制 在工作中經常遇到tomcat占用cpu居高不下,針對這種情況有以下處理辦法進行排查。 jps --> 查看java的進程 top -Hp pid --> 根據jps得到的進程

遠端連線linux的mysql報錯1130解決辦法

解決辦法:        改mysql的user表,具體方法如下:        1、先用use mysql;進入名字為mysql的資料庫;        2、mysql>update user set host='%' where host='localhost' a

vue專案 vendor打包後解決辦法

vendor打包過大的原因就是引用三方外掛的js太大了 ,可以直接引用映象解決問題 解決辦法如下 1.在webpack.base.conf.js中新增配置項 表示webpack不需打包的檔案 ,‘外掛名’: '專案中別名' 2.在index.html中引入相應映象檔

linux無法生成core檔案的解決辦法

最近在ubuntu11上做開發 但是預設情況下是不生成core檔案的 網上找了很久,終於搞定,特此記錄,以便之後查詢 ulimit -a 檢視core檔案相關屬性設定 ulimit -c unlimit 開啟coredump 並設定dump檔案大小為無限制 如需要先知du

linuxtomcat啟動較慢的解決辦法

1.場景還原   今天在部署linux伺服器java環境的時候,筆者發現tomcat啟動非常慢,堪稱龜速!起初筆者以為是哪裡配置出錯了,於是反覆檢查配置,無果而終;於是再仔細看了看日誌,tomcat啟動沒有報出什麼錯,只是有種卡住的意味,筆者稱之為“tomcat假死”。 2

php在守護程序記憶體洩露用unset()解決辦法

PHP的unset()函式用來清除、銷燬變數,不用的變數,我們可以用unset()將它銷燬。但是某些時候,用unset()卻無法達到銷燬變數佔用的記憶體!我們先看一個例子: <?php

Docker長期執行導致Linux記憶體buff/caches佔用解決方法

Docker長期執行導致Linux記憶體buff/caches佔用過高,這個問題很常見,但是我們是無法控制Docker自己對pag

w3wp.exe程序佔用記憶體解決方法

解決CPU佔用過多: 1、在IIS中對每個網站進行單獨的應用程式池配置。即互相之間不影響。 2、設定應用程式池的CPU監視,不超過25%(伺服器為4CPU),每分鐘重新整理,超過限制時關閉。 根據w3wp取得是哪一個應用程式池: 1、在工作管理員中增加顯示pid欄位。就可以看到佔用記憶體或者cpu最高

AIX Paging Space 使用率的分析與解決

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!