Memcached açık kaynaklı, yüksek performanslı, dağıtık memory caching sistemidir. Danga Interactive tarafından LiveJournal.com'un database yükünü azaltmak ve siteyi hızlandırmak için geliştirilmiş.
Çok hızlı olmasından dolayı ve hem kurulumu hem de kullanımı çok kolay olduğu için yıllardır yoğun şekilde birçok yerde kullanılıyor. Son zamanlarda artan NoSQL trendinde bile popülerliğini hiç kaybetmedi.
Memcached'in bir sürü artısı var. Ama bunların yanıda genelde çok az bilinen eksileri de mevcut. Bunlardan en büyüğü aşağıda bahsedeceğim 'wasted memory' sorunu.
Page
Memcached'i başlattığınızda (memcached -d
) kendisi için ayırılmış alanı küçük parçalara bölümlendirir. Bunlara page
denir ve herbiri 1MB
büyüklüğündedir. Örneğin memcached -d -m 128
şeklinde başlatınca max 128MB memory allocate edilir. Bu da 128 tane page
yaratılır demektir.
Slab
Bu page'lerin
bazıları slab-class'lara
atanır bazıları ise boşta durur. Her slab-class
sadece belirli büyüklüklerdeki öğeleri barındarmakla görevlidir. Bir item kaydetmek istediğinizde, o değer boyutuna göre hangi slab
ile ilişkilendirilmiş ise oraya kaydedilir.
Chunk
Bunu yapabilmek için slab-class'lara
atanmış page'ler
daha da küçük parçalara bölünür. Bunlara da chunk
denir. chunk
boyutları bütün slab'lar
için farklı ama herbir slab
içinde aynıdır.
growth factor
adı verilen değer ile (1.25) minimum chunk
değeri (96byte) ilk slab
sonrası için hesaplanıp slab chunk size
değeri bulunur.
Herbir slab'a
başlangıçta 1 adet page
atanır. page
kendi içinde slab chunk size
değerine göre chunk'lara
bölünür. 1MB
alana kaç adet chunk
sığıyorsa o kadar chunk
yaratılmış olur.
$ memcached -vv -I 1k
slab class 1: chunk size 96 perslab 10
slab class 2: chunk size 120 perslab 8
slab class 3: chunk size 152 perslab 6
slab class 4: chunk size 192 perslab 5
slab class 5: chunk size 240 perslab 4
slab class 6: chunk size 304 perslab 3
slab class 7: chunk size 384 perslab 2
slab class 8: chunk size 480 perslab 2
slab class 9: chunk size 600 perslab 1
slab class 10: chunk size 752 perslab 1
slab class 11: chunk size 1024 perslab 1
Bu da şu demek oluyor; yukarıda ki resimde de görüldüğü gibi bazı slab'lar
başlangıçta sadece 1 adet chunk
ile yaratılmış olacaktır. chunk'lar
doldukca boştaki page'ler
ihtiyaç duyulan slab'a
atanır. Boşta hiç page
kalmadığında tek chunk'a
sahip slab'lar
boş page'lerden
de alamadıysa sadece 1 değer barındırabilirler. Örneğin 1MB'a
yakın bir değer set
etmiş olalım. Aynı chunk'a
denk gelicek büyüklükte başka bir değer set
etmek istersek slab
kendi içinde LRU
çalıştırıcak ve ilk değeri silip yeni gelen değeri set
edicek. memcached
bir sürü RAM
ile başlatılmış olsa bile set
edilen değerlerin karakteristiğine (mesela %99.9 küçük değerler) göre yaşanması çok muhtemel bir senaryo.
Wasted Memory
chunk'lar
belirli aralıklarda ki değerleri tutarlar.
slab class 1
için chunk size
96byte
demek 96 byte ve daha küçük değerler bu slab'a
kayıt edilir. slab class 2
için 96 ile 120 byte arasındaki değerler geçerlidir.
Yine bir örnek üstünden gitmek gerekirse; sürekli 97 byte (item overhead
dahil) büyüklüğünde değerler kaydettiğimizi farz edelim. slab class 2'ye
bu değerleri kaydediyor olucak. chunk size
120 olduğu için herbir chunk
sadece 1 değer barındırabilecek.
120byte chunk size - 97byte data = 23byte wasted memory
slab
istatistiklerini stats slabs
komutu ile görebilirsiniz. Örnek bir slab class
istatistiğinde wasted memory
değeri görülebilir.
**Slab 13 Stats**
Chunk Size 1480.0 Bytes
Used Chunk 27515 [38.1 %]
Total Chunk 72216
Total Page 102
Wasted 12.4 MBytes
Hits 15.2 Request/sec
Evicted 0
wasted memory
artık kullanılamaz gibi bir durum yok. Silinen, süresi dolan ve yeniden yazılan değerlere göre sürekli değişmektedir.
set
edilen değerlere göre optimizasyon yapmak mümkün. Ayrıca growth factor
ve minimum chunk size
değerini küçültmek de bu sorunu azaltacaktır ama başka sorunlara yol açacaktır.
memcached
kullanırken göz ardı edilen bu durumlar performans ve verimlilik açısından beklediğinizi alamamanıza hatta boş memory varken gereksiz eviction
yaşanmasına sebep olabilir. O yüzden dikkat etmek gerekli.
Boş memory varken kimse kullanıcı sessionlarını kaybetmek istemez.