Как я повысил устойчивость работы Друпала

Есть сайт на Друпал. Давно работает, не первый год. Вырос по размерам. Но в последнее время я начал замечать, что при сохранении новой ноды (страницы, подшивки) Друпал иногда выдает мне целую страницу ошибок:

Выглядит примерно так:

Warning: MySQL server has gone away query: INSERT INTO watchdog (uid, type, message, variables, severity, link, location, referer, hostname, timestamp) VALUES (1, 'php', '%message in %file on line %line.', 'a:4:{s:6:\"%error\";s:12:\"user warning\";s:8:\"%message\";s:105:\"Server shutdown in progress\nquery: DELETE FROM cache_menu WHERE cid LIKE 'links:book-toc-155:%'\";s:5:\"%file\";s:43:\"/home/afportal.ru/htdocs/includes/cache.inc\";s:5:\"%line\";i:175;}', 3, '', 'http://www.afportal.ru/node/1427/edit', 'http://www.afportal.ru/node/1427/edit', '93.85.64.145', 1235216680) in /home/afportal.ru/htdocs/includes/database.mysql.inc on line 128

Warning: MySQL server has gone away query: SELECT * FROM system WHERE type = 'theme' in /home/afportal.ru/htdocs/includes/database.mysql.inc on line 128

Warning: MySQL server has gone away query: SELECT data, created, headers, expire, serialized FROM cache WHERE cid = 'theme_registry:' in /home/afportal.ru/htdocs/includes/database.mysql.inc on line 128

Warning: MySQL server has gone away query: UPDATE cache SET data = 'a:155:{s:18:\"aggregator_wrapper\";a:7:{s:9:\"arguments\";a:1:{s:7:\"content\";N;}s:4:\"file\";s:39:\"modules/aggregator/aggregator.pages.inc\";s:8:\"template\";s:37:\"modules/aggregator/aggregator-wrapper\";s:4:\"type\";s:6:\"module\";s:10:\"theme path\";s:18:\"modules/aggregator\";s:11:\"theme paths\";a:1:{i:0;s:18:\"modules/aggregator\";}s:20:\"preprocess functions\";a:2:{i:0;s:19:\"template_preprocess\";i:1;s:38:\"template_preprocess_aggregator_wrapper\";}}s:27:\"aggregator_categorize_items\";a:7:{s:9:\"arguments\";a:1:{s:4:\"form\";N;}s:4:\"file\";s:39:\"modules/aggregator/aggregator.pages.inc\";s:4:\"type\";s:6:\"module\";s:10:\"theme path\";s:18:\"modules/aggregator\";s:8:\"function\" in /home/afportal.ru/htdocs/includes/database.mysql.inc on line 128

Warning: MySQL server has gone away query: INSERT INTO watchdog (uid, type, message, variables, severity, link, location, referer, hostname, timestamp) VALUES (1, 'php', '%message in %file on line %line.', 'a:4:{s:6:\"%error\";s:12:\"user warning\";s:8:\"%message\";s:105:\"MySQL server has gone away\nquery: SELECT menu_name FROM menu_links WHERE expanded != 0 GROUP BY menu_name\";s:5:\"%file\";s:42:\"/home/afportal.ru/htdocs/includes/menu.inc\";s:5:\"%line\";i:2011;}', 3, '', 'http://www.afportal.ru/node/1427/edit', 'http://www.afportal.ru/node/1427/edit', '93.85.64.145', 1235216681) in /home/afportal.ru/htdocs/includes/database.mysql.inc on line 128

Warning: MySQL server has gone away query: INSERT INTO watchdog (uid, type, message, variables, severity, link, location, referer, hostname, timestamp) VALUES (1, 'php', '%message in %file on line %line.', 'a:4:{s:6:\"%error\";s:12:\"user warning\";s:8:\"%message\";s:119:\"MySQL server has gone away\nquery: UPDATE variable SET value = 'a:0:{}' WHERE name = 'menu_expanded'\";s:5:\"%file\";s:47:\"/home/afportal.ru/htdocs/includes/bootstrap.inc\";s:5:\"%line\";i:509;}', 3, '', 'http://www.afportal.ru/node/1427/edit', 'http://www.afportal.ru/node/1427/edit', '93.85.64.145', 1235216681) in /home/afportal.ru/htdocs/includes/database.mysql.inc on line 128

