Несподівана (?) Висока "витрачена" пам'ять у запам’ятовується


18

Оновлено, дивіться внизу довге (вибачте) питання.

Дивлячись на нашу складну статистику, я думаю, що знайшов проблему, про яку раніше не знав. Здається, у нас є дивно велика кількість витраченого простору. Я перевірив у phpmemcacheadmin на зміну, і виявив, що це зображення дивиться на мене:

графічний розмір кеш-пам'яті

Зараз у мене склалося враження, що найгіршим сценарієм буде те, що є 50% відходів, хоча я перший визнаю, що не знаю всіх подробиць. Я прочитав - серед інших - цю сторінку, яка справді дещо стара, але так це наша версія запам’ятовування. Я думаю, я розумію, як працює система ( наприклад ). Я вірю, але мені важко зрозуміти, як ми могли дістати до 76% витраченого простору.

Швидкість виселення, яку показує phpmemcacheadmin, є 2 ev/s, тому тут є певна проблема.

  • Основне питання: що я можу зробити, щоб це виправити . Я міг би кинути на нього більше пам’яті (на мою думку, є додаткова кількість доступних), можливо, я повинен поспілкуватися з конфігурацією плит (це можливо навіть з цією версією?), Можливо, є й інші варіанти? Оновлення згаданої версії - це не швидко доступний варіант.

  • З другого питання, з цікавості, звичайно, якщо очікується швидкість 75% (і зростаючого) витраченого простору, і якщо так, то чому.

Система: На даний момент я не можу нічого робити, я знаю, що запам’ятована версія не найновіша, але це картки, які мені роздали.

  • Запам'ятоване 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

Як відповідь на відповідь @DavidSchwartz: ось статистичні дані про плити, які виробляє phpmemcacheadmin: (більше плит btw, ніж цих)

(Тут я також трохи пізніше вставив статистику у текстовому форматі )

Деталі плит

ОНОВЛЕННЯ

Я перезапустив демон з -f 1,5, і це виглядало дуже добре. Після деякого прогріву ми використали / витратили 50/50. Але, як і раніше, чим довше у нас було вдень (воно стає більш зайнятим протягом дня), воно почало падати назад до того, що є зараз: 30/70, а витрачається все ще зростає. Крім того, я досі не знаю, звідки походить "даремно". Я бачу цю плиту:

**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

Він не повний, він не виселяється, але витрачає 117,3 Мбіт. Швидкий розрахунок, який я зробив (виправте мене, якщо я помиляюся):

  • попередня плита має розмір шматка 328, тому в гіршому випадку ця плита заповнена 329 байтними шматками.
  • це означає, що він витрачає 167 байт на використаний фрагмент = 12942834 байт = 12,3 Мб

Тоді звідки взялися інші 105 Мб ? Більший брат прямо поруч виглядає так:

**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

Проблема полягає в тому, що в інших плитах є багато невикористаного простору, проте плита 3 на 100% повна і спостерігається виселення.
Девід Шварц

Хороший момент, це пояснило би виселення, хоча я не дуже впевнений, як обчислюється «витрачений» номер. Якщо на плити 8 використовується лише 13,9%, то напевно там має бути трохи вільного місця?
Нанна

Так, у цій плиті є вільний простір. Але це не допомагає, якщо об'єкти, які виселяються, не потрапляють у цю плиту.
Девід Шварц

Це я зрозумів з вашої відповіді, але чому немає вільного місця в списку? Має бути якась частина білого пирога-діаграми (як це є на моїй тестовій установці), якщо ще залишилося місця, принаймні, це я зрозуміла
Нанна

Відповіді:


10

Минув рік з цього питання, і я не знаю, чи ви знайшли свою відповідь, але я скажу, що ваше сприйняття "даремно" неправильне.

Втрачена пам'ять виділяється в пам'яті, тому її не можна використовувати іншою програмою, але вона все ще доступна для запам’ятовування.

Для спрощення пояснення припустімо, що у вас є пам’ять з 3 Мб оперативної пам’яті з 3 плитами:

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

