HTTP 500 (внутренняя ошибка сервера) при одновременных запросах MySQL через apache

Я настроил базу данных Википедии, где:

  • Один (1) хост работает mysqldзапуск базы данных; Я установил mariadb-server пакет.
  • Я сохранил 16 миллионов страниц в 4 разных таблицах (страница, текст, ревизия, перенаправление; у каждой по 16 миллионов строк, у последней около 7 миллионов). Размер /var/lib/mysql/ibdata1: 88 ГиБ.
  • Запросы обслуживаются через http-сервер (apache2), с помощью Обсуждение MediaWiki, так же, как в wikipedia.org.
  • Один однопоточный работник на другом компьютере отправляет 231 миллион запросов к базе данных через http с тайм-аутом 200-500 мсек; тайм-аут многих запросов даже на 200 мсек.

Проблема в том, что большинство запросов не обслуживаются из-за «HTTP 500» (Internal Server Error). Несколько запросов (100-200) обслуживаются без проблем, но при запуске запросов с более чем ~ 1000 запросов, в большинстве случаев я получаю внутреннюю ошибку сервера.

Вот снимок во время продолжающегося эксперимента:

  • 38 086 запросов: HTTP 200 OK,
  • 1 200 226 запросов: HTTP 500 Internal Server Error
  • 74 280 запросов: истекло время ожидания

В частности, вот небольшая выдержка из /var/log/apache2/error.log на mysqld сервер:

[Mon Apr 18 02:42:43.492142 2016] [:error] [pid 70738] [client 172.16.96.23:41031] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/cache/LocalisationCache.php on line 262
[Mon Apr 18 02:42:53.184116 2016] [:error] [pid 70665] [client 172.16.96.23:57976] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/parser/Preprocessor_DOM.php on line 1123
[Mon Apr 18 02:43:19.389313 2016] [:error] [pid 70745] [client 172.16.96.6:38824] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/Sanitizer.php on line 1087
[Mon Apr 18 02:43:22.188122 2016] [:error] [pid 69251] [client 172.16.96.6:55869] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/title/MediaWikiTitleCodec.php on line 377
[Mon Apr 18 02:43:38.404148 2016] [:error] [pid 70919] [client 172.16.96.6:60524] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/parser/Preprocessor_DOM.php on line 1124
[Mon Apr 18 02:43:42.188143 2016] [:error] [pid 69534] [client 172.16.96.6:51519] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/parser/Preprocessor_DOM.php on line 1119
[Mon Apr 18 02:42:23.004116 2016] [:error] [pid 70550] [client 172.16.96.23:35259] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in /home/wikiadmin/mediawiki-1.26.2/includes/Message.php on line 260

Я ищу идеи о том, как улучшить эту ситуацию со стороны сервера путем обслуживать больше запросов. Будучи полным новичком в MySQL и базах данных в целом, я уже провел свое исследование и натолкнулся на различные предложения, такие как (i) шардинг базы данных; (ii) кластер MySQL и т.д .; однако, поскольку существует так много предложений, я не уверен, в каком направлении мне идти.

Это проблема MySQL или проблема HTTP / MediaWiki?

4

Решение

Задача, которую вы делаете, называется нагрузочное тестирование. Результаты, которые вы видите, находятся в пределах нормального поведения сервера.

Когда время ожидания запроса истекает, это означает, что ваш веб-сервер был слишком перегружен, чтобы ответить на запрос в течение срока ожидания запроса TCP / IP. Это контролируется клиентская машина: машина, которую вы используете для отправки запросов на веб-сервер Apache. Клиентский компьютер повторяет несколько раз, прежде чем сдаться, в зависимости от операционной системы. Машина Windows со стандартной конфигурацией требует 72 секунд, чтобы сдаться.

Ваши 500 ошибок происходят, когда сервер Apache принимает запрос, но затем код вики-медиа, написанный на PHP, не завершается до 30-секундного ограничения. Это ограничение является частью вашей конфигурации PHP. Вы можете изменить его, отредактировав файл php.ini. Но это не поможет. Ваш веб-сервер — компьютер, на котором работает ваш сервер Apache / PHP / mediawiki, перегружен и пытается сделать слишком много вещей одновременно. Если вы дадите PHP более тридцати секунд для запуска, сервер просто попытается сделать больше вещей одновременно, и все это займет больше времени.

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

Это ваш веб-сервер, который прогибается под нагрузкой. Кажется, это происходит изящно … По моему опыту, нагрузка, которую вы применяете, вполне способна вызвать серьезный сбой веб-сервера. Для меня это выглядит как успешный нагрузочный тест: тест завершен с таймаутами, но без сбоев.

Обычно система, выполняющая тип рабочей нагрузки, которую вы моделируете, использует несколько веб-серверов с балансировкой нагрузки (каждый из которых работает Apache / PHP / mediawiki), которые все используют одну базу данных. AWS Elastic Beanstalk является примером системы балансировки нагрузки. Есть и другие.

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

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

2

Другие решения

Это не проблема mysql и не проблема HTTP / mediawiki. Судя по описанию вашей проблемы, у вас недостаточно оборудования для обработки количества отправляемых вами запросов.

231 миллион запросов это много. Огромная огромная партия. То же самое касается 1000 параллельных запросов. Вы серьезно ожидаете, что ваш сайт получит так много? если вы это сделаете, вам нужно будет получить подходящее оборудование для этого.

1

Apache требует больше ресурсов по сравнению с некоторыми другими http-серверами. Читать https://serverfault.com/questions/7778/suggest-a-lightning-fast-feature-light-secure-linux-web-server-to-serve-static для выбора лучшего http-сервера. Вы можете включить opcache или использовать php-ускоритель. Убедитесь, что вы используете mysqli или pdo вместо mysql в php. Убедитесь, что на ваших серверах достаточно оперативной памяти, чтобы данные в оперативной памяти не заменялись. Увеличьте размер буфера InnoDB. Вы также можете использовать веб-сервисы, такие как Google App Engine. Тогда вам не нужно беспокоиться об инфраструктуре самостоятельно.

1
По вопросам рекламы [email protected]