web-dev-qa-db-fra.com

Problèmes JMeter lors de l'exécution d'un grand nombre de threads

Je teste avec Jmeter d'Apache, j'accède simplement à une page du site Web de mon entreprise et j'augmente le nombre d'utilisateurs jusqu'à atteindre un seuil. Le problème est que, lorsque j'atteins environ 3 000 threads, JMeter ne fonctionne pas tous leur. En regardant le graphique agrégé , Il ne tourne que sur environ 2 536 (ce nombre varie mais est toujours présent). 

L'exécution partielle vient avec l'exception suivante dans les journaux:

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)

Ce comportement est cohérent. En outre, une des fois où JMeter est tombé en panne au milieu, générant un fichier dans lequel on pouvait lire:

# 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 )

Des idées?
J'ai essayé de changer la taille du tas dans jmeter.bat, mais cela ne semblait pas du tout aider.

11
Irony

JVM n'est tout simplement pas capable de exécuter autant de threads . Et même si c'est le cas, JMeter consommera beaucoup de ressources de la CPU pour changer de contexte. En d'autres termes, au-dessus d'un point, vous ne comparez pas votre application Web, mais l'ordinateur client hébergeant JMeter.

Vous avez peu de choix:

  • expérimenter avec les options de la machine virtuelle Java, par exemple diminue default -Xss512K en quelque chose de plus petit

  • exécuter JMeter dans un cluster

  • utiliser des outils ayant une approche radicalement différente comme Gatling

14
Tomasz Nurkiewicz

J'ai eu un problème similaire et la taille du segment dans jmeter.bat a été augmentée à 1024 Mo, ce qui a résolu le problème.

set HEAP=-Xms1024m -Xmx1024m
4
Siva

Pour la machine virtuelle Java, si vous lisez hprof, vous trouverez des solutions parmi lesquelles:

  • passer à un format jvm 64 bits (> 6_u25)

  • avec cela, vous pourrez allouer plus de Heap (-Xmx), assurez-vous d'avoir cette RAM

  • réduire Xss avec:

-Xss256k

Ensuite, pour JMeter, suivez les meilleures pratiques:

Enfin, assurez-vous d'utiliser la dernière version de JMeter.

  • Utilisez de préférence Linux OS

  • Réglez la pile TCP, les limites

Le succès dépendra de la puissance de votre machine (processeur et mémoire) et de votre plan de test.

Si cela ne suffit pas (pour 3000 threads cela devrait aller), vous devrez peut-être utiliser des tests distribués

3
UBIK LOAD PACK

L'augmentation de la taille de segment dans jmeter.bat fonctionne correctement Set HEAP = -Xms1024m -Xmx1024m

OU Vous pouvez faire comme ci-dessous si vous utilisez jmeter.sh :JVM_ARGS="-Xms512m -Xmx1024m "jmeter.sh etc.

2
swathy valluri

J'ai rencontré ce même problème et la seule solution qui m'a aidé est: https://stackoverflow.com/a/26190804/5796780

100k threads appropriés sur 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 

Si vous n'avez pas d'accès root:

echo 200000 | Sudo dd of=/proc/sys/kernel/pid_max
1
Vijay