Memcached記憶體分配優化及使用問題

2021-09-06 18:47:39 字數 3742 閱讀 2613

前幾天做了個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...