Команда `drush cc all` занимает слишком много времени, что я могу сделать?

12

На моем участке drush cc allбегать больше 4 минут. На сайте БД находится несколько ГБ. Однако я не вижу четкой причины того, почему это занимает слишком много времени. Что я могу сделать, чтобы найти горлышко бутылки?

AWM
источник
Проверьте первый журнал запросов mysql: drupal.stackexchange.com/questions/75629/…
AgA
У тебя работает cron?
mpdonadio
Да, у меня работает cron. Сайт медленный в целом. Так много унаследованного кода, который не стоит пересматривать.
AWM
Я согласен с @MPD здесь, я не думаю, что это связано с памятью. MySQL также является лишь одной из возможных причин. Есть только один способ узнать это, и это профилировать его. Самый простой способ сделать это - использовать расширение xhprof и devel, которое также работает с drush (используйте -d, чтобы увидеть ссылку на отчет). Я предполагаю, что существует ряд проблем. Типичная проблема, если сайт работает медленно по всем запросам, не хватает модулей, см. Drupal.stackexchange.com/questions/724/why-is-drupal-7-so-slow . Представления также имеют некоторые серьезные проблемы с производительностью кэшей, см. Drupal.org/node/1944674 .
Бердир
Спасибо, я подумал, что мне нужно выполнить профилирование, но в случае с базой кода drupal всегда трудно определить узкое место. Хотя я и сказал, что сайт медленный, он не слишком медленный и не всегда пропорционален.
AWM

Ответы:

6

Сама очистка кеша не занимает много времени, так как она просто усекает кеш таблицы. Больше всего времени занимает перестройка реестра кеша после этого. Обычно это реестр тем, который сканирует все новые хуки и все ваши папки Drupal на наличие новых файлов шаблонов, система, которая сканирует файлы на наличие новых модулей и файлов классов и т. П.

Вы всегда можете очистить определенный кеш, указав drush cc theme-registryили любой другой.

Настоятельно рекомендуется использовать механизм кэширования PHP (например, OPCache, XCache и т. Д.) Для ускорения обработки. И кэш на основе памяти, чтобы заменить интенсивное использование таблиц SQL (например, memcached или redis), поэтому очистка кэша не займет времени, просто очистив кэш (например, echo flush_all > /dev/tcp/127.0.0.1/11211в Bash).

В качестве альтернативы вы всегда можете очистить кеш вручную , например:

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

Отладка

Чтобы проверить, что именно занимает больше всего времени, вам нужно отладить / профилировать его (например, XDebug, XHProf, phpdbg, dtrace).

В OS X / Unix это может быть достигнуто с помощью dtrace(после запуска drush):

sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'

В Linux используйте strace, например,

strace -e trace=sendto,recvfrom -s1000 -p $(pgrep php)

Для того, чтобы искать какие - то конкретные вещи, попробуйте добавить , например: strace ... 2>&1 | grep -C5 UPDATE.

kenorb
источник
5

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

Если ваш сайт работает под управлением Linux, запустите top (из вашей оболочки) и нажмите shift-M, чтобы отсортировать список процессов по используемой памяти. Затем запустите операцию очистки кэша из другого терминала. Вы должны увидеть, как mysql и apache поднимаются на вершину списка. Вы сможете увидеть, какой процент общей памяти использует каждый из этих процессов и сколько свободной памяти используется. Если у вас большой объем виртуального пространства, но все ваше физическое ОЗУ исчерпано, эта операция может привести к сбою памяти виртуальной машины, что может сократить время выполнения до малой доли от того, что обычно есть.

Однажды я запустил сайт Drupal со средним трафиком на коробке без достаточной памяти для поддержки установки. Когда я запустил очистку кеша на несвязанном сайте с низким трафиком, перестройка кеша выдвинула систему за пределы своего предела, и все почти заблокировалось. Таким образом, общее поведение системы здесь важно; Вот почему простые инструменты, такие как «top», удобны для начала.

