[转载]Memcache内存临界测试
作者:馬江濤
時間:2010-08-19
前言
此文檔幫助您了解 memcache 在保存數據時,假如要保存的數據量接近 memcache 指定的最大內存時,memcache 是怎樣進行數據存儲的,以及怎樣盡可能的提高 memcache 的命中率。
關鍵詞:memcache 、臨界、內存、memcache.php、LRU、監控
?
1 測試目的
探究 memcache 保存數據時,在保存的數據量接近 memcache 指定內存臨界時,保存規律是怎樣的?
?
2 測試環境
?
| 軟件 | 版本號 | 說明 |
| php | php-5.3.3 | ? |
| memcache | memcached Server 1.2.1 | 最大內存設置為 128M |
| apache | 2.2.16 | ? |
| memcache.php | ? | 一個開源的 php腳本 |
?
3 測試用例
定義變量 i從 0到 3853628增加(一個 key與 value占據的空間約 50 bytes)設置 Key為:hello+i
設置 Value為:第 i個我
循環插入鍵值數
4 測試結果
1) 幾個截圖及說明如下
1》放入第 1986718 個對象后,內存消耗 77.8M(占 memcache 指定最大內存 60.8%)
?
?
2》放入2880657 個對象后,內存消耗78.1m(占memcache 指定最大內存61.0%)
?
3》放入3853630 個對象后,內存消耗78.1m(占memcache 指定最大內存61.0%)
以上三個圖示說明,插入的數據如果大小變化不是很大時,memcache 中的數據存儲到一定的時候(占總內存60%左右時),不再消耗內存
?
3) 此時獲取緩存中的數據
獲取hello1 得到 null
獲取hello1926814 得到 null 4/8 位置的數據
獲取hello2408518 得到 null 5/8 位置的數據
獲取hello2890221 得到 第2890221 個我 6/8 位置的數據
獲取hello3853628 得到 第3853628 個我
?
以上數據說明,在上述情況下,內存消耗到60%左右時,memcache 就開始執行LRU 機制了。
?
原因分析:
1 memcached 中新的value 過來存放的地址是該value 的大小決定的,value 總是會被選擇存放到chunk 與其最接近的一個slab 中,假如已經沒有合適的chunk 了,那就開始LRU 了。所以,可見memcached 的LRU 不是全局的,而是針對slab 的,是區域性的。
2 memcached 的內存分配采用的是預分配方式,為了獲得更快的速度,不得不以空間換時間。所以在如上情況下(插入的數據大小變化不是很大時),在內存消耗耗到60%左右時開始啟用LRU 機制。其余的40%在這種場合,基本等于是浪費掉的。
?
3 要提高memcached 的命中率,可以通過預估我們的value 大小,然后適當的調整增長因子來實現。(通過調整增長因子 –f 1.1 表示chunk 按照1.1 倍的速度增長,可以盡可能多的擁有某種大小的chunk)
注:
memcache 的數據存儲時有3 個概念:1》 slab, 2》 page, 3》 chunk
一個memcahced 進程會預先將自己劃分為若干個slab,每個slab 下又有若干個page,每個page 下又有多個chunk。Slab 的數量是有限的,幾個,十幾個,或者幾十個,這個跟進程配置的內存有關。而每個slab 下得page 默認情況是1m,也就是說如果一個slab 占用100m 得內存得話,那么默認情況下這個slab 所擁有得page 的個數就是100,而chunk 就是數據存放的最終地方。
?
?
轉載于:https://www.cnblogs.com/jiunadianshi/articles/2429125.html
總結
以上是生活随笔為你收集整理的[转载]Memcache内存临界测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RadioWar_RFID_LiveCD
- 下一篇: 一个物理学家学习Windows编程的感受