Я пытаюсь улучшить производительность установки Drupal (6) под нагрузкой. Один веб-сервер, один сервер базы данных (MySQL5) - оба являются четырехъядерными процессорами Intel Xeon с тактовой частотой 2,5 ГГц и 16 ГБ ОЗУ. На веб-сервере я использую APC для повышения производительности PHP. Запуск сервера memcached с 6 ящиками на сервере БД. Используя Apache Solr для поиска, Solr также находится на сервере БД.
Узким местом является Apache на веб-сервере, поскольку ему не хватает памяти под нагрузкой. Похоже, что ни один процесс не использует слишком много доступных системных ресурсов.
Мы будем благодарны за любой вклад. Если есть вопросы о настройке, я могу ответить, задавайте их.
Спасибо!
Поскольку мы говорим о PHP, я предполагаю, что вы используете MPM prefork Apache. Дано Отношение Расмуса Лердорфа к многопоточности, вам следует продолжать использовать предварительную вилку Apache или аналогичную настройку без потоков с другим HTTP-сервером (например, nginx).
На ум приходят 4 быстрых победы. Я не могу сказать из исходного вопроса OP, если это уже было сделано - если нет, эти 4 улучшения должны принести существенное улучшение.
а) Убрать обслуживание статических файлов (CSS, изображения и т. д.) из ваших экземпляров PHP Apache. С Prefork MPM, когда вы отправляете одно изображение пользователю, весь дочерний Apache с полной средой выполнения PHP остается занятым для отправки этого единственного изображения. Это может быть процесс Apache размером 20-40 МБ, который занимает от 0,1 до 3 секунд, пока пользователь загружает это изображение - в то же время, когда экземпляр Apache мог обслуживать десятки или сотни динамических страниц. Предложение: Настройте выделенный сервер для статических ресурсов или воспользуйтесь дешевым CDN, например Amazon CloudFront.
б) Отключить поддержку активности HTTP к экземпляру Apache, который обслуживает динамический (Drupal) контент. HTTP keepalive великолепен и имеет свое применение, но опять же, с keepalive на и Apache prefork MPM браузер одного конечного пользователя будет продолжать «блокировать» (то есть занимать) дочерний Apache в течение длительных периодов времени.
c) Убедитесь, что вы отправляете правильные заголовки HTTP, особенно статический контент, такой как изображения, CSS и т. д., кэшируемый. В противном случае браузер пользователя будет повторно загружать этот статический контент при каждом просмотре страницы, что является пустой тратой. Использовать Yahoo! YSlow, КРАСНЫЙ Марка Ноттингема или аналогичные инструменты.
г) Настройте другой веб-сервер, и просто используйте простой Циклический перебор DNS для распределения нагрузки между двумя веб-серверами. Я предполагаю, что Drupal может хранить состояние сеанса в базе данных MySQL (большинство приложений PHP могут)? Если да, то о хранилище сеансов позаботятся, и вы можете использовать циклический перебор DNS.
Циклический перебор DNS не идеален. Он не обрабатывает сбой сервера и не гарантирует идеального распределения нагрузки. Но его легко настроить, и обычно он работает достаточно хорошо для простой настройки с двумя или, возможно, тремя веб-серверами.
Ты пробовала напорный поток это Drupal с некоторыми настройками производительности и масштабируемости.
Вы можете настроить nginx или lighttpd для обслуживания статических файлов (css / js / images / videos) перед сервером apache.
Другой метод - статическое кэширование страниц. я думаю Модуль повышения может сделать что-то подобное. Или, если у вас есть время и ресурсы, создайте свои собственные модули drupal для создания статических файлов html вместо динамических страниц php.
Отказаться от Apache в пользу чего-то более легкого, например nginx?