Verwenden Sie das ab-Tool, um einen API-Stresstest auf dem Server durchzuführen

Verwenden Sie das ab-Tool, um einen API-Stresstest auf dem Server durchzuführen

1 Eine kurze Einführung in den Systemdurchsatz

Der Durchsatz (die Druckbelastbarkeit) eines Systems hängt eng mit der CPU-Auslastung, den externen Schnittstellen, der E/A usw. der Anforderung zusammen.

Je höher die CPU-Auslastung einer einzelnen Anforderung, desto langsamer sind die externe Systemschnittstelle und die IO-Auswirkungsgeschwindigkeit und desto geringer ist der Systemdurchsatz und umgekehrt.

Mehrere wichtige Parameter des Systemdurchsatzes: TPS, Parallelität, Reaktionszeit

  • TPS: Die Anzahl der pro Sekunde verarbeiteten Transaktionen
  • Gleichzeitigkeit: Die Anzahl der Anfragen (Transaktionen), die das System gleichzeitig verarbeitet
  • Reaktionszeit: Generell gilt die durchschnittliche Reaktionszeit

TPS = Parallelität/durchschnittliche Antwortzeit

Wenn es sich bei der Transaktion hier um eine einzelne Schnittstellenanforderung handelt, können wir TPS auch als QPS betrachten.

Hier sind einige Beispiele:

Beispielsweise greifen 3.000 Benutzer (Parallelität) gleichzeitig auf die zu testende Schnittstelle zu. Laut Statistiken der Benutzerseite beträgt die durchschnittliche Antwortzeit für 3.000 Benutzer 1188,538 ms. Also TPS = 3000/1,188538 s = 2524,11 q/s.

Wir können diesen Test wie folgt beschreiben: Bei 3000 gleichzeitigen Verbindungen beträgt der TPS 2524,11 und die durchschnittliche Antwortzeit 1188,538 ms

Tps: Im tatsächlichen Test zeigt es sich wie folgt:

Der Durchsatz eines Systems wird normalerweise durch zwei Faktoren bestimmt: TPS und Parallelität. Jedes System hat eine relative Grenze für diese beiden Werte. Unter dem Zugriffsdruck des Anwendungsszenarios wird der Durchsatz des Systems nicht erhöht, solange ein Element den Maximalwert des Systems erreicht. Wenn der Druck weiter zunimmt, wird der Durchsatz des Systems stattdessen verringert. Der Grund dafür ist, dass das System überlastet ist und anderer Verbrauch wie Kontextwechsel und Speicher zu einem Rückgang der Systemleistung führt.

Die tatsächliche Leistung besteht darin, dass TPS zuerst zunimmt und dann abnimmt. Wir müssen den Wendepunkt der Leistung finden. Und beseitigen Sie den begrenzenden Engpass.

2 Testmethoden

Referenzen (detaillierte Ausgabebeschreibung):

https://www.jb51.net/article/231492.htm

2.1 Client-Testtools

Zum Testen verwenden wir das Tool ApacheBench.

Ubuntu installiert ab:

sudo apt-get installiere apache2-utils 

Der Standard-Anmeldeport in Linux kann nur 1024 Dateien öffnen. Da in Linux alles eine Datei ist, ist die Anzahl der gleichzeitigen AB-Verwendung durch die Anzahl der geöffneten Dateien begrenzt. Um eine größere gleichzeitige Verwendung zu unterstützen, muss dies mit ulimit -n 10000 (Anzahl der geöffneten Dateien) geändert werden. Ich habe es getestet und auf 15.000 geändert.

2.1.1 GET-Methode

ab -n 100 -c 100 https://www.baidu.com/index.html

-n: Gesamtzahl der Anfragen

-c: Anzahl gleichzeitiger Benutzer.

-url: Zu testende API.

Bei einer geringen Anzahl an Testanfragen wird der Test schnell abgeschlossen und es werden keine Zwischenprozesse angezeigt. Bei einer großen Anzahl an Anfragen wird die aktuelle Anzahl der abgeschlossenen Anfragen in einer eigenen Zeile angezeigt.

2.1.2 POST-Methode

ab -n 10 -c 1 -T 'application/x-www-form-urlencoded' -H "Authorization:Bearer 2393d8db9b9d7f4b9d1570cc8776bca69b421b62" -p ./post http://172.28.28.17:3017/oauth2/token
  • -H: Sie können den Antwortheader festlegen
  • -T: Der Post-HTTP-Headertyp ist standardmäßig „text/plain“
  • -P: Post-Body-Inhalt, ab erfordert das Schreiben in eine Datei, auf -p folgt das Dateiverzeichnis, der Dateiinhalt ist beispielsweise Name=Hallo&Passwort=1234

