Memcached'da beklenmeyen (?) Yüksek 'boşa harcanan' bellek


18

Güncellenmiş, uzunca (üzgünüm) sorunun alt kısmına bakın.

Memcached istatistiklerimize baktığımda, daha önce bilmediğim bir sorun bulduğumu düşünüyorum. Görünüşe göre garip bir şekilde boşa giden alanımız var. Bir değişiklik için phpmemcacheadmin ile kontrol ettim ve bana bakan bu resmi buldum:

memcached önbellek boyutu grafiği

Şimdi tüm ayrıntıları bilmediğimi ilk itiraf etmeme rağmen, en kötü durum senaryosunun% 50 atık olacağı izlenimindeydim. Gerçekten de biraz eski olan bu sayfayı - diğerlerinin yanı sıra - okudum , ama memcached versiyonumuz da öyle. Sanırım sistemin nasıl çalıştığını anlıyorum ( örneğin ) inanıyorum, ama% 76 boşa nasıl gidebileceğimizi anlamakta zorlanıyorum.

Phpmemcacheadmin'in tahliye oranı şöyledir 2 ev/s, bu yüzden burada bir sorun vardır.

  • Birincil soru: bunu düzeltmek için ne yapabilirim . Ona daha fazla bellek atabilirim (bence bazı ekstra kullanılabilir var), belki slab config ile uğraşmalıyım (bu sürümle bile mümkün mü?), Belki başka seçenekler var mı? Memcached sürümünü yükseltmek hızlı bir şekilde kullanılabilir bir seçenek değildir.

  • Meraktan uzak olan ikincil soru, elbette% 75 (ve yükselen) boşa alan oranı bekleniyorsa ve eğer öyleyse nedenidir.

Sistem: Bu şu anda herhangi bir şey yapabileceğim bir şey değil, memcached versiyonunun en yeni olmadığını biliyorum, ama bunlar bana dağıtılan kartlar.

  • Memcached 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

@DavidSchwartz'ın cevabına bir cevap olarak: İşte phpmemcacheadmin'in ürettiği levha istatistikleri: (bunlardan sonra daha fazla levha var)

( İstatistikleri biraz sonradan metin biçiminde buraya yapıştırdım )

Döşeme detayları

GÜNCELLEME

Daemon'u -f 1.5 ile yeniden başlattım ve gerçekten iyi görünüyordu. Biraz ısınmadan sonra 50/50 kullanılmış / boşa gitmiştik. Ancak, eskisi gibi, gün içinde ne kadar uzun sürdüğümüzde (gün boyunca daha yoğunlaşır) şu andaki haline geri dönmeye başladı: 30/70 ve israf hala artıyor. Bunun dışında hala 'israfın' nereden geldiğini bilmiyorum. Bu levhayı görüyorum:

**Slab 5 Stats**
Chunk Size  496.0 Bytes
Used Chunk  77502 [24.6 %]
Total Chunk 314986
Total Page  149
Wasted      117.3 MBytes
Hits        30.9 Request/sec
Evicted     0

Dolu değil, tahliye edilmedi, ancak 117.3 MBytes harcıyor. Yaptığım hızlı hesaplama (yanlışsam beni düzelt):

  • önceki levhanın boyutu 328'dir, bu yüzden en kötü durumda bu levha 329 baytlık parçalarla doldurulur.
  • bu, kullanılan yığın başına 167 bayt harcadığı anlamına gelir = 12942834 bayt = 12.3 MB

Peki o zaman diğer 105 MB israf nereden geldi? Hemen yanındaki büyük kardeş böyle görünüyor:

**Slab 6 Stats** 
Chunk Size  744.0 Bytes
Used Chunk  17488 [31.0 %]
Total Chunk 56360
Total Page  40
Wasted      31.1 MBytes
Hits        107.7 Request/sec
Evicted     1109

Sorun şu ki, diğer levhalarda tonlarca kullanılmayan alan var, ancak levha 3% 100 dolu ve tahliyeleri görüyor.
David Schwartz

İyi bir nokta, tahliyeleri açıklayacaktır, ancak 'israf' sayısının nasıl hesaplandığından emin değilim. Eğer slab 8'de sadece% 13.9 kullanılmışsa, mutlaka orada "boş" alan kalmalı mı?
Nanne

Evet, o levhada boş alan var. Ancak, tahliye edilen nesneler o levhaya girmezse bu yardımcı olmaz.
David Schwartz

Cevabınızdan bunu anladım, ama neden listelenen boş alan yok? Hala boş alan varsa, bu pasta grafik beyazının bir parçası olmalı (test kurulumumda olduğu gibi), en azından, ben de düşündüm
Nanne

Yanıtlar:


10

Bu sorudan bu yana bir yıl geçti ve cevabınızı bulup bulamadığınızı bilmiyorum ama "israf" algınızın yanlış olduğunu söyleyeceğim.

