Как вырастить из одного сервера настройки


8

Я ищу ресурсы о том, как увеличить настройки нашего сервера.

В настоящее время у нас есть один выделенный сервер с Rackspace в Великобритании следующей спецификации:

HPDL385_G2_PrevGen Одноядерный
HP Opteron 2214 (2,2 ГГц),
4 ГБ ОЗУ,
2 x 10 000 дисков SCSI в RAID 1

Наш трафик составляет до 550 000 УФ-лучей в месяц.

Сайт работает на PHP и MySQL. База данных получает абсолютный удар, у нас много сложных запросов, соединяющих многопользовательские таблицы.

Мы используем APC для кэширования PHP.

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

Я посмотрел на memcache, но у меня сложилось впечатление, что ему требуется большой объем оперативной памяти и в идеале выделенная коробка ....

Таков следующий шаг, чтобы иметь две коробки; один для базы данных, один для Apache? Или есть шаг, который я упустил.

Наша нагрузка обычно составляет около 2 баллов, но сейчас она выросла до 20!

Некоторые графики из Мунина:

MySQL ЦПУ Память


Я проверю это, Эрик, спасибо. Кто-нибудь думает, что увеличение объема оперативной памяти будет иметь большой эффект? Я думаю, что это дорого от Rackspace, хотя £ 50 / ГБ / месяц IIRC.

Вы делаете чтение и запись MySQL, или один более важный, чем другой?
wag2639

Я не уверен, что это должно было быть перенесено из SO. Масштабирование за пределы одного окна - это не только проблема с программным обеспечением, но и проблема программирования. Более того, на самом деле. Покупать оборудование легко. Написание кода, который использует его горизонтально масштабируемым образом, сложно.
Франк Фармер

wag2639 Подавляющее большинство запросов выбрано. Согласно моему графику Мунина, попадания в кеш составляют около 50% от общего .... Есть ли способ я могу опубликовать изображение? Пик на 2160 QPS, в среднем 522 QPS.
Джон М

Ответы:


3

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

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

Если вы не делаете этого и просто делаете что-то на производстве, вы не представляете, сработает ли это или нет, и, возможно, вы потратили немало инженерных усилий на реализацию таких вещей, как кеши (что придет со своей справедливой долей ошибок!) на то, что не помогает.

Тестируйте, тестируйте и тестируйте больше. Не вносите изменения в оборудование / программное обеспечение в производство, пока не получите хорошие данные о производительности, показывающие, что это может значительно улучшить ситуацию. Инженерные работы стоят дорого, тестирование оборудования - нет (особенно).


Memcached - это всего лишь один из вариантов, и вам, вероятно, не стоит его рассматривать, пока у вас не будет оптимальной работы кэширования базы данных. Это означает, что нужно поместить его на выделенную (64-битную) коробку с разумным объемом оперативной памяти (а не у 4G - у ноутбуков, который сейчас есть; 32G определенно доступен) и настроить его соответствующим образом.

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

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

Если ваши проблемы с производительностью связаны с синхронизацией ввода-вывода, потому что вы просто делаете слишком много транзакций для базы данных, убедитесь, что вы используете raid-контроллер с батарейным питанием, который ведет себя правильно (поговорите с вашим поставщиком об этом). Они дают намного больше операций записи ввода-вывода, чем операции без поддержки батареи (потому что данные должны попасть в кеш, прежде чем ОС получит подтверждение). В качестве альтернативы, если ваши данные не имеют большого значения, рассмотрите возможность ослабления параметров долговечности базы данных (синхронизация innodb при фиксации).


32G не очень доступен, когда вы арендуете оборудование. А аренда оборудования, как правило, более экономична, когда у вас есть только одна или две коробки.
Франк Фармер

MarkR / Frank, можете ли вы предложить более глубокое понимание на основе графиков, которые я разместил выше? Моя последняя цитата для дополнительной оперативной памяти была ~ 50 фунтов / ГБ / месяц!
Джон М

1

Посмотрев на решения для кэширования, как и многие другие, предложили здесь, вы можете рассчитывать на то, что в итоге вы получите около 10% нагрузки, которую вы имеете сегодня, а может быть, и меньше.

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

Вы должны попытаться профилировать, какие запросы к базе данных занимают больше всего времени, используя либо медленный журнал запросов MySQL (или эквивалент для вашей базы данных), либо используя такой инструмент, как mytop . Кроме того, EXPLAIN SELECTсинтаксис MySQL может быть полезным.

Кэширование результатов нескольких выбранных запросов MySQL (даже на короткий промежуток времени) действительно может значительно улучшить вашу производительность.


Спасибо Вегард. Да, я регулярно обращаюсь к журналу медленных запросов и объясняю команду по моим запросам. Сервер в значительной степени просто запускает экземпляры Apache и MySQL, но мы также делаем несколько вещей, таких как конвертация видео, которые я в процессе перехода на облачный сервер.

Если ваша проблема действительно заканчивается потоками Apache, вы можете довольно просто снять некоторую нагрузку, установив nginx (или другой легкий обратный прокси-сервер) перед Apache. Затем Nginx может обслуживать статический контент и взять на себя задачу подавать медленные клиентские байты, освобождая apache для выполнения того, что ему действительно нужно: выступать в роли контейнера приложения PHP. Для более полного обзора этой концепции см .: modperlbook.org/html/…
Фрэнк Фармер