2.1.3 Interpretation der Testergebnisse

Hier ist die Testausgabe von ab:

ab -n 10 -c 2 Die obige Abbildung zeigt das Ergebnis einer Gesamtanforderung von 10 und einer Parallelität von 2.

Für uns sind vor allem die folgenden Ausgabeinformationen von Interesse:

  • Parallelitätsstufe: 10 // Parallelitätsstufe, dh die Anzahl gleichzeitiger Anforderungen, die durch den Parameter -c in der Anforderung angegebene Anzahl
  • Dauer der Tests: 1,093 Sekunden //Gesamtdauer für diesen Test
  • Abgeschlossene Anfragen: 100 //Die Gesamtzahl der in diesem Test initiierten Anfragen
  • Fehlgeschlagene Anfragen: 0 //Anzahl der fehlgeschlagenen Anfragen. Aus Gründen der Netzwerk- oder Serverleistung sind nicht alle initiierten Anfragen erfolgreich. Indem wir diesen Wert durch die Anzahl der abgeschlossenen Anfragen dividieren, können wir die Anfragefehlerrate berechnen, die als wichtige Referenz für die Testergebnisse dient.
  • Insgesamt übertragen: 103314 Bytes //Die Gesamtmenge der übertragenen Daten bezieht sich auf die Gesamtmenge der Daten, die ab vom getesteten Server empfangen hat, einschließlich des Textinhalts von index.html und der Anforderungsheaderinformationen.
  • Anfragen pro Sekunde: 91,50 [#/sec] (Mittelwert) // Durchschnittliche Anzahl abgeschlossener Anfragen pro Sekunde: QPS, dies ist ein Durchschnittswert, der gleich Abgeschlossene Anfragen/Benötigte Zeit für Tests=100/1,093=91,50 ist.
  • Zeit pro Anfrage: 109,287 [ms] (Mittelwert) // Aus Sicht des Benutzers die Zeit, die zum Abschließen einer Anfrage benötigt wird (da es mehr als einen Benutzer gibt, schließt der Server 10 Anfragen ab und jeder Benutzer erhält im Durchschnitt eine vollständige Antwort, sodass dieser Wert das Zehnfache des Werts des nächsten Elements beträgt.)
  • Zeit pro Anfrage: 10,929 [ms] (Durchschnittswert aller gleichzeitigen Anfragen) // Die Zeit, die der Server benötigt, um eine Anfrage abzuschließen.
  • Übertragungsrate: 92,32 [Kbyte/Sek.] empfangen //Netzwerkübertragungsgeschwindigkeit. Bei Tests mit großen Dateianforderungen kann dieser Wert leicht zu einem Systemengpass werden. Um zu bestimmen, ob dieser Wert einen Engpass darstellt, müssen Sie die Netzwerkbedingungen zwischen dem Client und dem getesteten Server kennen, einschließlich Informationen wie Netzwerkbandbreite und Geschwindigkeit der Netzwerkkarte.

Darunter sind für uns die Anfragen pro Sekunde (tps) am wichtigsten. Wir betrachten es als den wichtigsten Indikator für die Serverleistung.

2.2 Serverseitige Erkennungsmethode

Sie können den Befehl iftop und nethogs -d verwenden, um den Netzwerkstatus des Servers zu ermitteln.

Sie können den Server-Portverkehr über den Befehl iptables überwachen.

Sie können top | grep "node" verwenden, um den Speicher und die CPU zu beurteilen.

Für Cloud-Tests können Sie das Cloud-Host-Backend verwenden, aber die Hintergrundparameter sind Durchschnittswerte nach Minuten.

Dies scheint eine dumme Art zu sein, Leistung zu messen.

3 Tatsächlicher Test

Mit ApacheBench können Sie Shell-Skripte schreiben, um mehrere Tests durchzuführen. Sie können die zu testende API in das API-Array einfügen und die Anzahl der Schleifen ändern, um mehrere APIs gleichzeitig zu testen und eine XLS-Datei mit Schlüsselparametern zu generieren. Nun scheint es, als wäre ich zu naiv gewesen, auf eine solche Idee zu kommen.

3.1 Shell-Skript

Gebrauchsanweisung: a ist die Gesamtzahl der Anfragen, b ist die Anzahl der gleichzeitigen Benutzer, d. h. a[0] entspricht b[0]. Der erste übergebene Parameter ist die Adresse des zu testenden API-Servers und der zweite die von der API benötigten Parameter. Die API wird im API-Array festgelegt. Um mehrere APIs hinzuzufügen oder mehreren Sätzen von API-Tests zuzustimmen, ändern Sie bitte die Anzahl der Schleifen.

echo "Sie können dieses sh wie folgt verwenden:"$0" serverIP userParam"
a=(1000 2000 4000 6000 7000)#Gesamtzahl der zu testenden Anfragen b=(50 100 200 300 400)#Anzahl gleichzeitiger Benutzer runTime=$(date +%Y%m%d%H%M%S)

wenn [ -z "$1"]
Dann
	serverip="http://127.0.0.1"
anders
	ServerIP = $1
fi

wenn [ -z "$2"]
Dann
	param="Geräte-ID=XXX&Bindungsplattform=XXX&Bindungs-ID=XXX"
anders
	Parameter=$2
fi

Dateiname=${runTime}"-test.log"
Touch-Dateiname

#api=('XXX'${param} 'XXX'${param} '/Benutzer/Konto')
api=('XXX'${param})
echo "********Webserver-Testinfo****************"
echo "Testzeit :"$(Datum) 
echo "LogName :"${Dateiname}
echo "Server-IP:"${Server-IP}
echo "Benutzerparam:"${param}
echo "********Webserver-Testinfo****************" 
#echo ${Dateiname}

für j in {0..0}#Die Anzahl der zu testenden APIs ist die Anzahl der API-Arrays
	echo "API-Test:"${serverip}${api[j]}
	für i in {0..4}#Die Anzahl der zu testenden API-Tests beträgt 5, was bedeutet, dass das entsprechende ab-Array fünf Werte hat
		ab -r -k -n ${a[i]} -c ${b[i]} -C ${param} ${serverip}${api[j]} | grep -e"Dokumentpfad:" -e "Abgeschlossene Anfragen:" -e "Parallelitätsstufe:" -e"Fehlgeschlagene Anfragen:" -e"Für Tests benötigte Zeit:" -e "Anfragen pro Sekunde:" -e "Zeit pro Anfrage" -e"Insgesamt übertragen: " >> ${filename}
	Erledigt
Erledigt
sed -i 's/^.\{24\}//g' ${filename}# Erstellt eine txt-Datei entsprechend der Zeit und extrahiert sie entsprechend den obigen Parametern.
exportiere LD_LIBRARY_PATH=
./change ${filename} ${runTime}"report.xls"#chang Die Funktion dient zum Konvertieren der Schlüsseldaten in txt in eine xls-Datei.
rm ${Dateiname} 

3.2 C++ Extractor: Verwenden von libxl.h

#include <iostream>
#einschließen <fstream>
#include <Zeichenfolge>
#include "libxl.h"
Namespace std verwenden;
Namespace libxl wird verwendet;
int main(int agrc, char *argc[])
{

	//cout << "hallowelt" << endl;
	fstream f;
	ifstream ifile(argc[1]);
	Zeichenfolgentemperatur;
	: i = 0, j = 1, k = 0;

	Book* book = xlCreateBook();//Erstellen Sie eine Instanz von XLS (Execl97-03) im Binärformat. Sie müssen diese Funktion aufrufen, um ein Objekt zum Ausführen von Excel zu erstellen, bevor Sie es verwenden. //book->setKey(......);//Wenn Sie die Bibliothek gekauft haben, legen Sie den entsprechenden Schlüssel fest. Wenn Sie sie nicht gekauft haben, verwenden Sie diese Zeile nicht if (book)//Ob die Instanz erfolgreich erstellt wurde {

		Sheet* sheet = book->addSheet("Sheet1"); //Arbeitsblatt hinzufügen		
		für (i = 0; i < 30; i++)
		{
			für(j=0;j<10;j++){
				sheet->setCol(i, j, 20); //Spaltenbreite, Format usw. festlegen }
		}
		ich = 0;
		j = 1;
		
		wenn (Blatt)
		{
			sheet->writeStr(j, 0, "API");
			sheet->writeStr(j, 1, "Parallelitätsstufe");
			sheet->writeStr(j, 2, "Für Tests benötigte Zeit");
			sheet->writeStr(j, 3, "Anfragen abschließen");
			sheet->writeStr(j, 4, "Fehlgeschlagene Anfragen");
			sheet->writeStr(j, 5, "Insgesamt übertragen");
			sheet->writeStr(j, 6, "Anfragen pro Sekunde");
			sheet->writeStr(j, 7, "Zeit pro Anfrage (Benutzer)");
			sheet->writeStr(j, 8, "Zeit pro Anfrage (Server)");
			}
			während (getline(ifile, temp))
			{
				wenn (temp[0] == '/'){
					f << temp << " ";
					Blatt->writeStr(j, i, temp.c_str());
				}
				sonst wenn (temp.find('[') != string::npos){
	
					f << temp.substr(0, temp.find('[') - 1) << " ";
					Blatt->writeStr(j, i, temp.substr(0, temp.find('[') - 1).c_str());
				}
				sonst wenn (temp.find('b') != string::npos){
	
					f << temp.substr(0, temp.find('b') - 1) << " ";
					Blatt->writeStr(j, i, temp.substr(0, temp.find('b') - 1).c_str());
				}
				sonst wenn (temp.find('s') != string::npos){
					Blatt->writeStr(j, i, temp.substr(0, temp.find('s') - 1).c_str());
					f << temp.substr(0, temp.find('s') - 1) << " ";
				}
				anders{
					Blatt->writeStr(j, i, temp.c_str());
					f << temp << " ";
				}
				ich++;
				wenn (i == 9){
					f << " " << endl;
					ich = 0;
					}
				}
			}
			ifile.schließen();
		}
		if (book->save(argc[2])) //In example.xls speichern
		{
			//.....
		}
		anders
		{
			std::cout << Buch->Fehlermeldung() << std::endl;
		}
		Buch->Veröffentlichung();}
	gebe 0 zurück;
}

