13. Ferntests

Für den Fall, dass Ihr JMeter-Client-Rechner leistungsmäßig nicht genügend Benutzer simulieren kann, um Ihren Server zu belasten, oder auf Netzwerkebene eingeschränkt ist, besteht eine Option zur Steuerung mehrerer, entfernter JMeter-Engines von einem einzigen JMeter-Client. Indem Sie JMeter remote ausführen, können Sie einen Test auf viele Low-End-Computer replizieren und so eine größere Last auf dem Server simulieren. Eine Instanz des JMeter-Clients kann eine beliebige Anzahl entfernter JMeter-Instanzen steuern und alle Daten von ihnen sammeln. Diese bietet folgende Features:

  • Speichern von Testmustern auf dem lokalen Rechner
  • Verwaltung mehrerer JMeterEngines von einer einzigen Maschine aus
  • Der Testplan muss nicht auf jeden Server kopiert werden – der Client sendet ihn an alle Server

Hinweis: Derselbe Testplan wird von allen Servern ausgeführt. JMeter verteilt die Last nicht zwischen den Servern, jeder führt den vollständigen Testplan aus. Wenn Sie also 1000 Threads festlegen und 6 JMeter-Server haben, injizieren Sie am Ende 6000 Threads.

Der Remote-Modus verbraucht jedoch mehr Ressourcen als die unabhängige Ausführung der gleichen Anzahl von CLI-Modus-Tests. Wenn viele Serverinstanzen verwendet werden, kann das Client-JMeter überlastet werden, ebenso wie die Client-Netzwerkverbindung. Dies wurde durch die Umstellung auf Stripped-Modi (siehe unten) verbessert, aber Sie sollten immer überprüfen, ob Ihr Client nicht überlastet ist.

Beachten Sie, dass Sie zwar die JMeterEngine auf Ihrem Anwendungsserver ausführen können, sich jedoch bewusst sein müssen, dass dies zu einem zusätzlichen Verarbeitungsaufwand auf dem Anwendungsserver führt und Ihre Testergebnisse daher etwas verfälscht werden. Der empfohlene Ansatz besteht darin, einen oder mehrere Computer im selben Ethernet-Segment wie Ihren Anwendungsserver zu haben, den Sie zum Ausführen der JMeter-Engine konfigurieren. Dadurch wird der Einfluss des Netzwerks auf die Testergebnisse minimiert, ohne die Leistung des Anwendungsservers selbst zu beeinträchtigen.

Schritt 0: Konfigurieren Sie die Knoten

Stellen Sie sicher, dass alle Knoten (Client und Server):

  • genau dieselbe Version von JMeter ausführen.
  • verwenden auf allen Systemen dieselbe Version von Java. Die Verwendung verschiedener Java-Versionen kann funktionieren, wird jedoch nicht empfohlen.
  • über einen gültigen Schlüsselspeicher für RMI über SSL verfügen oder die Verwendung von SSL deaktiviert haben.

Wenn der Test Datendateien verwendet, beachten Sie, dass diese nicht vom Client gesendet werden. Stellen Sie daher sicher, dass diese im entsprechenden Verzeichnis auf jedem Server verfügbar sind . Bei Bedarf können Sie unterschiedliche Werte für Eigenschaften definieren, indem Sie die Dateien user.properties oder system.properties auf jedem Server bearbeiten. Diese Eigenschaften werden beim Start des Servers erfasst und können im Testplan verwendet werden, um sein Verhalten zu beeinflussen (z. B. Verbindung zu einem anderen Remote-Server). Verwenden Sie alternativ unterschiedliche Inhalte in allen vom Test verwendeten Datendateien (z. B. wenn jeder Server eindeutige IDs verwenden muss, teilen Sie diese zwischen den Datendateien auf).

Schritt 1: Starten Sie die Server

