天天看點

Redis實戰(13)虛拟記憶體

首先說明下redis 的虛拟記憶體與作業系統的虛拟記憶體不是一碼事,但是思路和目的都是相同

的。就是暫時把不經常通路的資料從記憶體交換到磁盤中,進而騰出寶貴的記憶體空間用于其他

需要通路的資料。尤其是對于redis 這樣的記憶體資料庫,記憶體總是不夠用的。除了可以将數

據分割到多個redis server 外。另外的能夠提高資料庫容量的辦法就是使用虛拟記憶體把那些

不經常通路的資料交換的磁盤上。如果我們的存儲的資料總是有少部分資料被經常通路,大

部分資料很少被通路,對于網站來說确實總是隻有少量使用者經常活躍。當少量資料被經常訪

問時,使用虛拟記憶體不但能提高單台redis server 資料庫的容量,而且也不會對性能造成太

多影響。

redis 沒有使用作業系統提供的虛拟記憶體機制而是自己在實作了自己的虛拟記憶體機制,主要

的理由有兩點:

1、作業系統的虛拟記憶體是已4k 頁面為最小機關進行交換的。而redis 的大多數對象都遠小

于4k,是以一個作業系統頁面上可能有多個redis 對象。另外redis 的集合對象類型如list,set

可能存在與多個作業系統頁面上。最終可能造成隻有10%key 被經常通路,但是所有操作系

統頁面都會被作業系統認為是活躍的,這樣隻有記憶體真正耗盡時作業系統才會交換頁面。

2、相比于作業系統的交換方式,redis 可以将被交換到磁盤的對象進行壓縮,儲存到磁盤的對

象可以去除指針和對象中繼資料資訊,一般壓縮後的對象會比記憶體中的對象小10 倍,這樣redis

的虛拟記憶體會比作業系統虛拟記憶體能少做很多io 操作。

1

2

3

4

5

6

7

<code>#下面是vm 相關配置</code>

<code>vm-enabled </code><code>yes</code> <code>#開啟vm 功能</code>

<code>vm-swap-</code><code>file</code> <code>/tmp/redis</code><code>.swap </code><code>#交換出來的value 儲存的檔案路徑</code>

<code>vm-max-memory 1000000 </code><code>#redis 使用的最大記憶體上限</code>

<code>vm-page-size 32 </code><code>#每個頁面的大小32 個位元組</code>

<code>vm-pages 134217728 </code><code>#最多使用多少頁面</code>

<code>vm-max-threads 4 </code><code>#用于執行value 對象換入換出的工作線程數量</code>

redis 的虛拟記憶體在設計上為了保證key 的查找速度,隻會将value 交換到swap 檔案中。所

以如果是記憶體問題是由于太多value 很小的key 造成的,那麼虛拟記憶體并不能解決,和操作

系統一樣redis 也是按頁面來交換對象的。redis 規定同一個頁面隻能儲存一個對象。但是一

個對象可以儲存在多個頁面中。在redis 使用的記憶體沒超過vm-max-memory 之前是不會交換

任何value 的。當超過最大記憶體限制後,redis 會選擇較過期的對象。如果兩個對象一樣過期

會優先交換比較大的對象,精确的公式swappability = age*log(size_in_memory)。對于

vm-page-size 的設定應該根據自己的應用将頁面的大小設定為可以容納大多數對象的大小,

太大了會浪費磁盤空間,太小了會造成交換檔案出現碎片。對于交換檔案中的每個頁面,redis

會在記憶體中對應一個1bit 值來記錄頁面的空閑狀态。是以像上面配置中頁面數量(vm-pages

134217728 )會占用16M 記憶體用來記錄頁面空閑狀态。vm-max-threads 表示用做交換任務的

線程數量。如果大于0 推薦設為伺服器的cpu 核心的數量,如果是0 則交換過程在主線程進行。

本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1340672,如需轉載請自行聯系原作者