4 Einige Probleme beim Testen

Bei der Nutzung eines Cloud-Hosts sollten Sie auf die Bandbreite des Cloud-Hosts achten. Kleine Leitungen können zum Engpass werden.

Es besteht eine Diskrepanz zwischen dem insgesamt übertragenen Datenverkehr und dem Port-Datenverkehr in der AB-Software. Der Portverkehr ist größer als die Gesamtübertragungsmenge und es wird vermutet, dass ein Paketblockierungsfaktor vorliegt. Daher kann die Gesamtsumme der übertragenen Daten nicht als vom Server verbrauchter Datenverkehr behandelt und zur Berechnung bestimmter Dienste in der Cloud verwendet werden, die Datenverkehr verbrauchen.

git: https://github.com/CollapsarLi/server_apachebench_shell.git

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Verwenden Sie das Apache ab-Tool, um einen einfachen Stresstest auf dem Apache-Server durchzuführen
  • So konfigurieren Sie ab für Stresstests für den Nginx-Server
  • Konzepte und Methoden für Server-Stresstests (TPS/Parallelität)

<<:  Implementierung einer kreisförmigen CSS-Aushöhlung (Gutschein-Hintergrundbild)

>>:  Detaillierte Zusammenfassung häufig verwendeter MySQL-Funktionen

Artikel empfehlen

So implementieren Sie den Vue-Timer

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung der Merkmale des SQL-Modus in MySQL

Vorwort Der SQL-Modus wirkt sich auf die von MySQ...

So debuggen Sie das Loader-Plugin in einem Webpack-Projekt

Als ich kürzlich lernte, wie man webpack verwende...

jQuery-Plugin zum Erzielen eines Karusselleffekts

Jeden Tag ein jQuery-Plugin - jQuery-Plugin zur I...

Zusammenfassung der Wissenspunkte zum Abdecken von Indizes in MySQL

Wenn ein Index die Werte aller abzufragenden Feld...

Zwei Möglichkeiten zur Visualisierung von ClickHouse-Daten mit Apache Superset

Apache Superset ist ein leistungsstarkes BI-Tool,...

Die letzten zwei Jahre mit User Experience

<br />Es ist nicht länger als zwei Jahre her...

Vue-Statusverwaltung: Verwendung von Pinia statt Vuex

Inhaltsverzeichnis 1. Was ist Pinia? 2. Pinia ist...

Beispiel für die Methode „Mysql implementiert Nullwerte zuerst/letzten“

Vorwort Wir wissen bereits, dass MySQL den SQL-Be...