Команда `drush cc all` займає занадто багато часу, що я можу зробити?


12

На мінному майданчику працює drush cc allбільше 4 хвилин. ДБ сайту - кілька ГБ. Однак я не бачу чіткої причини, чому це забирає занадто багато часу. Що я можу зробити, щоб знайти шийку пляшки?


Перевірте перший журнал запитів mysql: drupal.stackexchange.com/questions/75629/…
AgA

У вас працює крон?
mpdonadio

Так, у мене працює крон. Сайт загалом повільний. Стільки застарілого коду, що не варто переоцінювати фактори.
awm

Я згоден з @MPD тут, я не думаю, що це пов'язано з пам'яттю. MySQL - це лише одна з можливих причин. Є лише один спосіб це дізнатися, і це профайл. Найпростіший спосіб зробити це за допомогою розширення xhprof та devel, який також працює з drush (використовуйте -d, щоб переглянути посилання на звіт). Моя здогадка полягає в тому, що існує ряд питань. Типова проблема, якщо на сайті повільно для всіх запитів відсутні модулі, див. Drupal.stackexchange.com/questions/724/why-is-drupal-7-so-slow . Перегляди також мають деякі основні проблеми з кешами, див. Drupal.org/node/1944674 .
Бердір

Дякую, я подумав, що мені доведеться займатися профілюванням, але у випадку з базою коду друпалу завжди важко точно визначити вузьке місце. Хоча я казав, що сайт повільний, він не надто повільний і натискає кубічний код, непропорційно повільніше.
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.


5

Якщо у вас дійсно велика база даних, і ваша система працює нормально, коли ви не робите кеш-пам'ять, ймовірно, у вас недостатньо пам'яті, щоб повністю підтримувати налаштування.

Якщо ваш веб-сайт працює у вікні Linux, запустіть 'top' (з оболонки) та натисніть shift-M, щоб сортувати список процесів за використаною пам'яттю. Потім запустіть операцію очищення кеш-пам'яті з іншого терміналу. Ви повинні побачити, що mysql і apache піднімаються на вершину списку. Ви зможете побачити, який відсоток загальної пам’яті використовує кожен із цих процесів та скільки вільної оперативної пам’яті. Якщо у вас є велика кількість віртуального простору, але вся фізична оперативна пам’ять вичерпана, ця операція може спричинити треш пам'яті VM, що може зменшити час вашого виконання до невеликої частини того, що це нормально.

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


Дякую, я думаю, що основна причина полягає в тому, що сайт існує деякий час, db трохи великий і код страшенно потребує повторного факторингу. Наприклад, операція node_delete займає близько 3 секунд. Я думаю, що занадто багато пам'яті може бути зайвим, ви згодні?
awm

У мене він є на своїй машині, і він також повільний. Я подвоїв пам'ять, до 1 ГБ і приурочив її до `time drush cc all`. Не набагато краще, лише швидше на 4 секунди.
awm

1
Так, якщо весь сайт весь час повільний, навіть з великою кількістю пам’яті, то в цьому не є проблема cc; вам доведеться зробити більш загальне профілювання.
greg_1_anderson

Крім того, якщо веб-сайт справді старий і потребує оновлення, подумайте про відновлення з нуля свіжих модулів та використовуйте міграцію «drugpal-to-drupal» ( drupal.org/project/migrate_d2d ) для переміщення вашого вмісту.
greg_1_anderson

2

Я не погоджуся (дещо) з @ greg_1_anderson тут.

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

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


Дякую, drupal використовується лише для редакторів, у яких є шар servie, у якому є лак. Зараз користувачі потрапляють до drupal. Я просто хочу розслідувати, що відбувається, тому що я думаю, що це вузьке місце. Я думаю, що найкраще зробити, щоб увімкнути повільний журнал mysql і відстежувати db. А потім зробіть кілька профілів за допомогою xdebug
awm

SHOW FULL PROCESSLIST підкаже вам, що відбувається без необхідності використання повільного журналу запитів (і так без перезавантаження сервера). Дивіться іншу відповідь також для mytop.
Кріс Берджесс

1

Це може бути ваше середовище веб-хостингу. Ви маєте на увазі локальне налаштування або щось хостинг на спільному хостингу або VPS / сервер?

  • середовище хостингу - якщо ви перебуваєте на спільному веб-хостингу, обсяг пам’яті, яку можуть використовувати Drupal / drush, буде обмежений див. https://drupal.org/node/207036
  • Максимальний час виконання - потрібно збільшити

звичайно барабан не обмежений 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 дуже корисне для того, щоб точно зменшити, яка частина процесу очищення кешу сповільнювала роботу. Проблеми, які він визначає в модулі функцій та модулі api сутності , впливали на мій сайт, але процес, детально описаний у публікації, також допоміг мені відслідковувати проблеми, з якими ми стикалися в ядрі Drupal та модулі зупинок .

Щоб пропрацювати процес, потрібен певний час, але це допомогло мені зменшити кількість кеш-пам’яті з декількох хвилин до менше хвилини.

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