天天看點

在 Linux 上如何清除記憶體的 Cache、Buffer 和交換空間

像任何其他的作業系統一樣,gnu/linux 已經實作的記憶體管理不僅有效,而且更好。但是,如果有任何程序正在蠶食你的記憶體,而你想要清除它的話,linux 提供了一個重新整理或清除ram緩存方法。

在 Linux 上如何清除記憶體的 Cache、Buffer 和交換空間

clear ram cache and swap in linux

<a target="_blank"></a>

每個 linux 系統有三種選項來清除緩存而不需要中斷任何程序或服務。

(lctt 譯注:cache,譯作“緩存”,指 cpu 和記憶體之間高速緩存。buffer,譯作“緩沖區”,指在寫入磁盤前的存儲再記憶體中的内容。在本文中,buffer 和 cache 有時候會通指。)

僅清除頁面緩存(pagecache)

<code># sync; echo 1 &gt; /proc/sys/vm/drop_caches</code>

清除目錄項和inode

<code># sync; echo 2 &gt; /proc/sys/vm/drop_caches</code>

清除頁面緩存,目錄項和inode

<code># sync; echo 3 &gt; /proc/sys/vm/drop_caches</code>

上述指令的說明:

如果你必須清除磁盤高速緩存,第一個指令在企業和生産環境中是最安全,<code>"...echo 1&gt; ..."</code>隻會清除頁面緩存。 在生産環境中不建議使用上面的第三個選項<code>"...echo 3 &gt; ..."</code> ,除非你明确自己在做什麼,因為它會清除緩存頁,目錄項和inodes。

在linux上釋放也許被核心所使用的緩沖區(buffer)和緩存(cache)是否是個好主意?

當你設定許多設定想要檢查效果時,如果它實際上是專門針對 i/o 範圍的基準測試,那麼你可能需要清除緩沖區和緩存。你可以如上所示删除緩存,無需重新啟動系統(即無需停機)。

linux被設計成它在尋找磁盤之前到磁盤緩存尋找的方式。如果它發現該資源在緩存中,則該請求不會發送到磁盤。如果我們清理緩存,磁盤緩存就起不到作用了,系統會到磁盤上尋找資源。

此外,當清除緩存後它也将減慢系統運作速度,系統會将每一個被請求的資源再次加載到磁盤緩存中。

現在,我們将建立一個 shell 腳本,通過一個 cron 排程任務在每天下午2點自動清除ram緩存。如下建立一個 shell 腳本 clearcache.sh 并在其中添加以下行:

<code>#!/bin/bash</code>

<code># 注意,我們這裡使用了 "echo 3",但是不推薦使用在産品環境中,應該使用 "echo 1"</code>

<code>echo "echo 3 &gt; /proc/sys/vm/drop_caches"</code>

給clearcache.sh檔案設定執行權限

<code># chmod 755 clearcache.sh</code>

現在,當你需要清除記憶體緩存時隻需要調用腳本。

現在設定一個每天下午2點的定時任務來清除ram緩存,打開crontab進行編輯。

<code># crontab -e</code>

添加以下行,儲存并退出。

<code>0 3 * * * /path/to/clearcache.sh</code>

在生産環境的伺服器上自動清除ram是否是一個好主意?

不!它不是。想想一個情況,當你已經預定腳本在每天下午2點來清除記憶體緩存。那麼其時該腳本會執行并重新整理你的記憶體緩存。在某一天由于某些原因,可能您的網站的線上使用者會超過預期地從你的伺服器請求資源。

而在這時,按計劃排程的腳本運作了,并清除了緩存中的一切。當所有的使用者都從磁盤讀取資料時,這将導緻伺服器崩潰并損壞資料庫。是以,清除緩存僅在必要時并且在你的預料之中,否則你就是個呆瓜系統管理者。

如果你想清除掉的空間,你可以運作下面的指令:

<code># swapoff -a &amp;&amp; swapon -a</code>

此外,了解有關風險後,您可以将上面的指令添加到cron中。

現在,我們将上面兩種指令結合成一個指令,寫成正确的腳本來同時清除ram緩存和交換空間。

<code># echo 3 &gt; /proc/sys/vm/drop_caches &amp;&amp; swapoff -a &amp;&amp; swapon -a &amp;&amp; printf '\n%s\n' 'ram-cache and swap cleared'</code>

<code>su -c 'echo 3 &gt; /proc/sys/vm/drop_caches' &amp;&amp; swapoff -a &amp;&amp; swapon -a &amp;&amp; printf '\n%s\n' 'ram-cache and swap cleared'</code>

在測試上面的指令之前,我們在執行腳本前後運作“free -m” 來檢查緩存。

在 Linux 上如何清除記憶體的 Cache、Buffer 和交換空間

clear ram cache and swap space

就是這樣,如果你喜歡這篇文章,不要忘記向我們提供您寶貴的意見,讓我們知道,您認為在企業和生産環境中清除記憶體緩存和緩沖區是否是一個好主意?

<b>原文釋出時間為:2015-06-15</b>

<b>本文來自雲栖社群合作夥伴“linux中國”</b>