Спасибо, Фрэнк, это, конечно, кажется разумным, я перешел как можно больше на Amazon S3, изначально это был только UGC, но сейчас я пытаюсь поместить все графические элементы и элементы CSS там же. Я уверен, что есть некоторые настройки Apache и MySQL.
Джон М

1

Я много работаю над производительностью и масштабируемость, и я обнаружил, что:

Каждая загрузка приложения уникальна

Общие ответы, такие как «добавить больше оперативной памяти», получить другой сервер, «сделать у», «попробовать х», часто приносят разочарование и переходят к сложным настройкам.

Мера правильных вещей

Одна из самых больших проблем заключается в определении того, какие критерии важны. Это часто требует шага назад, и вы должны поставить себя на место вашего клиента. Иногда упрощенный дизайн сайта меняется и приводит к огромным преимуществам для веб-посетителя. Вот почему мне нравятся такие инструменты, как YSlow! которые сосредоточены больше на опыте конечного пользователя, а не на уровне сервера. Как только вы решите, какой эталонный тест для вашего сайта, вы можете приступить к настройке. Тестами могут быть общее время загрузки страницы, общий размер страницы, эффективность кэширования, задержка сайта и т. Д. Вы должны выбрать тот, который имеет смысл для вашего приложения.

Гайки и болты

Когда вы отслеживаете правильные ориентиры, начинайте с очень низкого уровня. Мне нравится использовать sysstat. Вы можете получить массу информации от sysstat и помочь разобраться, какая система может ограничивать общую производительность приложения. Как правило, я сводлю проблемы производительности в:

  • Сетевой стек
  • стек памяти
  • диск io
  • прикладной уровень
  • ос слой

Используя sysstat и другие инструменты, вы можете начать разбивать волосы и найти систему, которая ограничивает производительность.

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

Промыть и повторить

Часто во время настройки приложения вы устраняете одно узкое место, чтобы найти только другое. Вот почему я рекомендую пытаться контролировать то, что вы настраиваете.

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

Получите правильные инструменты

Убедитесь, что вы используете правильные инструменты для работы. Мониторинг, тестирование, бенчмаркинг, профилирование и другие методы оптимизации имеют множество инструментов. Найдите инструмент, который лучше всего соответствует вашей ситуации.

Эмпирические правила

Хотя каждое приложение уникально, я нахожу несколько стандартных отправных точек:

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

Ваши следующие шаги

Если вы не найдете своего узкого места, добавление сервера может не сильно помочь. Для решения дискового ввода-вывода вам может понадобиться другой сервер или SAN. Если у вас есть узкое место оперативной памяти, другой сервер решит проблему только в том, что он добавляет больше оперативной памяти. Довольно дорогостоящий шаг по сравнению с простым добавлением ОЗУ на существующий сервер.

Быстрая починка

За развертывание. Я должен был сделать это, когда оказалось, что проблема в стеке приложений. В основном загружаются на ЦП, ОЗУ и дисковый ввод-вывод (RAID 10, 15K SCSI или SSD). Займитесь большим количеством оборудования, а затем начните настройку. Это держит вас на плаву, пока вы не решите проблемы.


0

Я бы сказал, что следующим шагом должно стать кэширование (кэширование данных и / или кэширование страниц в зависимости от вашей функциональности). Если memcached кажется слишком сложным, вы можете начать с простых решений для кэширования данных, таких как PEAR Cache Lite, которые требуют всего несколько строк кода, но могут иметь огромное значение. Кэширование страниц (или частей страниц) поддерживается Smarty например, движком шаблонов .

Как только кэширование больше не сокращает его, вы можете увеличить количество серверов, поскольку больше ничего не осталось.


Спасибо за ваш совет, Сергей, я уже кеширую HTML в разных местах и ​​использую некоторые ночные запросы к базе данных, чтобы заполнить несколько таблиц «быстрого просмотра».

0

Если у вас достаточно свободной оперативной памяти, memcached поможет вам даже на одной коробке. Попробуйте кешировать несколько самых тяжелых запросов и посмотреть, что произойдет. Кроме того, Apache слишком тяжелый, вместо этого используйте nginx или lighttpd (с PHP-приложением, работающим через FastCGI, см. Php-fpm ).


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

Кеш запросов mysql для многих рабочих нагрузок аннулируется слишком агрессивно, чтобы быть полезным. Обновление одной строки таблицы делает недействительным каждый запрос к этой таблице.
Франк Фармер

0

Запустите кеширование, но пока игнорируйте MySQL. Seriouosly.

Правило должно быть - остановить запрос как можно раньше. Итак, обратный прокси-сервер или правильное кэширование на уровне Apache принесут вам наилучшие результаты, затем кэширование результатов на уровне SQL внутри приложения, затем кэширование на уровне SQL;)

Чем раньше вы остановите запрос, тем меньше накладных расходов. Уровень выходного кэша - даже PHP не должен работать, так сказать.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.