Проектирование сервиса для масштабирования. Необходимое количество серверов

Предположим, мне нужно разработать веб-сервис. Для простоты предположим, что я использую LAMP (Linux-Apache-MySQL- PHP).

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

Предположим, что каждый запрос выполняется M мс и занимает K Мб памяти на моем сервере, имеющем G Гб ОЗУ.

Сколько таких серверов мне нужно? Это просто N * K / G?

Разумное значение для M составляет 200 мс. Каково разумное значение для K?

Нужно ли учитывать мощность процессора в этом вопросе?

Любые дополнительные соображения?


person user1256821    schedule 01.11.2016    source источник


Ответы (1)


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

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

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

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

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

После того, как вы получите цифры для одного сервера, вы можете начать варьироваться двумя способами:

  1. протестируйте с различными аппаратными конфигурациями (добавьте больше оперативной памяти, если у вас ограничена память, добавьте более мощный процессор, если вы ограничены процессором и т. д.)

  2. тест с несколькими серверами; начните добавлять серверы и посмотрите, как ваш сервис масштабируется по горизонтали

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

Получите свои номера, настройте свой дизайн. Смывать. Повторить.

Замены нет, волшебная формула.

person Mike Dinescu    schedule 02.11.2016
comment
Приближение обратного конверта — это именно то, чего я хотел добиться :) Я понимаю, что никогда не увижу ничего похожего на ровно N пользовательских запросов в секунду. Я просто хотел найти основные переменные и их приблизительные значения. - person user1256821; 03.11.2016
comment
@user1256821 user1256821, затем введите любое разумное значение для K и используйте некоторые базовые значения для других вещей. Apache довольно ужасен с точки зрения управления памятью — по моему опыту, он может потреблять до 30-50 МБ на запрос. Скажем, 40 МБ. Имея 4 ГБ доступной оперативной памяти, вы сможете обрабатывать около 100 одновременных запросов. При задержке 200 мс это дает вам около 500 запросов в секунду с одного сервера. Это то, что ты искал? - person Mike Dinescu; 03.11.2016
comment
Да, и я хотел проверить, на правильном ли я пути. Спасибо. - person user1256821; 04.11.2016