На моем участке drush cc all
бегать больше 4 минут. На сайте БД находится несколько ГБ. Однако я не вижу четкой причины того, почему это занимает слишком много времени. Что я могу сделать, чтобы найти горлышко бутылки?
На моем участке drush cc all
бегать больше 4 минут. На сайте БД находится несколько ГБ. Однако я не вижу четкой причины того, почему это занимает слишком много времени. Что я могу сделать, чтобы найти горлышко бутылки?
Ответы:
Сама очистка кеша не занимает много времени, так как она просто усекает кеш таблицы. Больше всего времени занимает перестройка реестра кеша после этого. Обычно это реестр тем, который сканирует все новые хуки и все ваши папки 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
.
Если у вас действительно большая база данных, и ваша система работает нормально, когда вы не очищаете кеш, скорее всего, у вас недостаточно памяти для полной поддержки вашей настройки.
Если ваш сайт работает под управлением Linux, запустите top (из вашей оболочки) и нажмите shift-M, чтобы отсортировать список процессов по используемой памяти. Затем запустите операцию очистки кэша из другого терминала. Вы должны увидеть, как mysql и apache поднимаются на вершину списка. Вы сможете увидеть, какой процент общей памяти использует каждый из этих процессов и сколько свободной памяти используется. Если у вас большой объем виртуального пространства, но все ваше физическое ОЗУ исчерпано, эта операция может привести к сбою памяти виртуальной машины, что может сократить время выполнения до малой доли от того, что обычно есть.
Однажды я запустил сайт Drupal со средним трафиком на коробке без достаточной памяти для поддержки установки. Когда я запустил очистку кеша на несвязанном сайте с низким трафиком, перестройка кеша выдвинула систему за пределы своего предела, и все почти заблокировалось. Таким образом, общее поведение системы здесь важно; Вот почему простые инструменты, такие как «top», удобны для начала.
Я собираюсь не согласиться (несколько) с @ greg_1_anderson здесь.
Если система не падает полностью во время cc all
, то я не думаю, что у вас есть общие проблемы с памятью. Когда серверу LAMP не хватает памяти, он нажмет swap. Активный сервер, выполняющий своп, вызовет обилие вредоносности. Процессы httpd начнут складываться из-за замедления системы (своп делает работу системы очень медленной), что приведет к большему количеству подкачки и т. д. На сайтах, где я видел это, я увидел бы, что загрузка процесса достигла 100, и тонна активных процессов httpd.
Если ваша система в конечном итоге возвращается, то я думаю, что вы плохо настроены. drush cc all
приведет к большому количеству обращений к базе данных, поэтому я думаю, что это показывает проблему больше. Мое предложение будет запускать mysqltuner на сайте. Если у вас есть база данных объемом несколько ГБ, я предполагаю , что ваш innodb_buffer_pool_size
размер даже удаленно не измерен правильно, а ваш экземпляр MySQL не работает. Я бы также исследовал альтернативный серверный кеш, чтобы уменьшить размер базы данных.
Это может быть ваша среда хостинга. Вы имеете в виду локальную настройку или хостинг на виртуальном хостинге или VPS / сервер?
max_execution_time
. Вы можете сделать, drush php-eval "print ini_get('max_execution_time');"
чтобы перепроверить, хотя.
Это не полное решение, просто еще один инструмент, помогающий определить источник ваших задержек.
Помимо использования top
для мониторинга процессов, вы можете найти вывод mytop
информации. (Другие ответы выше предполагают MySQL, но если вы используете другой бэкэнд БД, вам придется поменять mytop на эквивалентный инструмент.)
mytop
просто выполняет MySQL SHOW FULL PROCESSLIST
в цикле и показывает, какие запросы выполняются (что занимает много времени). Если очистка кеша занимает много времени на очистку той или иной таблицы, вы увидите, что именно здесь удерживает. Если у вас нет доступа к установке mytop
, просто сделайте грубую версию в вашей оболочке -
while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done
Если задержка не связана с запросами MySQL, то этот инструмент может по крайней мере подтвердить это для вас.
Я обнаружил, что запись в блоге под названием « Ускорение очистки кэша в Drupal 7» очень полезна для точного определения того, какая часть процесса очистки кэша замедляет процесс. Вопросы , он указует в особенности модуль и модуль сущности апи воздействовал мой сайт, но этот процесс подробно в посте также помог мне отследить проблемы , которые мы сталкивались в основном Drupal и точки останова модуля .
На прохождение этого процесса уходит некоторое время, но это помогло мне сократить очистку кэша с нескольких минут до минуты.