Сохраняющие память стратегии кэширования для больших сайтов?

Один из моих сайтов Drupal 7 имеет тысячи полей, множество типов контента, более 25 просмотров и сотни (в скором времени тысячи) типов профилей. Из-за этого я использую основной патч, который лучше кэширует информацию об объекте объекта (http://drupal.org/node/1040790) и версию -dev Views, которая лучше кэширует представления по показам (вместо того, чтобы иметь один ОГРОМНЫЙ просматривает строку кеша со всеми представлениями в ней).

Это помогло большинству страниц на сайте загрузиться с использованием 20-30 МБ ОЗУ, а не 160 Мбайт + (вместо того, чтобы вытаскивать строки таблицы cache_ * для полей и просмотров, которые были 10 МБ +, патчи помогают хранить данные кэша намного больше эффективный).

Это приводит к проблеме, однако, в том, что для восстановления кэша требуется действительно долгое время . Обычно больше минуты или двух. И за это время Drupal просто не будет загружать какие-либо страницы (поскольку кэши, которые он пытается прочитать, еще не созданы, другие запросы должны ждать).

Во время циклов с низким уровнем трафика это не имеет большого значения; сто или около того пользователям просто придется подождать минуту до загрузки страницы. Но во время циклов с высоким трафиком сервер Apache начинает сходить с ума, с 40-кратной загрузкой процессора, и память быстро заполняется, потому что все рабочие потоки сидят в ожидании и максимизируют их память, вызывая обмен. Это своего рода смертельная спираль. Перезагрузка httpd очистит все, но потребуется 5-10 минут, чтобы все стало нормально.

Моя цель - сделать так, чтобы очистка кеша не приводила сайт на колени. Например, если я использую функции очистки кеша admin_menu (например, «CSS и JS», затем «Меню», затем «Реестр тем» и т. Д.), Все идет гладко, пока я не нажму «Страница и еще». Вот когда сбрасывается кеш просмотров (очень интенсивная работа с процессором и базой данных с количеством просмотров, которые необходимо кэшировать), и когда кеш информации поля сбрасывается (что также сильно зависит от ЦП и базы данных на этом сайте).

Итак ... мои вопросы /идеи:

  • Использование drush и /или других сценариев оболочки, возможно ли, чтобы я очистил кеши более разумным способом, чем «взломать все кеши сразу и надеяться на чистую перестройку»?
  • Могу ли я блокировать HTTP-запросы, пока происходит очистка кеша, поэтому apache не забивается связью запросов с печатью кеша?
  • Если я могу очистить кеши вне запроса Drupal /normal httpd, я мог бы предположительно установить более высокий PHP memory_limit для операции очистки кеша и отменить мой универсальный memory_limit (теперь установленный на 256 МБ, в случае, если какая-либо отдельная потребность в httpd для очистки кешей ...).

В принципе: есть ли разумный и изящный способ очистить все кеши с Drupal, кроме простого нажатия кнопки в пользовательском интерфейсе или с помощью drush cc all ?

[ Изменить для пояснения . Основная проблема, с которой я столкнулся, - это перестройки кэша , которые (a) занимают некоторое время и (б) блокируют все остальные запросы до тех пор, пока перестроения завершены. Я хотел бы найти способ сделать это, чтобы перестроения не были столь же смертоносными во время большого трафика.]

29 голосов | спросил geerlingguy 8 42012vEurope/Moscow11bEurope/MoscowThu, 08 Nov 2012 20:37:40 +0400 2012, 20:37:40

4 ответа


8
  

Есть ли разумный и изящный способ очистить все кеши с Drupal, кроме простого нажатия кнопки в пользовательском интерфейсе или использования drush cc all?

Этот файл кеша делает это. Это зависит от правила. Например, вы можете настроить правило для очистки определенного вида, когда узел типа «x» был добавлен или обновлен. Оформляйте документы для более подробной информации.

Также обратите внимание на модуль изящного модуля - еще не пробовал, но выглядит интересно.

ответил MotoTribe 8 42012vEurope/Moscow11bEurope/MoscowThu, 08 Nov 2012 21:26:52 +0400 2012, 21:26:52
1

Основная проблема заключается в том, что вы используете MySQL для хранения данных кеша - для сайтов с высокой нагрузкой это очень неэффективное решение.

Я советую использовать Memcache . Это значительно увеличит производительность системы кеша и даст вам 2 больших преимущества:

  1. Memcache намного быстрее работает для операций чтения и записи, которые MySQL - все операции кэширования (и полная перестройка кэша) будут работать быстрее.
  2. Поскольку данные кэша не хранятся в БД больше - очистка кеша не будет блокировать любые другие запросы MySQL.

Вот пример Конфигурация Memcache для Drupal 7.

ответил Eugene Fidelin 14 32012vEurope/Moscow11bEurope/MoscowWed, 14 Nov 2012 13:13:19 +0400 2012, 13:13:19
0

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

Недостаток: в зависимости от того, сколько секунд /минут простоя производственного сервера против ваших настроек тайм-аута VCL, Varnish может обновиться в течение этого времени, и вы увидите экран ошибки Varnish 503.

Но этот подход вместе с Redis или Memcache может помочь.

ответил mulderjoe 8 J000000Wednesday15 2015, 19:40:17
0
  

Используя drush и /или другие скрипты оболочки, возможно ли, чтобы я очистил кеши более разумным способом, чем «взломать все кеши сразу и надеяться на чистую перестройку»?

Если вы не хотите взломать все кеши, используйте: drush cc type_of_cache , чтобы очистить конкретный или определить свой собственный.

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

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

Если вы используете memcached (синтаксис Bash), попробуйте:

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

Могу ли я блокировать HTTP-запросы во время очистки кеша, поэтому apache не забивается связкой запросов на печать с кешем?

Включить режим обслуживания ( drush -y vset maintenance_mode 1 ), чтобы люди не обращались к сайту. Или настроить front-end для перенаправления в другом месте (например, в Varnish, перенаправить в Apache или изменить .htaccess ).

  

Если я могу очистить кеши вне запроса Drupal /normal httpd, я мог бы предположительно установить более высокий PHP memory_limit для операции очистки кеша и отменить мой универсальный memory_limit (теперь установлено значение 256 МБ, в случае, если какой-либо отдельный поток httpd должен очистить кеши ...).

Очистка кеша не занимает больше памяти, но восстановление кэша после очистки займет больше. Вы всегда можете разогревать кеши, запуская cron или открывая любую страницу, например.

  time php -n -d memory_limit = -1 time $ (который drush) cc реестр
PHP_OPTIONS = '- d memory_limit = "2G"' drush cron
php -d memory_limit = 1G ./scripts/drupal.sh http: //localhost /
 

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

ответил kenorb 24 MarpmThu, 24 Mar 2016 19:32:36 +03002016-03-24T19:32:36+03:0007 2016, 19:32:36

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132