Какой тип «оптимизации» происходит при использовании одной машины для создания нагрузки/напряжения?

Какой тип «оптимизации» происходит при использовании одной машины для создания нагрузки/напряжения?

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

Вопрос

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

У меня такой вопрос: какая оптимизация или упрощение на уровне ОС/сети происходит при выполнении одновременных запросов с одной машины/ОС к приложению по сравнению с одновременными запросами с нескольких машин (т. е. обычных пользователей, использующих свои веб-браузеры)?


Фон

У нас есть приложение Tomcat, работающее за Apache через AJP, который, в свою очередь, находится за Citrix Netscaler через порт 80 (мы также планируем исключить Apache из уравнения, но это уже другой вопрос...).

Наше приложение зависло при относительно низкой нагрузке (соединений CLOSE_WAIT между apache и tomcat становится все больше), и мы проводим нагрузочное тестирование, чтобы решить эту проблему. Взаимоблокировки, возникающие в нашем экземпляре SQLServer, возникали довольно часто, поэтому мы решили начать с них. Чтобы воспроизвести проблему и затем протестировать наши исправления, мы используем одну машину для генерации нагрузки с помощью Gatling.

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

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

решение1

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

Если задействован циклический DNS, он будет стремиться поразить только один из пунктов назначения DNS, а не распределить нагрузку по всем. Некоторые балансировщики нагрузки принимают решения о прилипании на основе клиентского IP, который в этом случае будет статическим.

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

решение2

Трудно что-либо остановить, не увидев ваш сценарий теста Gatling. Просто "слепой выстрел": ваш тест Gatling неточно представляет реального пользователя, т.е.

  • Реальные браузеры загружают внешние ресурсы, встроенные в страницу, то есть изображения, скрипты и стили, и делают это с помощью пула параллельных потоков. Если ваш тест Gatling отсутствуетinferHtmlResourcesметоды, может быть так, что нагрузка, исходящая от Gatling, намного меньше, чем нагрузка, создаваемая реальными пользователями, сидящими за реальными браузерами
  • DNS-кэширование. Gatling может поразить только один IP-адрес из-за IP-адресов, находящихся за DNS-именами, кэширующимися на уровне JVM. СогласноЧасто задаваемые вопросы о Гатлинге:

    По сути, нужно настроить кэш DNS Gatling/JVM. Решение — добавить -Dsun.net.inetaddr.ttl=0в командную строку.

  • Запросы AJAX. Gatling не выполняет клиентский JavaScript, поэтому, если ваше приложение построено на XMLHTTP Requests, они не будут запущены, когда Gatling обращается к странице. Вам нужно будет обрабатывать их вручную, если ваше приложение использует какую-либо форму AJAX

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

Связанный контент