Um JMeter auf einem Remote-Knoten auszuführen, starten Sie die JMeter-Serverkomponente auf allen Computern, auf denen Sie sie ausführen möchten, indem Sie das Skript JMETER_HOME/bin/jmeter-server (Unix) oder JMETER_HOME/bin/jmeter-server.bat (Windows) ausführen.

Beachten Sie, dass es auf jedem Knoten nur einen JMeter-Server geben kann, es sei denn, es werden unterschiedliche RMI-Ports verwendet.

Die JMeter-Serveranwendung startet die RMI-Registrierung selbst; Es ist nicht erforderlich, die RMI-Registrierung separat zu starten.

Standardmäßig verwendet RMI einen dynamischen Port für die JMeter-Server-Engine. Dies kann Probleme für Firewalls verursachen, daher können Sie die JMeter-Eigenschaft server.rmi.localport definieren , um diese Portnummer zu steuern. Sie wird als lokale Portnummer für die Server-Engine verwendet.

Schritt 2: Fügen Sie die Server-IP zur Eigenschaftendatei Ihres Clients hinzu

Bearbeiten Sie die Eigenschaftendatei auf dem steuernden JMeter-Computer . Suchen Sie in JMETER_HOME/bin/jmeter.properties die Eigenschaft mit dem Namen „ remote_hosts “ und fügen Sie den Wert der IP-Adresse Ihres laufenden JMeter-Servers hinzu. Mehrere solcher Server können durch Kommas getrennt hinzugefügt werden.

Beachten Sie, dass Sie stattdessen die Befehlszeilenoption -R verwenden können , um die zu verwendenden Remote-Hosts anzugeben. Dies hat denselben Effekt wie die Verwendung von -r und -Jremote_hosts={serverlist} . Z.B

jmeter -Rhost1,127.0.0.1,host2

Wenn Sie die JMeter-Eigenschaft server.exitaftertest=true definieren , wird der Server beendet, nachdem er einen einzelnen Test ausgeführt hat. Siehe auch das Flag -X (unten beschrieben)

Schritt 3a: Starten Sie den JMeter-Client von einem GUI-Client, um die Konfiguration zu überprüfen

Jetzt können Sie den steuernden JMeter-Client starten. Starten Sie für MS-Windows den Client mit dem Skript „ bin/jmeter.bat “. Verwenden Sie für UNIX das Skript " bin/jmeter ". Sie werden feststellen, dass das Run-Menü zwei neue Untermenüs enthält: „Remote Start“ und „Remote Stop“ (siehe Abbildung 1). Diese Menüs enthalten den Client, den Sie in der Eigenschaftendatei festgelegt haben. Verwenden Sie den Remote-Start und -Stopp anstelle der normalen Start- und Stoppmenüelemente von JMeter.

Abbildung 1 – Menü „Ausführen“.
Abbildung 1 – Menü „Ausführen“.

Schritt 3b: Starten Sie JMeter von einem Client im CLI-Modus

Der GUI-Modus sollte nur zum Debuggen verwendet werden. Als bessere Alternative sollten Sie den Test auf Remote-Servern von einem Client im CLI-Modus (Befehlszeile) starten. Der Befehl dazu lautet:

jmeter -n -t script.jmx -r

oder

jmeter -n -t script.jmx -R server1,server2,…

Andere Flags, die nützlich sein können:

-Gproperty=Wert
Definieren Sie eine Eigenschaft in allen Servern (kann mehr als einmal vorkommen)
-X
Beenden Sie Remote-Server am Ende des Tests.

Das erste Beispiel startet den Test auf allen Servern, die in der JMeter-Eigenschaft remote_hosts definiert sind ;
Das zweite Beispiel definiert remote_hosts aus der Liste der Server und startet dann den Test auf den Remote-Servern.
Der Befehlszeilenclient wird beendet, wenn alle Remoteserver gestoppt wurden.

13.1 SSL einrichten ¶