greg_1_anderson
источник
Спасибо, я думаю, что основная причина в том, что сайт уже давно работает, база данных немного велика, и код ужасно нуждается в перефакторинге. Например, операция node_delete занимает около 3 секунд. Я думаю, что предоставление слишком большого количества памяти может быть излишним, вы согласны?
AWM
У меня есть это на моей машине, и это также медленно. Я удвоил объем памяти, до 1 ГБ, и рассчитал время `time drush cc all`. Не намного лучше, только получил 4 с быстрее.
AWM
1
Да, если весь сайт работает медленно, даже с большим объемом памяти, тогда cc не проблема; вам придется сделать более общее профилирование.
greg_1_anderson
Кроме того, если сайт действительно старый и нуждается в обновлении, рассмотрите возможность восстановления с нуля с использованием новых модулей и используйте переход с друпала на друпал ( drupal.org/project/migrate_d2d ), чтобы переместить ваш контент.
greg_1_anderson
2

Я собираюсь не согласиться (несколько) с @ greg_1_anderson здесь.

Если система не падает полностью во время cc all, то я не думаю, что у вас есть общие проблемы с памятью. Когда серверу LAMP не хватает памяти, он нажмет swap. Активный сервер, выполняющий своп, вызовет обилие вредоносности. Процессы httpd начнут складываться из-за замедления системы (своп делает работу системы очень медленной), что приведет к большему количеству подкачки и т. д. На сайтах, где я видел это, я увидел бы, что загрузка процесса достигла 100, и тонна активных процессов httpd.

Если ваша система в конечном итоге возвращается, то я думаю, что вы плохо настроены. drush cc allприведет к большому количеству обращений к базе данных, поэтому я думаю, что это показывает проблему больше. Мое предложение будет запускать mysqltuner на сайте. Если у вас есть база данных объемом несколько ГБ, я предполагаю , что ваш innodb_buffer_pool_sizeразмер даже удаленно не измерен правильно, а ваш экземпляр MySQL не работает. Я бы также исследовал альтернативный серверный кеш, чтобы уменьшить размер базы данных.

mpdonadio
источник
Спасибо, drupal используется только для использования в редакциях, в которых есть служебный слой с лаковым покрытием. Теперь пользователи попадают в друпал. Я просто хочу выяснить, что происходит, потому что я думаю, что есть узкое место. Я думаю, что мой лучший выбор - включить медленный лог mysql и следить за БД. А затем сделайте профилирование с помощью
xdebug
SHOW FULL PROCESSLIST расскажет вам, что происходит без необходимости использовать медленный журнал запросов (и так без перезапуска сервера). Смотрите также другой ответ для mytop.
Крис Берджесс
1

Это может быть ваша среда хостинга. Вы имеете в виду локальную настройку или хостинг на виртуальном хостинге или VPS / сервер?

  • среда размещения - если вы используете общий веб-хостинг, объем памяти, который может использовать Drupal / drush, будет ограничен, см. https://drupal.org/node/207036.
  • максимальное время выполнения - должно быть увеличено
geekgirlweb
источник
Drush обычно не ограничен max_execution_time. Вы можете сделать, drush php-eval "print ini_get('max_execution_time');"чтобы перепроверить, хотя.
mpdonadio
1

Это не полное решение, просто еще один инструмент, помогающий определить источник ваших задержек.

Помимо использования topдля мониторинга процессов, вы можете найти вывод mytopинформации. (Другие ответы выше предполагают MySQL, но если вы используете другой бэкэнд БД, вам придется поменять mytop на эквивалентный инструмент.)

mytopпросто выполняет MySQL SHOW FULL PROCESSLISTв цикле и показывает, какие запросы выполняются (что занимает много времени). Если очистка кеша занимает много времени на очистку той или иной таблицы, вы увидите, что именно здесь удерживает. Если у вас нет доступа к установке mytop, просто сделайте грубую версию в вашей оболочке -

while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done

Если задержка не связана с запросами MySQL, то этот инструмент может по крайней мере подтвердить это для вас.

Крис Берджесс
источник
1

Я обнаружил, что запись в блоге под названием « Ускорение очистки кэша в Drupal 7» очень полезна для точного определения того, какая часть процесса очистки кэша замедляет процесс. Вопросы , он указует в особенности модуль и модуль сущности апи воздействовал мой сайт, но этот процесс подробно в посте также помог мне отследить проблемы , которые мы сталкивались в основном Drupal и точки останова модуля .

На прохождение этого процесса уходит некоторое время, но это помогло мне сократить очистку кэша с нескольких минут до минуты.

Мэтт В.
источник