Назад | Перейти на главную страницу

Методология нагрузочного / стресс-тестирования. Чего ожидать и как интерпретировать результаты?

У нас есть новый клиент, для которого мы рассматриваем нашу серверную инфраструктуру.

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

Он основан на экземпляре Amazon m1.large, nginx (+ ssl), django, amazon RDS (с MySQL) и на собственном сервере memcached.

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

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

Я играл с тестом apache, отправляя 2500 одновременных подключений при подключении / отключении кэша памяти или некоторых настроек nginx, просто чтобы увидеть изменения производительности.

Лучшее, что у меня было, было около 100 запросов в секунду, но самые длинные запросы занимают более 20 секунд (для 2500 одновременных подключений, только 100 запросов занимают максимум 1 с). С точки зрения пользователя, я бы не хотел ждать больше 1-2 секунд, чтобы получить результат ...

Я хотел бы больше поиграть со всеми настройками, которые я могу настроить на nginx, django, mysql или memcache, но на данный момент я думаю, что мне нужна методология и больше, чем методология, мне нужна цель, которую нужно достичь.

Выполняя поиск в Интернете, я вижу сообщения в блогах, в которых говорится об услугах, которые обрабатывают несколько сотен запросов в секунду. Я далек от этого.

Наблюдая за всеми этими цифрами, полученными из apachebench, у меня создается впечатление, что я запускаю тесты, вижу результаты, но я не совсем понимаю их и не знаю, что с ними делать, чтобы улучшить наш API.

Итак, что было бы хорошей методологией, хорошим подходом к достижению цели - иметь веб-API, способный как можно быстрее справляться с таким количеством подключений?

Если вам нужна дополнительная информация, просто спросите!

Я никогда не работал с установкой Django, поэтому, возможно, не смогу вникнуть в особенности Django. Было бы здорово, если бы вы могли предоставить подробную информацию о статистике ЦП, ввода-вывода, памяти при выполнении 100 запросов в секунду. Вы можете получить эти 20-секундные задержки по разным причинам, в зависимости от характера вашего дефицита ресурсов. Возможно, вы не сможете понять статистику производительности, не зная о состоянии вашей системы в условиях стресса. Хорошим местом для начала могут быть показатели Amazon CloudWatch и / или включение мониторинга с помощью Munin, Nagios или аналогичных инструментов с помощью соответствующего графического инструмента, такого как Graphite или Ganglia. Даже отслеживание vmstat вывод может многое раскрыть.

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

  1. Проверьте медленные запросы к базе данных. Я не уверен в этом, но RDS может предоставить вам статистику по медленным запросам. Вы можете их оптимизировать.
  2. Если ЦП вызывает узкое место, и вы видите скачки ЦП во время пикового трафика, вы можете проверить статистику процесса во время пика и обнуления процесса, который перегружает ЦП, тем самым делая ваш веб-сервер недоступным в течение некоторого времени (вызывая 20-секундную задержка). Кроме того, вы можете предложить меры по оптимизации этого процесса или, если это невозможно, вы можете переключиться на экземпляр c1.xlarge.
  3. Если ваш сервер испытывает нехватку памяти и показывает мало доступной памяти во время пикового трафика, вы можете проверить области вашего приложения, которые интенсивно используют память. Возможно, вы захотите оптимизировать эти области и / или добавить еще немного памяти, обновив свои экземпляры до альтернатив с высоким объемом памяти. Кроме того, вы можете даже подумать о настройке кода вашего приложения, чтобы сделать ваши процессы, привязанные к памяти, привязанными к процессору. Обычно процессор недостаточно загружен во время нехватки памяти.
  4. Если ЦП вашего сервера недостаточно загружен и вы даже не видите перегрузки памяти, то высока вероятность, что ваша система проводит много времени в ожидании ввода-вывода. Это может быть связано с задержкой в ​​любой из ваших зависимостей. Также проверьте количество переключений контекста и прерываний во время пиковой нагрузки, используя vmstat. Это может произойти, если вы решите запустить большее количество рабочих процессов, чем количество доступных ядер. Сервер также может ожидать блока ввода-вывода. Некоторые испытывали задержку блока ввода-вывода при использовании EBS, хотя меня это устраивает.

Надеюсь это поможет.

Сначала вам нужно установить, что является узким местом для этой веб-службы. Вероятно, это медленные запросы к БД и / или низкая производительность django. Обратите внимание, что большинство фреймворков для быстрой разработки веб-приложений (Производительность Django) на самом деле не оптимизированы по скорости. Если вы не можете позволить себе использование большого количества серверов и балансировку нагрузки, вы не можете рассчитывать на высокую производительность.

В любом случае ... для начала я бы попробовал:

  1. Проверьте скорость выполнения ключевых SQL-запросов и при необходимости оптимизируйте свои запросы. Рассмотрите возможность использования memcached для кеширования результатов SQL-запросов (для этого вам, вероятно, потребуются некоторые изменения в вашем коде).
  2. Проверьте, сколько запросов может обработать django (с запросами к базе данных и без них)
  3. Проверьте размер типичного запроса / ответа и спросите себя, могут ли ваши жесткие диски / соединение обрабатывать такой трафик. Немного может помочь использование мониторинга ввода-вывода, например iotop.
  4. Проверьте, может ли ваш процессор обрабатывать такой трафик - используйте команду top.