Seit JMeter 4.0 verwendet der Standard-Transportmechanismus für RMI SSL. SSL benötigt Schlüssel und Zertifikate, um zu funktionieren. Sie müssen diese Schlüssel selbst erstellen.

Die einfachste Einrichtung besteht darin, ein Schlüssel/Zertifikat-Paar für alle JMeter-Server und -Clients zu verwenden, die Sie verbinden möchten. JMeter enthält ein Skript zum Generieren eines Schlüsselspeichers, der einen Schlüssel (und das entsprechende Zertifikat) mit dem Namen rmi enthält . Das Skript befindet sich im Verzeichnis bin und ist für Windows-Systeme (genannt bin/create-rmi-keystore.bat ) und Unix-ähnliche Systeme (genannt bin/create-rmi-keystore.sh ) verfügbar. Es generiert ein Schlüsselpaar, das sieben Tage lang gültig ist, mit einer Standard-Passphrase mit dem Wert „ changeit “. Es wird empfohlen, es aus dem bin - Verzeichnis heraus aufzurufen .

Wenn Sie das Skript ausführen, werden Ihnen einige Fragen zu Namen gestellt, die in das Zertifikat eingebettet werden. Sie können eingeben, was Sie wollen, solange das Keystore-Tool dies akzeptiert. Dieser Wert muss mit der Eigenschaft server.rmi.ssl.keystore.alias übereinstimmen , die standardmäßig rmi ist . Eine Beispielsitzung zum Erstellen des Schlüsselspeichers ist unten dargestellt.

$ cd jmeter/bin
$ ./create-rmi-keystore.sh
Wie lautet Ihr Vor- und Nachname?
  [Unbekannt]: rmi
Wie heißt Ihre Organisationseinheit?
  [Unbekannt]: Name meiner Einheit
Wie lautet der Name Ihrer Organisation?
  [Unbekannt]: Name meiner Organisation
Wie heißt Ihre Stadt oder Gemeinde?
  [Unbekannt]: Deine Stadt
Wie heißt Ihr Bundesland oder Ihre Provinz?
  [Unbekannt]: Ihr Staat
Wie lautet der aus zwei Buchstaben bestehende Ländercode für dieses Gerät?
  [Unbekannt]: XY
