Стратегії очищення кеш-пам'яті для великих сайтів?


30

Один з моїх сайтів Drupal 7 має тисячі полів, купу типів вмісту, більше 25 переглядів та сотні (незабаром стане тисячами) типів профілів. Через це я використовую основний патч, який краще кешує інформацію про сутність сутності (http://drupal.org/node/1040790), і -dev версію Views, яка краще кешує перегляди за допомогою відображення (замість того, щоб мати один ВЕЛИЧИЙ рядок кешу переглядів із усіма даними переглядів у ньому).

Це допомогло більшості сторінок на сайті завантажувати 20-30 МБ оперативної пам’яті, а не 160 МБ + (замість того, щоб підтягувати рядки таблиці кеш_ * для полів та переглядів, що були 10 МБ +, виправлення допомагають зберегти дані кеш_ * набагато ефективніше).

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

Під час циклів з низьким трафіком це не велика справа; Сто або більше користувачів просто доведеться зачекати хвилину, перш ніж сторінка завантажиться. Але під час циклів з високим трафіком сервер Apache починає з глузду із завантаженням процесора 40+, і пам’ять швидко заповнюється, тому що всі робочі потоки сидять в очікуванні і збільшують максимум пам'яті, викликаючи заміну. Це свого роду спіраль смерті. Перезапуск httpd очистить речі, але потрібно 5-10 хвилин, щоб вони повернулися до норми.

Моя мета - зробити так, щоб кеш-пам'ять очищалася, не ставила сайт на коліна. Для одного, якщо я використовую індивідуальні функції очищення кеша адміністратора (наприклад, "CSS та JS", потім "Меню", потім "Реєстр тем" тощо), все пройде гладко, поки я не натиснув опцію "Сторінка та інше". Ось тоді кеш переглядів скидається (дуже керована процесором та базами даних робота з кількістю переглядів, які потрібно кешувати), і коли кеш інформаційного поля скидається (що також є процесором та інтенсивним використанням баз даних на цьому сайті).

Отже ... мої запитання / ідеї:

  • Чи можна за допомогою барабанного та / або іншого сценарію оболонки очищати кеші більш розумним способом, ніж "вибух всіх кешів відразу і сподіваюся на чисту перебудову"?
  • Чи можу я заблокувати запити http, поки відбувається очищення кешу, щоб апаш не забився купою запитів із штампуванням кеша?
  • Якщо я можу очистити кеші за межами запиту Drupal / звичайний httpd, я, мабуть, можу встановити більш високий PHP memory_limit для кеш-операції та відключити свій універсальний memory_limit (зараз встановлено 256MB, якщо будь-який окремий потік httpd потребує очищення кеш-пам'яті ...).

В основному: Чи є якийсь розумний і витончений спосіб очистити всі кеші з Drupal, крім того, щоб просто натиснути кнопку в інтерфейсі або використовувати drush cc all?

[ Редагувати для уточнення : Основна проблема, яку я маю, - це відновлення кешу , яке (a) потребує певного часу та (b) блокування всіх інших запитів до завершення відновлення. Я хотів би знайти спосіб зробити так, щоб відбудови не були настільки смертельними в часи великого руху.]


2
Цікаве запитання. Якщо ви відключите кешування, чи ефективність вашого сайту достатня? IOW, Ви оптимізували Apache / PHP / MySQL для запуску, а також він може включати кеш? Очевидно, я не бачив вашої системи, але встановлення apc.stat = 0 і переконайтеся, що у вас є достатня кількість пам'яті для APC, допоможуть зменшити використання диска. Використання mysqltuner.pl також дасть вам вказівку, чи є MySQL вузьким місцем. Потім ви можете увімкнути кешування та налаштувати (це збільшить деяке використання БД, тому вам може знадобитися коригування параметрів MySQL).
mpdonadio

Я використовую Redis (подібний до memcache), щоб зберегти таблиці кеша переглядів у пам'яті. Це різко покращило навантаження. Сподіваємось на функцію "кеш переглядів за допомогою дисплея" в стабільному випуску, що має багато сенсу.
uwe

@MPD - відключення кешування швидко знищить весь сайт; зазвичай 100-500 аутентифікованих користувачів, а деякі розділи сайту досить важкі. Найбільшою проблемою для мене є не кеш-читання (я експериментував із цим кешеним користувачем Memcached, Redis та APC), а з відновленням кешу, що дуже інтенсивно працює на процесорі.
geerlingguy

В ідеалі ви хочете використовувати старі дані кешу під час перебудови нового кешу. Це правильно?
mikeytown2

@ mikeytown2 - правильно - це було б ідеально.
geerlingguy

Відповіді:


9

Чи є якийсь розумний і витончений спосіб очистити всі кеші за допомогою Drupal, крім того, щоб просто натиснути кнопку в інтерфейсі або використати drush cc all?

Модуль кеш-дій робить це. Це залежить від правила. Для прикладу, ви можете встановити правило, щоб очистити певний вигляд, коли вузол типу "х" додано чи оновлено. Ознайомтеся з документами для отримання більш детальної інформації.

Також погляньте на витончений модуль кешу - ще не пробували, але виглядає цікаво.


Я вже використовую drush cc [type]для очищення певного кешу (подібний до дій кешу), але мені більше цікаво знайти способи очищення кешу більш витончено і переконатися, що інші потоки httpd не вбивають сервер Apache.
geerlingguy

1
схоже, що "drush cc" очистить усі кеші переглядів. За допомогою кеш-дій ви можете просто очистити певний вид або відображення. Напевно, помилка у версії Dev Views переглядає, інакше не знадобиться ні хвилини, ні двох, щоб відновити кеші. У вас така ж проблема із використанням переглядів 7.x-3.5? Також погляньте на drupal.org/project/cache_graceful - ще не пробували, але виглядає цікаво
uwe

Dev Views розбиває вікна відображення у власних рядках кешу, щоб допомогти з ефективністю читання кеша. Це означає, що перегляди витрачають, ймовірно, в 5 разів більше часу на створення кешу (але це допомагає зменшити використання пам'яті під час читання кеш-пам'яті!).
geerlingguy

Чи можете ви додати інформацію про Cache Graceful до своєї оригінальної відповіді? Я прийму це, оскільки конкретний модуль трохи допомагає (але не вирішує проблему повністю для мене). Думаю, мені доведеться трохи перестановити сайт, щоб використовувати менше полів та типів сутності, щоб справді виправити мою проблему.
geerlingguy

добре. Мені буде цікаво дізнатися про ваш досвід роботи з cache_graceful. Яку частину не виправили?
uwe

2

Основна проблема полягає в тому, що ви використовуєте MySQL для зберігання даних кешу - для сайтів з високим навантаженням це дуже неефективне рішення.

Я радимо замість цього використовувати Memcache . Це різко збільшить продуктивність кеш-системи та дасть вам 2 чудових переваги:

  1. Memcache набагато швидше для операцій з читання та запису, що MySQL - усі операції кешування (і відновлення повного кешу) будуть працювати швидше.
  2. Оскільки дані кешу більше не зберігаються в БД - очищення кеша не заблокує жодних інших запитів MySQL.

Ось приклад конфігурації Memcache для Drupal 7.


Я використовував memcached та APC обидва, різними способами, і хоча вони дуже допомагають зчитуванням кеш-пам'яті, головна проблема, яку я маю, - це власне відновлення; база даних майже нічого не робить, поки веб-сервер штампує кеш-пам'ять під час процесу (дуже повільної / тривалої) перебудови.
geerlingguy

APC і Memcached роблять різні речі. Я думаю, що правильна конфігурація Memcached допоможе вам. До речі, якщо ваш сайт в основному відвідують анонімні користувачі - ви можете використовувати Varnish. У цьому випадку Varnish буде використовувати власну кеш-систему, і Apache не буде виконуватися для анонімних запитів.
Євген Фіделін

На сайті майже 100% аутентифікований трафік, інакше я б розглядав можливість використання Varnish. Я можу в цей момент заглянути в модуль Cache Graceful.
geerlingguy

0

Чи можна за допомогою барабанного та / або іншого сценарію оболонки очищати кеші більш розумним способом, ніж "вибух всіх кешів відразу і сподіваюся на чисту перебудову"?

Якщо ви не хочете обробляти всі кеші, використовуйте: drush cc type_of_cacheдля очищення конкретного або визначте власний.

Альтернативно очистити всі таблиці, схожі на кеш, вручну, наприклад

echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v 

Якщо ви використовуєте запам’ятовуваний (синтаксис Bash), спробуйте:

pgrep memcached && echo flush_all > /dev/tcp/127.0.0.1/11211

Чи можу я заблокувати запити http, поки відбувається очищення кешу, щоб апаш не забився купою запитів із штампуванням кеша?

Увімкніть режим обслуговування ( drush -y vset maintenance_mode 1), щоб запобігти доступу людей на сайт. Або налаштувати передній кінець для переадресації кудись інше (наприклад, на лак, перенаправлення в Apache або зміну .htaccess).

Якщо я можу очистити кеші за межами запиту Drupal / звичайний httpd, я, мабуть, можу встановити більш високий PHP memory_limitдля кеш-операції, і відключити свій універсальний memory_limit(зараз встановлено 256 Мб, якщо будь-який окремий потік httpd потребує очищення кешів.) .).

Очищення кешу не потребує більше пам’яті, але відновлення кешу після очищення займе більше. Ви завжди можете розігріти кеші, запустивши cron або відкривши будь-яку сторінку, наприклад

time php -n -d memory_limit=-1 time $(which drush) cc registry
PHP_OPTIONS='-d memory_limit="2G"' drush cron
php -d memory_limit=1G ./scripts/drupal.sh http://localhost/

Вкажіть, -nщоб ігнорувати php.iniобробку, що може додатково прискорити процес очищення кешу.


-1

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

Мінус: залежно від того, скільки секунд / хвилин простою виробничого сервера та налаштувань часу очікування VCL, лак може оновитись протягом цього часу, і ви побачите екран помилки Varnish 503.

Але такий підхід разом з Redis або Memcache може допомогти.


Це питання стосується лише внутрішніх кешів Drupal; відновлення кешів Drupal зайняло назавжди, і додаткові шари кешування за межами / перед Drupal не допоможуть значно відновити фактичну кеш-дані (окрім того, щоб вивантажити деякий трафік, який веб-серверу інакше потрібно було б утримати трохи під час кешування перебудовуються).
geerlingguy

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