Виконайте один "набір" розміром 10 к. Ви побачите у статистиці (приблизно), що у вас є:

0.03% used
66.6% free
33% wasted

Це пояснюється тим, що вилучений виділений один фрагмент з "класу плит 1", і 99% пам'яті для цієї плити "витрачено", а 1% "використовується". Це не означає, що плита і пам'ять, виділена для цієї плити, вже немає.

Виконайте ще один сингл "набір" розміром 10 к. Цього разу ви побачите:

0.06% used
66.6% free
32.7% wasted

тож зараз ви використовуєте 2 із 100 виділених фрагментів у плиті 1, "втрачені" статистичні дані випали, а використана статистика збільшується.

Немає нічого поганого, коли використаний% + витрачений% дорівнює 100%. Це не означає, що у вас більше не залишилося пам’яті, це просто означає, що ви виділили щонайменше один шматок з кожної плити.

Щоб побачити цю проблему, "набір" розміром 100k та інший розміром 1000k

Тепер ви побачите

36.6% used
   0% free
63.3% wasted

Це звучить непогано! Чи є у вас якесь посилання, щоб підтвердити це? Якщо так, це означає, що мій memcache-сервер працював краще, ми вважаємо :). Якщо я правильно вас зрозумів, це те, що витрачені кошти були виділені, але все ще доступні для використання. Це означає, що якщо нічого безкоштовного, ви не можете виділити більше плит, але це не означає, що у вас є проблеми?
Нанна

1
Я не маю посилання на голові, але перевірити себе дуже просто. Натисніть на командний рядок і створіть невеликий зразок сервера, щоб перевірити, як він працює. Ви можете використовувати опцію -vv для багатослівних налагоджувальних повідомлень, яка покаже вам початкові створені плити, тобто: "memcached -vv -p 11500 -m 3 -n 10000 -f 10" створить вам 3 плити з розмірами шматок 10k 100k та 1000k. І продовжуйте видавати "набори" і бачити, як ваші витрачені / використані статистичні дані змінюються точно так, як я описав вище.
калі

гарна думка. тепер, щоб дізнатися, як я можу отримати додаткову увагу до цієї відповіді для вас :)
Nanne

6

Напевно у вас дуже велика кількість дуже маленьких предметів. Зазвичай найменша плита містить 104-байтні записи. Якщо у вас багато записів, які відображають лише одне ціле число на інше, ви можете отримати відходи до 85%.

Інформацію про те, як налагодити це, ви можете знайти в статті « Пробудовані для дрібних предметів» .


Якщо я правильно прочитав сторінку статистики, це не так. Більшість відходів знаходиться на плиті з 480,0 байт-шматками. Дозвольте перевірити, чи можу я показати деякі статистичні дані ...
Нанна,

О, тоді це нормально і нормально, нічого хвилюватися. Зараз там просто менше даних. (Зауважте, наприклад, що ця плита використовується лише 14%.)
Девід Шварц

Але як нормально витрачати 75%? Чи включає це число невикористаний простір? Я б очікував, що це буде зараховано як "вільне". Також ми бачимо збільшення витраченого часу // зменшення використовуваної пам’яті протягом дня, поки сайт стає більш зайнятим. Це і той факт, що в нас є виселення, змушують мене замислитися, що можна зробити.
Нанна

Мало меншої кількості плит може допомогти уникнути проблеми занадто великої кількості пам'яті, що застрягла в неправильній плиті. Наприклад, -f 1.5 -I 2800може допомогти.
Девід Шварц

Сторінка "man" - це не надто ясно:, -I 2800це означає 2800K, на відміну від 1М за замовчуванням?
Нанна

-1

У мене виникла ця проблема, і я перейшов з memcached до redis (без збереження на основі диска). Я знаю, що це може бути неможливим, але ви можете спробувати це як варіант і стежити за фрагментацією пам'яті. Ви навіть можете ввімкнути наполегливість, щоб виправити проблеми зі старим кешем при перезапуску.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.