Zaktualizowano, patrz na dole długiego (przepraszającego) pytania.
Patrząc na nasze zapamiętane statystyki, myślę, że znalazłem problem, o którym wcześniej nie wiedziałem. Wygląda na to, że mamy dziwnie dużą ilość zmarnowanej przestrzeni. Sprawdziłem zmiany w phpmemcacheadmin i znalazłem ten obraz, który na mnie patrzył:
Teraz miałem wrażenie, że najgorszym scenariuszem byłoby 50% marnotrawstwa, chociaż jako pierwszy przyznam, że nie znam wszystkich szczegółów. Przeczytałem - między innymi - tę stronę, która jest rzeczywiście nieco stara, ale taka jest też nasza wersja memcached. Wydaje mi się, że rozumiem, jak działa system ( np. ), Ale trudno mi zrozumieć, w jaki sposób możemy uzyskać 76% zmarnowanej przestrzeni.
Wskaźnik eksmisji pokazany przez phpmemcacheadmin jest 2 ev/s
, więc jest tutaj pewien problem.
Podstawowe pytanie brzmi: co mogę zrobić, aby to naprawić . Mógłbym wrzucić w to więcej pamięci (myślę, że jest trochę więcej dostępnych), może powinienem majstrować przy konfiguracji płyty (czy to w ogóle możliwe w tej wersji?), Może są inne opcje? Aktualizacja wersji memcached nie jest szybką opcją.
Drugie pytanie, z ciekawości, brzmi oczywiście, czy oczekuje się 75% (i rosnącej) marnowanej powierzchni, a jeśli tak, to dlaczego.
System: Obecnie nie mogę nic na to poradzić, wiem, że wersja memcached nie jest najnowsza, ale to są karty, które dostałem.
- Memcached 1.4.5
- Apache 2.2.17
- PHP 5.3.5
W odpowiedzi na odpowiedź @DavidSchwartz: oto statystyki płyt, które generuje phpmemcacheadmin: (oprócz tych płyt jest więcej)
( Wkleiłem też statystyki nieco później w formacie tekstowym )
AKTUALIZACJA
Zrestartowałem demona z opcją -f 1.5 i wyglądało to naprawdę dobrze. Po pewnym ociepleniu zużyliśmy / zmarnowaliśmy 50/50. Ale podobnie jak poprzednio, im dłużej mieliśmy w ciągu dnia (robi się coraz bardziej ruchliwie w ciągu dnia), zaczęło wracać do obecnego poziomu: 30/70, a zmarnowane wciąż rośnie. Poza tym wciąż nie wiem, skąd pochodzi „zmarnowany”. Widzę tę płytę:
**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
Nie jest pełny, nie ma eksmisji, ale marnuje 117,3 MB. Szybka kalkulacja, którą zrobiłem (popraw mnie, jeśli się mylę) to:
- poprzednia płyta ma rozmiar fragmentu 328, więc najgorszy przypadek jest wypełniony fragmentami 329 bajtów.
- oznacza to, że marnuje 167 bajtów na wykorzystaną porcję = 12942834 bajtów = 12,3 MB
Skąd więc wzięło się pozostałe 105 MB zmarnowanych ? To większy brat tuż obok wygląda tak:
**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
Odpowiedzi:
Minęło rok od tego pytania i nie wiem, czy znalazłeś odpowiedź, ale powiem, że twoje postrzeganie „zmarnowanego” jest złe.
Zmarnowana pamięć jest przydzielana w pamięci, więc nie może być używana przez inną aplikację, ale nadal jest dostępna do pamięci memcached.
Aby uprościć wyjaśnienie, załóż, że masz pamięć podręczną z 3 MB pamięci RAM z 3 płytami:
Wykonaj pojedynczy „zestaw” o rozmiarze 10k. W swoich statystykach (z grubsza) zobaczysz, że masz:
Wynika to z faktu, że Memcached przydzielił pojedynczy fragment z „klasy płyty 1”, a 99% pamięci dla tej płyty jest „zmarnowane”, a 1% jest „wykorzystane”. Nie oznacza to, że płyta i pamięć przydzielona dla tej płyty zniknęły.
Wykonaj kolejny pojedynczy „zestaw” o rozmiarze 10k. Tym razem zobaczysz:
więc teraz używasz 2 na 100 przydzielonych porcji w płycie 1, statystyki „zmarnowane” spadły, a statystyki używane wzrosły.
Nie ma nic złego w tym, że użyty% + zmarnowany% jest równy 100%. Nie oznacza to, że nie ma już więcej pamięci, oznacza to po prostu, że przydzielono co najmniej jeden fragment z każdej płyty.
Aby zobaczyć ten problem, „zestaw” o rozmiarze 100k i kolejny o rozmiarze 1000k
Teraz zobaczysz
źródło
Prawdopodobnie masz bardzo dużą liczbę bardzo małych obiektów. Zwykle najmniejsza płyta zawiera 104-bajtowe wpisy. Jeśli masz wiele wpisów, które odwzorowują tylko jedną liczbę całkowitą na drugą, możesz zmarnować nawet 85%.
Informacje o tym, jak obejść ten problem, można znaleźć w artykule Memcached dla małych obiektów .
źródło
-f 1.5 -I 2800
może pomóc.-I 2800
oznacza to 2800 KB, w przeciwieństwie do domyślnego 1M?Miałem ten problem i przeniosłem się z Memcached na Redis (bez zapisywania na dysku). Wiem, że może to nie być możliwe, ale możesz wypróbować to jako opcję i pilnować fragmentacji pamięci. Możesz nawet włączyć trwałość, aby naprawić problemy ze „starą pamięcią podręczną” przy ponownym uruchomieniu.
źródło