Проблемы с JMeter при запуске большого количества потоков

Я тестирую с помощью Apache Jmeter, я просто просматриваю одну страницу своего веб-сайта и увеличиваю число пользователей до тех пор, пока не достигнет порога, проблема в том, что когда я получаю около 3000 потоков, JMeter не запустить все из них. Глядя на совокупный график он работает только около 2,536 (это число меняется, но всегда здесь).

Частичный запуск в журналах имеет следующее исключение:

01:16 ERROR - jmeter.JMeter: Uncaught exception: 
java.lang.OutOfMemoryError: unable to create new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Unknown Source)
    at org.apache.jmeter.threads.ThreadGroup.start(ThreadGroup.java:293)
    at org.apache.jmeter.engine.StandardJMeterEngine.startThreadGroup(StandardJMeterEngine.java:476)
    at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:395)
    at java.lang.Thread.run(Unknown Source)

Такое поведение является последовательным. Кроме того, один из случаев, когда JMeter разбился в середине, выдает файл, в котором говорится:

# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 32756 bytes for ChunkPool::allocate
# Possible reasons:
#   The system is out of physical RAM or swap space
#   In 32 bit mode, the process size limit was hit
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Use 64 bit Java on a 64 bit OS
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
#  Out of Memory Error (allocation.cpp:211), pid=10748, tid=11652
#
# JRE version: 6.0_31-b05
# Java VM: Java HotSpot(TM) Client VM (20.6-b01 mixed mode, sharing windows-x86 )

Любые идеи? Я попытался изменить размер кучи в jmeter.bat, но это не помогло.

Ответ 1

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

У вас мало вариантов:

  • эксперимент с вариантами JVM, например. уменьшить значение по умолчанию -Xss512K на меньшее

  • запустить JMeter в кластере

  • использовать инструменты, применяющие радикально иной подход, например Gatling

Ответ 2

У меня была аналогичная проблема и увеличен размер кучи в jmeter.bat до 1024M, и это исправило проблему.

set HEAP=-Xms1024m -Xmx1024m

Ответ 3

Для JVM, если вы читаете hprof, он дает вам некоторые решения, среди которых:

  • переключиться на 64-битный jvm ( > 6_u25)

  • с этим вы сможете выделить больше кучи (-Xmx), убедитесь, что у вас есть эта оперативная память

  • уменьшить Xss с помощью

-Xss256k

Затем для JMeter следуйте рекомендациям:

Наконец, убедитесь, что вы используете последнюю версию JMeter.

  • Использовать Linux лучше

  • Настроить стек TCP, ограничить

Успех будет зависеть от мощности вашего компьютера (процессора и памяти) и вашего плана тестирования.

Если этого недостаточно (для 3000 потоков это должно быть ОК), вам может потребоваться использовать распределенное тестирование

Ответ 4

Увеличение размера кучи в jmeter.bat отлично работает set HEAP = -Xms1024m -Xmx1024m

ИЛИ вы можете сделать что-то вроде ниже, если вы используете jmeter.sh: JVM_ARGS = "- Xms512m -Xmx1024m" jmeter.sh и т.д.

Ответ 5

Я столкнулся с этой же проблемой, и единственным решением, которое помогло мне, было следующее: fooobar.com/questions/35451/...

правильные потоки 100k на linux:

ulimit -s  256
ulimit -i  120000
echo 120000 > /proc/sys/kernel/threads-max
echo 600000 > /proc/sys/vm/max_map_count
echo 200000 > /proc/sys/kernel/pid_max 

Если у вас нет доступа root:

echo 200000 | sudo dd of=/proc/sys/kernel/pid_max

Ответ 6

После увеличения размера кучи Xms et Xmx я должен был запустить мой Java в режиме 64 бит. В jmeter.bat:

set JM_LAUNCH=java.exe -d64

Очевидно, что вам нужно запустить 64-разрядную ОС и установить 64-разрядные версии Java (см. https://www.java.com/en/download/manual.jsp)