Точки стресс-тестирования одной службы веб-программы Golang

Go

Первоначально опубликовано вkuricat.com

Объем данной статьи ограниченGolang webAppСтресс-тестирование одного сервиса, не включающее стресс-тестирование ссылок и другие сценарии

Цель стресс-тестирования

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

показатель

В дополнение к числу запросов в секунду, которые нас больше всего волнуют во время стресс-тестирования отдельных служб, существуют также процессы.CPU / MEM, HTTP 状态码, Timeout 状态, 响应时延, 网卡流量Эти индикаторы требуют внимания, и автор будет описывать их один за другим.

QPS

Об этом показателе, то есть количестве обрабатываемых запросов в секунду, говорить нечего, что является объективным показателем.Для программ Go Web основными факторами, влияющими на QPS, являются ЦП и пропускная способность.

ЦП && Задержка ответа && Тайм-аут

говорящийCPU/响应时延/TimeoutПрежде мы просто проведем небольшой эксперимент, чтобы понять явление.

предположимGo Web AppПри параллелизме 50 он будет в наиболее подходящем диапазоне давления, загрузка ЦП стабильна на уровне 95-100%, задержка ответа составляет 7-10 мс, а QPS при отсутствии ответа Timeout составляет 10k.

Когда мы добавим количество параллелизма к 100 параллелизмам, мы обнаружим, что QPS не будет продолжать расти, он все еще останется около 10k, но задержка ответа возрастет, например, около 20 мс.

Затем мы увеличили параллелизм до 1000. Мы обнаружили, что количество запросов в секунду по-прежнему составляет около 10 000, но задержка ответа резко возросла до 300 мс, и даже задержка ответа на некоторые запросы возросла до 1 с с небольшим временем ожидания запроса.

Экспериментальный вывод заключается в том, что для приложения GoWeb App по мере увеличения количества параллелизма увеличивается и количество запросов в секунду, и задержка ответа не будет следовать за увеличением, пока не достигнет наиболее подходящего диапазона давления для программы.После достижения наиболее подходящего диапазона давления , Продолжайте увеличивать параллелизм, QPS больше не будет увеличиваться, а задержка ответа будет постепенно увеличиваться, в последнем крайнем случае она может сопровождаться таймаутом запроса.

Итак, почему это?Нам нужно кратко понять операционную модель Golang Http Server.

в стандартной библиотекеnet/httpВ реализации http-сервера каждый раз при получении запроса будет открываться новая горутина для его обработки.Затем, когда возникает огромный поток параллелизма, http-сервер будет открывать огромное количество горутин для обработки, но горутина не является операцией. Для потоков системного уровня нет возможности напрямую выделять кванты времени из ЦП. Его выполнение полностью запланировано собственным планировщиком сопрограмм golang. Когда планировщик не выделяет кванты времени сопрограммам, сопрограмма в это время Это просто часть контекста кода, который существует в памяти, и никаких дополнительных потерь не будет.

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

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

MEM

Обычно объем памяти, занимаемый программой Goweb во время работы, не будет увеличиваться слишком сильно или слишком быстро (за исключением особых случаев). pprof для отладки наличия памяти.Для руководства pprof щелкните здесь

сетевой трафик

Трафик сетевой карты — это момент, который легко упустить из виду в стресс-тесте.Часто обнаруживается, что независимо от того, как выполняется настройка, QPS не может быть нажат, и, наконец, обнаруживается, что это сетевая карта.上行/下行 流量/包достичь предела.

Коды состояния HTTP

В процессе стресс-тестирования наиболее ненормальными кодами состояния, с которыми мы сталкиваемся, обычно являются серии 499 и 5xx,

  • 499
    • Клиент отменяет
  • 5xx
    • 500 Ошибка программы сервера
    • По определению, 503 означает перегрузку службы, но в соответствии с обычной операционной моделью Goweb при перегрузке вместо кода состояния 503 сообщается о тайм-ауте, но это неверная обратная связь, и обычно она изменяет пул горутин Goweb или цепочку. делать QOS
    • 502 && 504 может быть ошибка шлюза

Инструмент измерения давления

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

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