Является ли этот сценарий допустимым стресс-тестом?

У меня есть серверное приложение, которое по-разному обрабатывает запросы клиентов.

Я хочу знать, сколько пользователей может быть обслужено с минимальной задержкой, поэтому я сделал небольшое приложение для стресс-тестирования, которое имитирует запросы пользователей; в то же время другое приложение отслеживает использование памяти / ЦП.

Инструмент стресс-теста каждую секунду создает поток, где каждый поток представляет пользователя. Если стресс-тест не может создать новый поток из-за нехватки ресурсов, он запускает новый экземпляр инструмента стресс-теста.

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

Как мне решить эту проблему, если я хочу измерить максимальную задержку для каждого пользователя?

PS:

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


person Ahmed Said    schedule 06.05.2009    source источник
comment
Запустив тест на том же компьютере, вы не узнаете максимальное количество пользователей с минимальной задержкой, поскольку тестовая программа отбирает временные интервалы и ядра (при распараллеливании она может быть распределена по всем ядрам), тем самым давая вам меньшее число, чем на самом деле.   -  person Ralph M. Rickenbach    schedule 06.05.2009
comment
Это означает, что он дает мне нижнюю границу, а не верхнюю?   -  person Ahmed Said    schedule 06.05.2009
comment
Это даст вам произвольное число, которое будет ниже теоретически возможного, поскольку тестовая программа забирает мощность у серверного приложения. Опять же, другие ограничивающие факторы, такие как количество возможных подключений в сети или задержка в сети, не рассчитываются. Сделать это на втором этапе - это хорошо, но рассмотрите возможность запуска тестовой программы на другом ПК.   -  person Ralph M. Rickenbach    schedule 06.05.2009


Ответы (2)


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

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

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

Изменить: на основе комментария я бы предложил попытаться использовать один поток для управления операциями ввода-вывода в этом случае. Все ваши рабочие потоки вместо записи в файл создадут объект с любыми деталями и передадут его в очередь для записи в файл. Чтобы сократить блокировку / разблокировку, также используйте очередь в рабочем потоке и выполняйте синхронизацию только время от времени. Убедитесь, что вы действительно заблокировали, когда обмениваетесь информацией в ветке. Кроме того, я бы, возможно, посмотрел использование памяти, так как это позволит всему, что ожидает, накапливаться в памяти. Если это все еще вызывает блокировку io, я бы посмотрел либо на то, чтобы писать меньше, либо, возможно, настроить или добавить более быстрый жесткий диск.

person Kevin Nisbet    schedule 06.05.2009
comment
Я создаю пользователя каждую секунду, этот пользователь представлен потоком, поэтому я не создаю поток для каждого запроса (пользователь может сделать более одного запроса). да, приложение будет работать в сети, но я хочу знать производительность / ответ серверного приложения, прежде чем вмешиваться в проблемы с сетью. каждый поток записывает вывод в отдельный файл, и это проблема (состояние гонки ввода-вывода) - person Ahmed Said; 06.05.2009

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

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

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

person Ralph M. Rickenbach    schedule 06.05.2009