Ist CN=rmi, OU=Name meiner Einheit, O=Name meiner Organisation, L=Ihre Stadt, ST=Ihr Staat, C=XY richtig?
  [Nein Ja

Kopieren Sie die generierte Datei „rmi_keystore.jks“ in den Ordner „jmeter/bin“ oder referenzieren Sie sie in der Eigenschaft „server.rmi.ssl.keystore.file“.

Die Standardeinstellungen für RMI sollten mit diesem Setup funktionieren. Kopieren Sie die Datei bin/rmi_keystore.jks auf jeden JMeter-Server und -Client, den Sie für Ihr verteiltes Test-Setup verwenden möchten.

13.2 Manuell ausführen

In einigen Fällen funktioniert das jmeter-server-Skript möglicherweise nicht für Sie (wenn Sie eine Betriebssystemplattform verwenden, die von den JMeter-Entwicklern nicht erwartet wurde). So starten Sie die JMeter-Server (Schritt 1 oben) mit einem manuelleren Prozess:

Schritt 1a: Starten Sie die RMI-Registrierung

Seit JMeter 2.3.1 wird die RMI-Registrierung vom JMeter-Server gestartet, daher entfällt dieser Abschnitt im Normalfall. Um zum vorherigen Verhalten zurückzukehren, definieren Sie die JMeter-Eigenschaft server.rmi.create=false auf den Serverhostsystemen und befolgen Sie die nachstehenden Anweisungen.

JMeter verwendet Remote Method Invocation (RMI) als Remote-Kommunikationsmechanismus. Daher müssen Sie die RMI-Registrierungsanwendung (mit dem Namen „ rmiregistry “) ausführen, die mit dem JDK geliefert wird und sich im Verzeichnis „ bin “ befindet. Stellen Sie vor dem Ausführen von rmiregistry sicher, dass sich die folgenden JAR-Dateien in Ihrem Systemklassenpfad befinden:

  • JMETER_HOME/lib/ext/ApacheJMeter_core.jar
  • JMETER_HOME/lib/jorphan.jar
  • JMETER_HOME/lib/logkit-2.0.jar
Die rmiregistry-Anwendung benötigt Zugriff auf bestimmte JMeter-Klassen. Führen Sie rmiregistry ohne Parameter aus. Standardmäßig lauscht die Anwendung auf Port 1099 .

Schritt 1b: Starten Sie den JMeter-Server

Sobald die RMI-Registrierungsanwendung ausgeführt wird, starten Sie den JMeter-Server. Verwenden Sie die Option " -s " mit dem jmeter-Startskript (" jmeter -s ").

Die Schritte 2 und 3 bleiben gleich.

13.3 Tipps

JMeter/RMI erfordert eine Verbindung vom Client zum Server. Dies verwendet den von Ihnen gewählten Port, standardmäßig 1099 .
JMeter/RMI erfordert auch eine umgekehrte Verbindung, um Probenergebnisse vom Server an den Client zurückzugeben.
Diese verwenden hochnummerierte Ports.
Diese Ports können durch die jmeter-Eigenschaft namens client.rmi.localport in jmeter.properties gesteuert werden .
Wenn dies nicht Null ist, wird es als Basis für lokale Portnummern für die Client-Engine verwendet. Im Moment öffnet JMeter bis zu drei Ports, beginnend mit dem Port, der in client.rmi.localport definiert ist. Wenn Firewalls oder andere Netzwerkfilter zwischen JMeter-Client und -Server vorhanden sind, müssen Sie sicherstellen, dass diese so eingerichtet sind, dass sie die Verbindungen durchlassen. Verwenden Sie bei Bedarf eine Überwachungssoftware, um anzuzeigen, welcher Datenverkehr generiert wird.

Wenn Sie Suse Linux verwenden, können diese Tipps hilfreich sein. Die Standardinstallation kann die Firewall aktivieren. In diesem Fall funktioniert das Remote-Testen nicht richtig. Die folgenden Tipps wurden von Sergey Ten beigesteuert.

Wenn Verbindungen abgelehnt werden, aktivieren Sie das Debuggen, indem Sie die folgenden Optionen übergeben.

rmiregistry -J-Dsun.rmi.log.debug=true \
     -J-Dsun.rmi.server.exceptionTrace=true \
     -J-Dsun.rmi.loader.logLevel=verbose \
     -J-Dsun.rmi.dgc.logLevel=ausführlich \
     -J-Dsun.rmi.transport.logLevel=verbose \
     -J-Dsun.rmi.transport.tcp.logLevel=verbose \

Seit JMeter 2.3.1 wird die RMI-Registry vom Server gestartet; Die Optionen können jedoch weiterhin über die JMeter-Befehlszeile übergeben werden. Zum Beispiel: " jmeter -s -Dsun.rmi.loader.logLevel=verbose " (dh die Präfixe -J weglassen ). Alternativ können die Eigenschaften in der Datei system.properties definiert werden.

Die Lösung des Problems besteht darin, die Loopbacks 127.0.0.1 und 127.0.0.2 aus /etc/hosts zu entfernen . Was passiert ist, dass jmeter-server keine Verbindung zu rmiregistry herstellen kann, wenn 127.0.0.2 Loopback nicht verfügbar ist. Verwenden Sie die folgenden Einstellungen, um das Problem zu beheben.

Ersetzen

`dirname $0`/jmeter -s "$@"

Mit

HOST="-Djava.rmi.server.hostname=[Computername][Computerdomäne] \
      -Djava.security.policy=`dirname $0`/[policy_file]" \
`dirname $0`/jmeter $HOST -s "$@"

Erstellen Sie außerdem eine Richtliniendatei und fügen Sie die Zeile [computer_name][computer_domain] zu /etc/hosts hinzu .

Um das SSH-Tunneln der RMI-Kommunikationskanäle, die beim Remote-Testen verwendet werden, seit JMeter 2.6 besser zu unterstützen:

  • eine neue Eigenschaft " client.rmi.localport " kann gesetzt werden, um den RMI-Port zu steuern, der von RemoteSampleListenerImpl verwendet wird
  • Um das Tunneln von RMI-Datenverkehr über einen SSH-Tunnel als Remote-Endpunkt unter Verwendung eines Ports auf dem lokalen Computer zu unterstützen, darf die Loopback-Schnittstelle jetzt verwendet werden, wenn sie direkt mit dem Java- Systemeigenschaften-Parameter " java.rmi.server.hostname " angegeben wurde .

13.4 Einen anderen Port verwenden ¶

Standardmäßig verwendet JMeter den Standard-RMI-Port 1099 . Es ist möglich, dies zu ändern. Damit dies erfolgreich funktioniert, müssen alle folgenden Punkte übereinstimmen:

  • Starten Sie auf dem Server rmiregistry mit der neuen Portnummer
  • Starten Sie auf dem Server JMeter mit der definierten Eigenschaft server_port
  • Aktualisieren Sie auf dem Client die Eigenschaft remote_hosts so, dass sie die neuen Remote- Host:Port - Einstellungen enthält

Seit JMeter 2.1.1 unterstützen die jmeter-server-Skripte das Ändern des Ports. Angenommen, Sie möchten Port 1664 verwenden (vielleicht wird 1099 bereits verwendet).

Unter Windows (in einer DOS-Box)
C:\JMETER> SET SERVER_PORT=1664
C:\JMETER> JMETER-SERVER [weitere Optionen]
Unter Unix:
$ SERVER_PORT=1664 jmeter-server [andere Optionen]
[Hinweis: Verwenden Sie Großbuchstaben für die Umgebungsvariable]

In beiden Fällen startet das Skript rmiregistry auf dem angegebenen Port und startet dann JMeter im Servermodus, nachdem es die Eigenschaft " server_port " definiert hat.

Der gewählte Port wird in der Datei jmeter.log des Servers protokolliert ( rmiregistry erstellt keine Protokolldatei).

13.5 Verwenden eines anderen Musterabsenders

Listener im Testplan senden ihre Ergebnisse an das Client-JMeter zurück, das die Ergebnisse in die angegebenen Dateien schreibt. Standardmäßig werden Samples synchron zurückgesendet, während sie generiert werden. Dies kann sich auf den maximalen Durchsatz des Servertests auswirken; Das Probenergebnis muss zurückgesendet werden, bevor der Thread fortgesetzt werden kann. Es gibt einige JMeter-Eigenschaften, die eingestellt werden können, um dieses Verhalten zu ändern.

Modus
Beispielsendemodus - Standard ist StrippedBatch seit 2.9. Dies sollte auf dem Client-Knoten festgelegt werden.
Standard
Senden Sie Samples synchron, sobald sie generiert werden
Halt
halten Proben in einem Array bis zum Ende eines Laufs. Dies kann viel Arbeitsspeicher auf dem Server beanspruchen und wird nicht empfohlen.
DiskStore
Proben bis zum Ende eines Laufs in einer Festplattendatei (unter java.io.temp ) speichern. Die serialisierte Datendatei wird beim Beenden der JVM gelöscht.
StrippedDiskStore
ResponseData aus erfolgreichen Beispielen entfernen und DiskStore-Sender verwenden, um sie zu senden.
Charge
Gespeicherte Samples senden, wenn entweder die Anzahl ( num_sample_threshold ) oder die Zeit ( time_threshold ) einen Schwellenwert überschreitet, an welchem ​​Punkt die Samples synchron gesendet werden. Die Schwellenwerte können auf dem Server mit den folgenden Eigenschaften konfiguriert werden:
num_sample_threshold
Anzahl der zu akkumulierenden Samples, Standard 100
time_threshold
Zeitschwelle, Standard 60000 ms = 60 Sekunden
Siehe auch den unten beschriebenen Asynch-Modus.
Statistisch
Senden einer zusammenfassenden Probe, wenn entweder die Anzahl oder die Zeit einen Schwellenwert überschreitet. Die Proben werden nach Thread-Gruppenname und Probenbezeichnung zusammengefasst. Folgende Felder werden kumuliert:
  • verstrichene Zeit
  • Latenz
  • Bytes
  • Probenanzahl
  • Fehler zählen
Andere Felder, die zwischen Proben variieren, gehen verloren.
Abgestreift
ResponseData aus erfolgreichen Proben entfernen
StrippedBatch
ResponseData aus erfolgreichen Beispielen entfernen und Batch-Sender verwenden, um sie zu senden.
Asynchron
Proben werden vorübergehend in einer lokalen Warteschlange gespeichert. Ein separater Worker-Thread sendet die Samples. Dadurch kann der Test-Thread fortgesetzt werden, ohne darauf zu warten, dass das Ergebnis an den Client zurückgesendet wird. Wenn Samples jedoch schneller erstellt werden, als sie gesendet werden können, füllt sich die Warteschlange schließlich und der Sampler-Thread wird blockiert, bis einige Samples aus der Warteschlange entfernt werden können. Dieser Modus ist nützlich, um Spitzen bei der Sample-Erzeugung zu glätten. Die Warteschlangengröße kann angepasst werden, indem die JMeter-Eigenschaft asynch.batch.queue.size (Standard 100 ) auf dem Serverknoten festgelegt wird.
StrippedAsynch
ResponseData aus erfolgreichen Beispielen entfernen und Async sender verwenden, um sie zu senden.
Benutzerdefinierte Implementierung
Legen Sie den mode-Parameter auf den Namen Ihrer benutzerdefinierten Beispiel-Absenderklasse fest. Diese muss die Schnittstelle SampleSender implementieren und über einen Konstruktor verfügen, der einen einzelnen Parameter vom Typ RemoteSampleListener entgegennimmt .
Die Stripped- Mode-Familie entfernt responseData , was bedeutet, dass einige Elemente, die darauf angewiesen sind, dass die vorherigen responseData verfügbar sind, nicht funktionieren.
Dies ist nicht wirklich ein Problem, da es immer einen effizienteren Weg gibt, diese Funktion zu implementieren.

Die folgenden Eigenschaften gelten für den Stapelmodus und den Statistikmodus :

num_sample_threshold
Anzahl der Proben in einer Charge (Standard 100 )
time_threshold
Anzahl der zu wartenden Millisekunden (Standard 60 Sekunden)

13.6 Umgang mit Knoten, deren Start fehlgeschlagen ist

Bei groß angelegten Tests besteht die Möglichkeit, dass ein Teil der Remote-Server nicht verfügbar oder ausgefallen ist. Wenn Sie beispielsweise ein Automatisierungsskript verwenden, um viele Cloud-Maschinen zuzuweisen und sie als Generatoren zu verwenden, können einige der angeforderten Maschinen aufgrund von Cloud-Problemen nicht gestartet werden. Seit JMeter 2.13 gibt es neue Eigenschaften, um dieses Verhalten zu steuern.

Zunächst möchten Sie möglicherweise Initialisierungsversuche wiederholen, in der Hoffnung, dass fehlgeschlagene Knoten ihren Start nur geringfügig verzögert haben. Um Wiederholungen zu aktivieren, sollten Sie die Eigenschaft client.tries auf die Gesamtzahl der Verbindungsversuche setzen. Standardmäßig macht es nur einen Versuch. Um die Wiederholungsverzögerung zu steuern, legen Sie die client.retries_delay- Eigenschaft auf die Anzahl der Millisekunden für den Ruhezustand zwischen den Versuchen fest.

Schließlich möchten Sie den Test möglicherweise noch mit den Generatoren ausführen, die erfolgreich initialisiert wurden, und fehlgeschlagene Knoten überspringen. Um dies zu aktivieren, legen Sie die Eigenschaft client.continue_on_fail=true fest .

13.7 Verwenden eines Sicherheitsmanagers

Wenn Sie JMeter in einer verteilten Umgebung ausführen, müssen Sie sich darüber im Klaren sein, dass JMeter sowohl auf der Server- als auch auf der Client-Seite im Grunde genommen ein Remote-Execution-Agent ist. Dies könnte von einer böswilligen Partei verwendet werden, um sich weiteren Zugriff zu verschaffen, sobald sie einen der JMeter-Clients oder -Server kompromittiert hat. Um dies abzumildern, hat Java das Konzept eines Sicherheitsmanagers, der von der JVM gefragt wird, bevor potenziell gefährliche Aktionen ausgeführt werden. Diese Aktionen können das Auflösen von Hostnamen, das Erstellen oder Lesen von Dateien oder das Ausführen von Befehlen im Betriebssystem sein.

Der Sicherheitsmanager kann durch Festlegen der Java-Systemeigenschaften java.security.manager und java.security.policy aktiviert werden . Sehen Sie sich auf jeden Fall die Quick Tour of Controlling Applications an .

Mit dem neuen Mechanismus von setenv.sh (oder setenv.bat unter Windows) können Sie den Sicherheitsmanager aktivieren, indem Sie den folgenden Codeausschnitt zu ${JMETER_HOME}/bin/setenv.sh hinzufügen :

JVM_ARGS=" \
   -Djava.security.manager \
   -Djava.security.policy=${JMETER_HOME}/bin/java.policy \
   -Djmeter.home=${JMETER_HOME} \
"

Die JVM fügt nun die in der Datei ${JMETER_HOME}/bin/java.policy definierten Policies zu den möglicherweise global definierten Policies hinzu. Wenn Ihre Definition die einzige Quelle für Richtlinien sein soll, verwenden Sie beim Festlegen der Eigenschaft java.security.policy zwei Gleichheitszeichen anstelle von einem .

Die Richtlinien hängen von Ihrem Anwendungsfall ab und es kann eine Weile dauern, bis Sie die richtigen eingeschränkten und zulässigen Aktionen gefunden haben. Java kann Ihnen mit der Eigenschaft java.security.debug helfen, die benötigten Richtlinien zu finden . Setzen Sie es auf Zugriff und es wird alle Berechtigungen protokollieren, die es zulassen soll. Fügen Sie einfach die folgende Zeile zu Ihrer setenv.sh hinzu :

JVM_ARGS="${JVM_ARGS} -Djava.security.debug=access"

Es mag etwas seltsam aussehen, dass wir eine Java-Systemeigenschaft jmeter.home mit dem Wert ${JMETER_HOME} definieren . Diese Variable wird im Beispiel java.policy verwendet , um den Zugriff auf das Dateisystem zu beschränken und ihm nur das Lesen der JMeters-Konfiguration und -Bibliotheken zu erlauben und den Schreibzugriff nur auf bestimmte Speicherorte zu beschränken.

Die folgende Richtliniendefinitionsdatei wurde für einen einfachen Ferntest verwendet. Sie müssen wahrscheinlich die Richtlinien anpassen, wenn Sie komplexere Szenarien ausführen. Die Testpläne werden irgendwo im Home-Verzeichnis des Benutzers unter einem Verzeichnis namens jmeter-testplans abgelegt . Das Beispiel java.policy sieht so aus:

gewähren Sie codeBase "file:${jmeter.home}/bin/*" {
  Berechtigung java.security.AllPermission;
};

gewähren Sie codeBase "file:${jmeter.home}/lib/jorphan.jar" {
  Berechtigung java.security.AllPermission;
};

gewähren Sie codeBase "file:${jmeter.home}/lib/log4j-api-2.11.1.jar" {
  Berechtigung java.security.AllPermission;
};

gewähren Sie codeBase "file:${jmeter.home}/lib/log4j-slf4j-impl-2.11.1.jar" {
  Berechtigung java.security.AllPermission;
};

gewähren Sie codeBase "file:${jmeter.home}/lib/slf4j-api-1.7.25.jar" {
  Berechtigung java.security.AllPermission;
};

gewähren Sie codeBase "file:${jmeter.home}/lib/log4j-core-2.11.1.jar" {
  Berechtigung java.security.AllPermission;
};

gewähren Sie codeBase "file:${jmeter.home}/lib/ext/*" {
  Berechtigung java.security.AllPermission;
};

gewähren Sie codeBase "file:${jmeter.home}/lib/httpclient-4.5.6.jar" {
  Berechtigung java.net.SocketPermission "*", "connect,resolve";
};

gewähren Sie codeBase "file:${jmeter.home}/lib/darcula.jar" {
  Berechtigung java.lang.RuntimePermission "modifyThreadGroup";
};

gewähren Sie codeBase "file:${jmeter.home}/lib/xercesImpl-2.12.0.jar" {
  Berechtigung java.io.FilePermission "${java.home}/lib/xerces.properties", "read";
};

gewähren Sie codeBase "file:${jmeter.home}/lib/groovy-all-2.4.15.jar" {
  Berechtigung groovy.security.GroovyCodeSourcePermission "/groovy/script";
  Berechtigung java.lang.RuntimePermission "accessClassInPackage.sun.reflect";
  Berechtigung java.lang.RuntimePermission "getProtectionDomain";
};

gewähren {
  Berechtigung java.io.FilePermission "${jmeter.home}/backups", "lesen, schreiben";
  Berechtigung java.io.FilePermission "${jmeter.home}/backups/*", "lesen, schreiben, löschen";
  Berechtigung java.io.FilePermission "${jmeter.home}/bin/upgrade.properties", "read";
  Berechtigung java.io.FilePermission "${jmeter.home}/lib/ext/-", "read";
  Berechtigung java.io.FilePermission "${jmeter.home}/lib/ext", "read";
  Berechtigung java.io.FilePermission "${jmeter.home}/lib/-", "read";
  Berechtigung java.io.FilePermission "${user.home}/jmeter-testplans/-", "read,write";
  Berechtigung java.io.SerializablePermission "enableSubclassImplementation";
  Berechtigung java.lang.reflect.ReflectPermission "suppressAccessChecks";
  Berechtigung java.lang.RuntimePermission "accessClassInPackage.jdk.internal.dynalink.support";
  Berechtigung java.lang.RuntimePermission "accessClassInPackage.sun.awt";
  Berechtigung java.lang.RuntimePermission "accessClassInPackage.sun.misc";
  Berechtigung java.lang.RuntimePermission "accessClassInPackage.sun.swing";
  Berechtigung java.lang.RuntimePermission "accessDeclaredMembers";
  Berechtigung java.lang.RuntimePermission "createClassLoader";
  Berechtigung java.lang.RuntimePermission "createSecurityManager";
  Berechtigung java.lang.RuntimePermission "getClassLoader";
  Berechtigung java.lang.RuntimePermission "getenv.*";
  Berechtigung java.lang.RuntimePermission "nashorn.createGlobal";
  Berechtigung java.util.PropertyPermission "*", "lesen";
};
  
Die Verwendung von java.security.AllPermission ist eine einfache Möglichkeit, Ihre Testpläne zum Laufen zu bringen, aber es könnte eine gefährliche Abkürzung auf Ihrem Weg zur Sicherheit sein.
Go to top