.........................

Когда выдается такая страница, запрос по сохранению ноды выполняется не полностью. Приходится делать заново, причем иногда такая ошибка выскакивала по несколько раз подряд. Выборка данных проходит всегда нормально.

Что делать? Искал ответ на drupal.ru, ничего внятного не нашел. Стал переписываться с хостером. Разбирались почти 2 дня, но, к чести хостера (www.atservers.com - Минск), им удалось найти ошибку.

Вот фрагмент переписки:

Хостер:

> Ok. Вы получаете эту ошибку спустя какое-то время при сохранении (ок. 30 сек) или моментально?
> --
> С уважением, Роман Шишнев

Я:

Через 30 секунд, причем иногда по несколько раз подряд, а иногда сразу нормально сохраняется. Еще одна особенность: первая часть запросов успевает выполниться, а остальные - нет.

Хостер:

Вам нужно почистить/оптимизировать базу данных и запросы к ней. Запросы более 30 секунд автоматически прерываютя mysql-сервером. После этого mysql-сервер закрывает соединение и, соответственно, все остальные запросы в соединении возвращают ошибку "MySQL server has gone away". Поэтому Ваш "drupal" тормозит 30 секунд на каком-нибудь запросе, а после все остальные вываливаются с ошибкой.

Я:

Стоит самая последняя версия CMS.
База данных, конечно, разрослась, но ошибка появляется не всегда.

Есть некоторые скрипты для оптимизации БД , но я там не очень разбираюсь.

http://www.drupal.ru/node/24492 - для починки.
http://drupalcookbook.ru/recept/analiz-proizvoditelnosti-bazy-dannyh-mysql - для оптимизации.
Они запускаются на виртуальном хостинге?

Хостер:

> Стоит самая последняя версия CMS.
>
> База данных, конечно, разрослась, но ошибка появляется не всегда.
>

