前幾天做了個memcached的思考,並測試了一些資料,是關於如何提高memcached記憶體使用率的問題。
在啟動memcached的時候可以加-f引數和-n引數。-f指定各slab裡面chunk大小的變化比例,預設1.25,-n指定slab裡面chunk大小從多少開始。
使用memcache_add($memcache_obj, md5(rand()), str_repeat(md5(rand()),10), false,80000 );向memcache中持續灌入資料。
memcached –d start –m 50 啟動memcache,增長係數預設為1.25
結果:2011-03-28 11:15:37:sar:localh~211: 10 0 0 0 0/0% 0 5 265 50m 0% 0 0 0 4/0/0
2011-03-28 11:15:40:sar:localh~211: 11 0 0 530 0/0% 0 192k 4k 50m 1% 797 530 0 4/0/0
2011-03-28 11:15:43:sar:localh~211: 11 0 0 13k 0/0% 0 5m 105k 50m 17% 21k 13k 0 4/0/1
2011-03-28 11:15:46:sar:localh~211: 11 0 0 13k 0/0% 0 5m 104k 50m 48% 61k 13k 0 4/1/1
2011-03-28 11:15:49:sar:localh~211: 11 0 0 13k 0/0% 0 5m 102k 50m 77% 98k 13k 580 4/1/2
2011-03-28 11:15:52:sar:localh~211: 11 0 0 13k 0/0% 0 5m 103k 50m 92% 116k 13k 13k 4/1/3
2011-03-28 11:15:55:sar:localh~211: 11 0 0 13k 0/0% 0 5m 105k 50m 92% 116k 13k 13k 4/2/4
2011-03-28 11:15:58:sar:localh~211: 11 0 0 13k 0/0% 0 5m 107k 50m 92% 116k 13k 13k 4/2/5
2011-03-28 11:16:01:sar:localh~211: 11 0 0 13k 0/0% 0 5m 101k 50m 92% 116k 13k 13k 4/3/6
使用率穩定在92%,儲存116k條
stats slabs
stat 8:chunk_size 440
stat 8:chunks_per_page 2383
stat 8:total_pages 50
stat 8:total_chunks 119150
stat 8:used_chunks 119150
使用了大小為440位元組的chunk。 使用了id為8的slab
memcached –d start –m 50 –f 2 增長係數為2
結果:2011-03-28 11:17:53:sar:localh~211: 10 0 0 0 0/0% 0 5 267 50m 0% 0 0 0 4/0/0
2011-03-28 11:17:56:sar:localh~211: 11 0 0 13k 0/0% 0 5m 107k 50m 16% 20k 13k 0 4/0/0
2011-03-28 11:17:59:sar:localh~211: 11 0 0 13k 0/0% 0 5m 106k 50m 47% 60k 13k 0 4/1/1
2011-03-28 11:18:02:sar:localh~211: 11 0 0 13k 0/0% 0 5m 106k 50m 63% 80k 13k 13k 4/1/2
2011-03-28 11:18:05:sar:localh~211: 11 0 0 13k 0/0% 0 5m 105k 50m 63% 80k 13k 13k 4/1/3
2011-03-28 11:18:08:sar:localh~211: 11 0 0 13k 0/0% 0 5m 108k 50m 63% 80k 13k 13k 4/2/4
2011-03-28 11:18:11:sar:localh~211: 11 0 0 13k 0/0% 0 5m 106k 50m 63% 80k 13k 13k 4/2/5
使用率穩定在63%,儲存80k條。
stat 4:chunk_size 640
stat 4:chunks_per_page 1638
stat 4:total_pages 50
stat 4:total_chunks 81900
stat 4:used_chunks 81900
使用了大小為640的chunk,使用了id為4的slab
memcached –d start –m 50 –f 1.001 –n 375 增長率為1.001 (memcache要求增長率必須大於1)
結果:2011-03-28 14:40:09:sar:127.0.~211: 11 0 0 12k 0/0% 0 4m 100k 50m 98% 124k 12k 10k 4/1/3
2011-03-28 14:40:10:sar:127.0.~211: 11 0 0 13k 0/0% 0 5m 104k 50m 99% 125k 13k 13k 4/1/3
2011-03-28 14:40:11:sar:127.0.~211: 11 0 0 13k 0/0% 0 5m 106k 50m 99% 125k 13k 13k 4/2/4
使用率穩定在99%,儲存125k條
stat 1:chunk_size 408
stat 1:chunks_per_page 2570
stat 1:total_pages 6
stat 1:total_chunks 15420
stat 1:used_chunks 15022
使用了大小為408的chunk,使用了id為1的slab
可見調整-f和-n的值可有效提高memcache對記憶體的使用率。
不過需要注意的是,以上測試資料使用了同長度資料,對於長度不定長的資料,需要根據整體資料確定-f和-n的值。
經過我的測試slab的id值最大為200,若id為199的slab中chunk仍小於資料長度,那麼需要將資料存放在id為200的slab中,該slab中的chunk大小為1m,造成記憶體的巨大浪費。
memcached -d start -m 50 -f 1.001 -n 100
2011-03-28 14:51:15:sar:127.0.~211: 11 0 0 13k 0/0% 0 5m 101k 50m 0% 50 13k 13k 4/1/2
記憶體使用率約等於0,儲存50條資料
stat 200:chunk_size 1048576
stat 200:chunks_per_page 1
stat 200:total_pages 50
stat 200:total_chunks 50
stat 200:used_chunks 50
使用了大小為1m的chunk,使用了id為200的slab
現在還有乙個問題:
stat 1:chunk_size 408
stat 1:chunks_per_page 2570
乙個1m大小slab中存放了2570個大小為408的chunk,可見並沒有放滿,剩餘的空間就被浪費了。對於這種情況,每個slab浪費的記憶體只有幾百個位元組,可以忽略不計,但是假如chunk大小為幾十上百k的時候,空間浪費情況就很客觀了。這時可在memcached啟動時新增-i(大寫的i)引數來改變slab的大小
文章**:
memcached記憶體分配機制
memcached slab allocator分配機制 slab allocator的基本原理是按照預先規定的大小,將分配的記憶體分割成特定長度的塊,以完全解決記憶體碎片問題。slab allocation的原理相當簡單,就是將分配的記憶體分割成各種尺寸的塊 chunk 並把尺寸相同的塊分成組 c...
Memcached記憶體分配及使用問題
在啟動memcached的時候可以加 f引數和 n引數。f指定各slab裡面chunk大小的變化比例,預設1.25,n指定slab裡面chunk大小從多少開始。使用memcache add memcache obj,md5 rand str repeat md5 rand 10 false,8000...
Memcached 記憶體管理
memcached是乙個高效的分布式記憶體cache,了解memcached的記憶體管理機制,便於我們理解memcached,讓我們可以針對我們資料特點進行調優,讓其更好的為我所用。這裡簡單談一下我對 memcached的記憶體管理的一些認識,在沒有特別註明的情況下,這裡談到的memcached是1...