Boşa giden bellek, başka bir uygulama tarafından kullanılamayacağı için belleğe ayrılmıştır, ancak yine de memcached için kullanılabilir.

Açıklamayı basitleştirmek için, 3 Döşemeli 3MB ram ile bir mesajınız olduğunu varsayın:

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

10k boyutunda tek bir "set" yürütün. İstatistiklerinizde (kabaca) aşağıdakilere sahip olduğunuzu göreceksiniz:

0.03% used
66.6% free
33% wasted

Bunun nedeni memcached'ın "slab class 1" den tek bir parça ayırması ve bu slab için belleğin% 99'unun "boşa gitmesi" ve% 1'in "" kullanılması "anlamına gelir.

10k büyüklüğünde başka bir "set" çalıştırın. Bu sefer şunları göreceksiniz:

0.06% used
66.6% free
32.7% wasted

şimdi slab 1'de tahsis edilen 100 parçadan 2'sini kullanıyorsunuz, "israf" istatistikleri düştü ve kullanılmış istatistikler arttı.

Kullanılan% + israf% 'in% 100'e eşit olması için yanlış bir şey yoktur. Bu, daha fazla belleğiniz olmadığı anlamına gelmez, sadece her bir levhadan en az bir yığın ayırdığınız anlamına gelir.

Bu sorunu görmek için 100k boyutunda bir "set" ve 1000k boyutunda başka bir set

Şimdi göreceksin

36.6% used
   0% free
63.3% wasted

Kulağa hoş geliyor! Bunu yedeklemek için bağlantınız var mı? Eğer öyleyse bu benim memcache sunucumun daha iyi performans gösterdiği anlamına geliyor. Sizi doğru anlıyorsam, boşa harcandığı anlamına gelir, ancak yine de kullanılabilir. Bu, hiçbir şey ücretsiz değilse, daha fazla levha tahsis edemeyeceğiniz anlamına gelir, ancak kendiniz sorun olduğu anlamına gelmez mi?
Nanne

1
Kafamın üstünde bir bağım yok ama kendinizi test etmek çok kolay. Komut satırınıza basın ve nasıl çalıştığını test etmek için örnek bir küçük sunucu oluşturun. İlk oluşturulan levhaları gösteren ayrıntılı hata ayıklama iletileri için -vv seçeneğini kullanabilirsiniz. Örneğin: "memcached -vv -p 11500 -m 3 -n 10000 -f 10" size 10k 100k ve 1000k boyutlarında 3 döşeme oluşturur. Ve "setler" yayınlamaya devam edin ve boşa / kullanılmış istatistiklerinizin aynen yukarıda tarif ettiğim gibi değiştiğini görün.
kali

iyi bir nokta. Şimdi sizin için bu cevaba nasıl daha fazla dikkat çekebileceğimi öğrenmek için :)
Nanne

6

Muhtemelen çok sayıda çok küçük nesneniz var. Genellikle, en küçük levha 104 baytlık girişleri tutar. Bir tamsayıyı diğerine eşleyen çok sayıda girişiniz varsa,% 85'e kadar atık alabilirsiniz.

Küçük nesneler için Memcached makalesinde bu sorunun nasıl ayarlanacağı hakkında bilgi bulabilirsiniz .


İstatistikler sayfasını doğru okursam durum böyle değildir. Atıkların çoğu 480.0 Byte-yığınlı bir döşemedir. Bazı istatistikleri gösterebilirsem kontrol edeyim ...
Nanne

Oh, o zaman bu iyi ve normal, endişelenecek bir şey yok. Artık orada daha az veri var. (Örneğin, bu levhanın sadece% 14'ünün kullanıldığına dikkat edin.)
David Schwartz

Peki% 75'i nasıl boşa harcanıyor? Bu sayı kullanılmayan alan içeriyor mu? Bunun "özgür" olarak sayılmasını beklerdim. Ayrıca, site yoğunlaştıkça, harcanan bir artış / gün geçtikçe kullanılan bellekte bir azalma görüyoruz. Bu ve tahliye ettiğimiz gerçeği bana neler yapılabileceğini merak ettiriyor.
Nanne

Daha az sayıda plakaya sahip olmak, yanlış plakaya çok fazla bellek takılması sorununu önlemeye yardımcı olabilir. Örneğin, -f 1.5 -I 2800yardımcı olabilir.
David Schwartz

Man sayfası çok açık değil: -I 28001M varsayılanının aksine 2800K mı?
Nanne

-1

Bu sorunu vardı ve memcached redis (disk tabanlı kaydetme olmadan) taşındı. Bunun mümkün olmayabileceğini biliyorum, ancak bir seçenek olarak deneyebilir ve bellek parçalanmasına dikkat edebilirsiniz. Yeniden başlatma sırasında "eski önbellek" sorunlarını gidermek için kalıcılığı bile açabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.