Как вариант запрос типа "UPDATE" более 30 секунд ждет завершения нескольких SELECT'ов от параллельных соединений, которые блокируют таблицу. Или наоборот (SELECT ждет UPDATE'ы). В этом случае Вам нужно проанализировать и оптимизировать (создать индексы в полях, по которым происходит выборка SELECT'ом) таблицы для минимализации времени исполнения запросов. Возможно, где-нибудь даже удастся уменьшить размер таблиц.

> Есть некоторые скрипты для оптимизации БД , но я там не очень
> разбираюсь.
>
> http://www.drupal.ru/node/24492 - для починки.

Вместо этого скрипта достаточно сделать "OPTIMIZE TABLE " для каждой таблицы в базе данных. Это можно сделать даже в phpMyAdmin.

> http://drupalcookbook.ru/recept/analiz-proizvoditelnosti-bazy-dannyh-mysql - для оптимизации.
Эта статья предлагает скорректировать параметры mysql-сервера для увеличения производительности. В нашем случае mysql-сервер уже максимально оптимизирован.

=============

Вот оно! Моя база данных разрослась за несколько лет до значительных размером (со включенным кэшированием занимает около 150-200 мб), поэтому часть запросов иногда тормозила и вываливала сервер.

Решение проблемы:

в phpMyAdmin я вручную выбирал "Отметить требующие оптимизации" и потом "С отмеченными: оптимизировать таблицу". Примерно 10-15 таблиц было оптимизировано, после чего любые мои ноды замечательно сохранялись. И было ощущение, что сайт даже стал работать быстрее. Чаще всего оптимизации требовали указанные ниже таблицы.

В дальнейшем я автоматизировал процесс кроном:

<?
$link = mysql_connect("хост", "пользователь", "пароль")
or die("Could not connect: " . mysql_error());

mysql_select_db("... ваша БД....");

$result = mysql_query("OPTIMIZE TABLE batch, book, cache, cache_update, cache_filter, cache_form, cache_menu, cache_page, comments, comment_notify, files, flood, history, node, node_comment_statistics, node_revisions, menu_links, search_dataset, search_total, search_index, search_node_links, sessions, term_data, term_hierarchy, term_node, upload, variable, watchdog");

?>

В зависимости от установленных модулей ваш набор таблиц может быть иной.

P.S. Я надеюсь, что на сайте по пропедевтике внутренних болезней оптимизация БД не понадобится, так как он еще маленький. Smile



Можно повысить устойчивость работы благодаря Static Cache модулю. Кеширует все содержимое в файлы. Простой и доступный кеш для друпала

Аватар пользователя konstantin


Кэширование я использую, но в данном случае речь не о нем, а о борьбе с "MySQL server has gone away".

Аватар пользователя andrew

10.05.2009

Кажется, похожую вещь делает модуль DB Maintenance (http://drupal.org/project/db_maintenance)

Аватар пользователя Alexander


Точно, судя по описанию. О таком модуле не слышал, поэтому "приварил" свое решение. Спасибо за информацию.

Аватар пользователя andrew

12.05.2009

спасибо за инфу. в закладки.

Аватар пользователя Гость

14.05.2009

в общем я с этим боролся по другому: в хттаксессе

php_value max_allowed_packet 64M
php_value wait_timeout 288000
php_value max_execution_time 288000
php_value mysqli.reconnect 1

Аватар пользователя dspt


php_value wait_timeout 288000
php_value max_execution_time 288000

Вы на виртуальном хостинге прописывали? Как в анекдоте - давайте посадим в этом году 200 гектаров, пусть саранча подавится!

Аватар пользователя andrew


за анекдот+1

Аватар пользователя Андрей

27.02.2011

Добавил в /public_html/.htaccess

php_value max_allowed_packet 64M
php_value wait_timeout 288000
php_value max_execution_time 288000
php_value mysqli.reconnect 1

Получил

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Как правильно прописать?

Аватар пользователя Михаил

28.02.2011

Вот почему не работал

~/public_html/.htaccess:

Установка и настройка http://dev.1c-bitrix.ru/learning/course/?COURSE_ID=8&TYPE=Y
Обратите внимание: установка параметров PHP из .htaccess возможна только при выполнении следующих условий:

* используется веб-сервер Apache или совместимый с ним;
* файлы .htaccess обрабатываются веб-сервером, т.е. в настройках веб-сервера (httpd.conf) установлена директива: AllowOverride All или другое значение, отличное от None;
* PHP установлен как модуль Apache (в случае, если PHP работает как CGI, все необходимые значения следует учесть и установить при сборке PHP)

Прописал в ~/php.ini,
указав в ~/public_html/.htaccess:

SetEnv PHPRC /home/login

где login - ваш логин (каталог) у хостера (~/)

Кстати, в ~/public_html/.htaccess:
допустимо указать и так домашний каталог пользователя:
SetEnv PHPRC ~/

В php.ini:

max_execution_time = 60
max_input_time = 90
memory_limit = 64M
mysql.connect_timeout = 60
mysqli.reconnect = On

Аватар пользователя Михаил


а OPTIMIZE TABLE работает на таблицах innodb?

Аватар пользователя ivcons

22.03.2010

а OPTIMIZE TABLE работает на таблицах innodb?

Да работает

Аватар пользователя Гость


Пытаюсь найти решение т.к. БД была 14мб, а 1 января стала сохраняться в размере 1,5мб, тогда только дошло что БД замусорена т.к. страницы сайта и др. все в норме.
Прочитал буду пробовать, спасибо за информацию

Аватар пользователя nic

Отправить комментарий

Содержимое этого поля является приватным и не будет отображаться публично.
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
                                                                                      
ad888888b, 88888888ba, 88 a8P 88 88888888ba 8888888888
d8" "88 88 `"8b 88 ,88' 88 88 "8b 88
a8P 88 `8b 88 ,88" 88 88 ,8P 88 ____
aad8" 88 88 88,d88' 88 88aaaaaa8P' 88a8PPPP8b,
""Y8, 88 88 8888"88, 88 88""""88' PP" `8b
"8b 88 8P 88P Y8b 88 88 `8b d8
Y8, a88 88 .a8P 88 "88, 88, ,d88 88 `8b Y8a a8P
"Y888888P' 88888888Y"' 88 Y8b "Y8888P" 88 `8b "Y88888P"

Введите код, изображенный в стиле ASCII-арт.