2016-11-17 2 views
1

Давайте рассмотрим очень простой сценарий jmeter, который загружает файл размером 128 МБ в HTTP-запрос (GET). Цель состоит в том, чтобы подчеркнуть тестируемый сервер, поэтому нет необходимости хранить файл локально или в памяти jvm для будущего использования. Файл должен быть полностью загружен, поскольку он поддерживает соединение с сервером.Сколько памяти (размер кучи) требуется установить в JMeter

Сценарий: 10 тем или больше работает одновременно со скоростью 5 секунд. Предположите неограниченную пропускную способность сети.

местоположение файла: https://storage.googleapis.com/videos12/dummy.txt

Вопрос - сколько памяти вы бы установить для размера кучи JVM в JMeter, так что вы не получите ошибку Java ООМ? Каким будет подход к базовому расчету?

set HEAP=-Xms512m -Xmx512m -> это может быть установлено в файле jmeter.bat.

a sample test plan in jmeter

ответ

3
  1. Быстрый ответ: 512 Мб слишком мало для 10 потоков загрузки файла 128Mb. Увеличьте кучу до 80% от вашей общей физической доступной ОЗУ.
  2. Более длинный ответ: прочитайте материал о Java Performance Tuning, Profiling, and Memory Management, прекратите работу с тестером и станьте экспертом JVM.
  3. Хороший ответ: не спрашивайте или не угадывайте, измерьте его. Использование, т. Е. JVisualVM:

    • Запустите тест с помощью 1 виртуального пользователя. Используется куча измерения
    • Запустите тест с двумя виртуальными пользователями. Используется куча значений.
    • Запустите свой тест с помощью 4 виртуальных пользователей. Используется куча значений.
    • ли сложные арифметические расчеты
    • Набор JMeter кучного соответственно результатам

      JVM JMeter visual VM

  4. Правильный ответ: Учитывая, вы не заботитесь в малейшей степени об ответе не используйте пробоотборщик HTTP-запроса и перейдите на JSR223 Sampler.Пример кода:

    import org.apache.http.HttpEntity; 
    import org.apache.http.HttpResponse; 
    import org.apache.http.client.HttpClient; 
    import org.apache.http.client.methods.HttpGet; 
    import org.apache.http.impl.client.HttpClientBuilder; 
    import org.apache.http.util.EntityUtils; 
    
    HttpClient client = HttpClientBuilder.create().build(); 
    HttpGet get = new HttpGet("https://storage.googleapis.com/videos12/dummy.txt"); 
    HttpResponse response = client.execute(get); 
    SampleResult.setResponseCode(String.valueOf(response.getStatusLine().getStatusCode())); 
    SampleResult.setResponseMessage(response.getStatusLine().getReasonPhrase()); 
    HttpEntity entity = response.getEntity(); 
    SampleResult.setBodySize(Math.round(entity.getContentLength())); 
    EntityUtils.consume(entity); 
    

    Очень важные биты:

    • Убедитесь, что выбран groovy на «языке: выпадающий
    • Убедитесь, что флажок Cache compiled script if available поле
    • Убедитесь, что вы не забыли EntityUtils.consume(entity); линия - все виды магии

Для лучшего понимания «правильного ответа» см. HttpClient Tutorial для API-интерфейсов HTTP Apache и статьи Beanshell vs JSR223 vs Java JMeter Scripting: The Performance-Off You've Been Waiting For! для передовых методов создания сценариев.

+0

благодарит за ответ. Я попробую их. Я хотел добавить шаг до шага 1 - Увеличьте ОЗУ в соответствии с требованием сценария. :) – dnafication

+0

Похоже, что пункт 4 работает для моего сценария. Он не сохраняет ответ в JVM, следовательно, OOM даже при распределенной куче меньше. Протестировано с 50 потоками, и это стоило мне около 150 Мбайт памяти кучи. – dnafication

0

Новый Apache JMeter 3.1 решает эту проблему и отлично справляется с большими ответами.

http://jmeter.apache.org/changes.html#Improvements

Bug 53039 - HTTP-запрос: Уметь обрабатывать ответы, размер которых превышает 2147483647 байт (что есть 2 Гб)

JMeter теперь в состоянии справиться с точки зрения показателей ответов больше 2 ГБ, предел увеличен до 9223372 ТБ. Чтобы обрабатывать такие большие ответы , он также может теперь обрезать часть ответа, чтобы избежать перезарядки памяти . См. Httpsampler.max_bytes_to_store_per_request .