ab ツールを使用してサーバー上で API ストレス テストを実行します。

ab ツールを使用してサーバー上で API ストレス テストを実行します。

1 システムスループットの簡単な紹介

システムのスループット(圧力耐性)は、リクエストの CPU 消費量、外部インターフェイス、IO などに密接に関連しています。

単一のリクエストの CPU 消費量が多いほど、外部システム インターフェイスと IO 影響速度が遅くなり、システム スループットが低下します。逆もまた同様です。

システムスループットの重要なパラメータ: TPS、同時実行性、応答時間

  • TPS: 1秒あたりに処理されるトランザクションの数
  • 同時実行性: システムによって同時に処理されるリクエスト(トランザクション)の数
  • 応答時間: 一般的には平均応答時間を取る

TPS = 同時実行数 / 平均応答時間

ここで、トランザクションが単一のインターフェース要求である場合、TPS を QPS と見なすこともできます。

以下にいくつか例を挙げます。

たとえば、3,000 人のユーザー (同時実行) がテスト対象のインターフェースに同時にアクセスするとします。ユーザー側の統計によると、3,000 人のユーザーの平均応答時間は 1188.538 ミリ秒です。つまり、TPS = 3000 / 1.188538秒 = 2524.11 q/sです。

このテストは次のように説明できます。3000の同時接続の場合、TPSは2524.11、平均応答時間は1188.538msです。

Tps: 実際のテストでは、次のように表示されます。

システムのスループットは通常、TPS と同時実行性の 2 つの要素によって決まります。各システムには、これら 2 つの値に対する相対的な制限があります。アプリケーション シナリオのアクセス プレッシャーの下では、1 つの項目がシステムの最大値に達する限り、システムのスループットは増加しません。プレッシャーがさらに高まると、システムのスループットはむしろ低下します。その理由は、システムが過負荷になり、コンテキスト スイッチやメモリなどの他の消費によってシステム パフォーマンスが低下するためです。

実際のパフォーマンスは、TPS が最初に増加し、その後減少します。パフォーマンスの変曲点を見つける必要があります。そして、制限的なボトルネックを取得します。

2 試験方法

参考資料(詳細な出力の説明):

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

2.1 クライアントテストツール

テストには apacheBench ツールを使用します。

Ubuntu は以下をインストールします:

sudo apt-get で apache2-utils をインストールします 

Linux のデフォルトのログイン ポートでは、1024 個のファイルしか開くことができません。Linux ではすべてがファイルであるため、ab の同時実行数は開いているファイルの数によって制限されます。より大きな同時実行をサポートするには、ulimit -n 10000 (開いているファイルの数) を使用して変更する必要があります。テストして15000に変更しました。

2.1.1 GETメソッド

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

-n: リクエストの総数

-c: 同時ユーザー数。

-url: テストする API。

テスト要求数が少ない場合、テストはすぐに完了し、中間プロセスは表示されません。リクエスト数が多い場合は、現在完了しているリクエスト数が別の行に表示されます。

2.1.2 POSTメソッド

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: レスポンスヘッダーを設定できます
  • -T: 投稿の http ヘッダー タイプはデフォルトで text/plain になります
  • -P: 投稿本文の内容。ab ではファイルに書き込む必要があります。-p の後にはファイル ディレクトリが続きます。ファイルの内容は name=hello&password=1234 のようになります。

2.1.3 テスト結果の解釈

以下は ab のテスト出力です。

ab -n 10 -c 2 上の図は、合計リクエスト数 10 と同時実行数 2 の結果を示しています。

私たちが主に関心を持つ出力情報は次のとおりです。

  • 同時実行レベル: 10 //同時実行レベル、つまり同時リクエストの数。リクエストの -c パラメータで指定された数。
  • テストにかかった時間: 1.093 秒 //このテストにかかった合計時間
  • 完了したリクエスト: 100 //このテストで開始されたリクエストの合計数
  • 失敗したリクエスト: 0 //失敗したリクエストの数。ネットワークまたはサーバーのパフォーマンス上の理由により、開始されたリクエストがすべて成功するとは限りません。この値を完了したリクエスト数で割ると、リクエスト失敗率を計算できます。これは、テスト結果の重要な参照として役立ちます。
  • 転送された合計: 103314 バイト //転送されたデータの合計量とは、index.html のテキスト コンテンツとリクエスト ヘッダー情報を含む、テスト対象サーバーから ab が受信したデータの合計量を指します。
  • 1 秒あたりのリクエスト数: 91.50 [#/sec] (平均) // 1 秒あたりに完了したリクエストの平均数: QPS、これは平均値で、完了したリクエスト数/テストにかかった時間 = 100/1.093 = 91.50 に相当します。
  • リクエストあたりの時間: 109.287 [ms] (平均) // ユーザーの観点から、リクエストを完了するために必要な時間 (複数のユーザーがいるため、サーバーは 10 件のリクエストを完了し、各ユーザーは平均して完全な応答を受け取るため、この値は次の項目の値の 10 倍になります。)
  • リクエストあたりの時間: 10.929 [ミリ秒] (すべての同時リクエストの平均) // サーバーがリクエストを完了するのにかかる時間。
  • 転送速度: 92.32 [Kbytes/sec] 受信 //ネットワーク転送速度。大きなファイル要求テストの場合、この値は簡単にシステムのボトルネックになる可能性があります。この値がボトルネックであるかどうかを判断するには、ネットワーク帯域幅やネットワーク カードの速度などの情報を含む、テスト対象のクライアントとサーバー間のネットワーク状態を理解する必要があります。

その中でも、私たちが最も懸念しているのは、1秒あたりのリクエスト数(tps)です。私たちはこれをサーバーのパフォーマンスの最も重要な指標だと考えています。

2.2 サーバー側検出方法

iftop コマンドと nethogs -d を使用して、サーバーのネットワーク状態を検出できます。

iptables コマンドを使用して、サーバー ポート トラフィックを監視できます。

メモリと CPU を判断するには、top | grep "node" を使用できます。

クラウド テストの場合、クラウド ホスト バックエンドを使用できますが、バックグラウンド パラメーターは数分後の平均値になります。

これは功績を測る愚かな方法のように思えます。

3 実際のテスト

apacheBench を使用すると、複数のテストを実行するためのシェル スクリプトを作成できます。テスト対象の API を API 配列に配置し、ループ数を変更して一度に複数の API をテストし、キー パラメーターの xls ファイルを生成できます。今となっては、私はそのような考えを持つにはあまりにも世間知らずだったようです。

3.1 シェルスクリプト

使用方法: a はリクエストの総数、b は同時ユーザー数です。つまり、a[0] は b[0] に対応します。渡される最初のパラメータはテストする API サーバーのアドレスであり、2 番目は API に必要なパラメータです。 API は API 配列に設定されます。複数の API を追加したり、複数の API テスト セットに同意したりする場合は、ループ カウントを変更してください。

echo "次のようにshを使用できます:"$0" serverIP userParam"
a=(1000 2000 4000 6000 7000)#テストするリクエストの合計数 b=(50 100 200 300 400)#同時ユーザー数 runTime=$(date +%Y%m%d%H%M%S)

[ -z "$1"]の場合
それから
	サーバーIP="http://127.0.0.1"
それ以外
	サーバーIP=$1
フィ

[ -z "$2"]の場合
それから
	パラメータ="デバイスID=XXX&バインディングプラットフォーム=XXX&バインディングID=XXX"
それ以外
	パラメータ=$2
フィ

ファイル名=${runTime}"-test.log"
ファイル名をタッチ

#api=('XXX'${param} 'XXX'${param} '/users/account')
api=('XXX'${param})
echo "********ウェブサーバーテスト情報****************"
echo "testTime :"$(date) 
echo "LogName :"${filename}
echo "serverIP:"${serverip}
echo "userparam:"${param}
echo "********ウェブサーバーのテスト情報****************" 
#echo ${ファイル名}

for j in {0..0}#テストするAPIの数は、API配列の数です
	echo "API テスト:"${serverip}${api[j]}
	for i in {0..4}#テストするAPIテストの数は5回です。つまり、対応するab配列には5つの値があります。
		ab -r -k -n ${a[i]} -c ${b[i]} -C ${param} ${serverip}${api[j]} | grep -e"ドキュメント パス:" -e "完了したリクエスト:" -e "同時実行レベル:" -e"失敗したリクエスト:" -e"テストにかかった時間:" -e "1 秒あたりのリクエスト数:" -e "リクエストあたりの時間" -e"転送された合計: " >> ${filename}
	終わり
終わり
sed -i 's/^.\{24\}//g' ${filename}# 時間に応じて txt ファイルを生成し、上記のパラメータに従って抽出します。
エクスポート LD_LIBRARY_PATH=
./change ${filename} ${runTime}"report.xls"#chang この関数は、txt 内のキー データを xls ファイルに変換します。
rm ${ファイル名} 

3.2 C++ 抽出プログラム: libxl.h の使用

#include <iostream>
#include <fstream>
#include <文字列>
#include "libxl.h"
名前空間 std を使用します。
名前空間 libxl を使用します。
int main(int agrc, char *argc[])
{

	//cout << "helloworld" << endl;
	fstream f;
	ifstream ifile(argc[1]);
	文字列 temp;
	i = 0、j = 1、k = 0;

	Book* book = xlCreateBook();//XLS (Execl97-03) のインスタンスをバイナリ形式で作成します。Excel を操作するオブジェクトを作成する前に、この関数を呼び出す必要があります。//book->setKey(......);//ライブラリを購入した場合は、対応するキーを設定します。購入していない場合は、この行を使用しないでください。if (book)//インスタンスが正常に作成されたかどうか {

		Sheet* sheet = book->addSheet("Sheet1"); //ワークシートを追加する		
		(i=0;i<30;i++) の場合
		{
			(j=0;j<10;j++)の場合{
				sheet->setCol(i, j, 20); //列の幅、フォーマットなどを設定します。 }
		}
		私=0;
		1 = 1;
		
		if (シート)
		{
			sheet->writeStr(j, 0, "API");
			sheet->writeStr(j, 1, "同時実行レベル");
			sheet->writeStr(j, 2, "テストにかかった時間");
			sheet->writeStr(j, 3, "リクエストを完了する");
			sheet->writeStr(j, 4, "失敗したリクエスト");
			sheet->writeStr(j, 5, "転送された合計");
			sheet->writeStr(j, 6, "1秒あたりのリクエスト数");
			sheet->writeStr(j, 7, "リクエストあたりの時間(ユーザー)");
			sheet->writeStr(j, 8, "リクエストあたりの時間(サーバー)");
			j++;
			(getline(ifile, temp)) の間
			{
				(temp[0] == '/')の場合{
					f << temp << " ";
					sheet->writeStr(j, i, temp.c_str());
				}
				そうでない場合 (temp.find('[') != string::npos){
	
					f << temp.substr(0, temp.find('[') - 1) << " ";
					sheet->writeStr(j, i, temp.substr(0, temp.find('[') - 1).c_str());
				}
				そうでない場合 (temp.find('b') != string::npos){
	
					f << temp.substr(0, temp.find('b') - 1) << " ";
					sheet->writeStr(j, i, temp.substr(0, temp.find('b') - 1).c_str());
				}
				そうでない場合 (temp.find('s') != string::npos){
					sheet->writeStr(j, i, temp.substr(0, temp.find('s') - 1).c_str());
					f << temp.substr(0, temp.find('s') - 1) << " ";
				}
				それ以外{
					sheet->writeStr(j, i, temp.c_str());
					f << temp << " ";
				}
				私は++;
				(i == 9)の場合{
					f << " " << 終了;
					私 = 0;
					j++;
				}
			}
			ifile.close();
		}
		if (book->save(argc[2])) //example.xlsに保存
		{
			//.....
		}
		それ以外
		{
			std::cout << book->errorMessage() << std::endl;
		}
		book->release();}
	0を返します。
}

4 テスト中に発生したいくつかの問題

クラウドホストを使用する場合は、クラウドホストの帯域幅に注意する必要があります。小さなパイプがボトルネックになる可能性があります。

ab ソフトウェアでは、転送された合計トラフィックとポート トラフィックの間に矛盾があります。ポート トラフィックが転送された合計より大きく、パケット ブロッキング要因があると考えられます。したがって、転送された合計は、サーバーによって消費されたトラフィックとして扱うことはできず、トラフィックを消費するクラウド上の特定のサービスを計算するために使用することはできません。

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

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Apache abツールを使用してApacheサーバーで簡単なストレステストを実行します。
  • Nginx サーバーのストレス テストを実行するための ab の設定方法
  • サーバーストレステストの概念と方法 (TPS/同時実行性)

<<:  MySQL よく使われる関数の詳細な概要

>>:  JS 1次元配列を3次元配列に変換する例

推薦する

html リンク タグ タイトル属性 改行 マウス ホバー プロンプト コンテンツ 改行効果

オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...

JavaScript で矢印関数を使用できないシナリオはどれですか

目次1. オブジェクトメソッドを定義する2. プロトタイプメソッドを定義する3. イベントコールバッ...

静的リソースファイルのアクセスログをフィルタリングするNginxの実装

乱雑なログ日常的に使用される Nginx は、静的リソース サーバーとリバース プロキシ サーバーの...

Win7 での mysql5.5 インストール グラフィック チュートリアル

MySQL のインストールは比較的簡単なので、通常は次のステップに直接進み、注意が必要な点に集中する...

MySQL の例 DTID マスタースレーブ原理の分析

目次1. GTIDの基本概念2. GTIDの利点3. GTIDの仕組み4. 従来のレプリケーションに...

面接では、select...for update がテーブルをロックするのか、それとも行をロックするのか尋ねられました。

目次確認する:例の検証と組み合わせるselect クエリ ステートメントはロックされませんが、sel...

Alibaba Cloud ESC に MYSQL8.0 をインストールするチュートリアル

接続ツールを開きます。私はMobaXterm_Personal_12.1を使用します(公式サイトのダ...

CentOS 7.4 にソースコードから MySQL 8.0 をインストールするための詳細なチュートリアル

目次1. 環境2. 準備3. MySQL 8.0.11をインストールするMySQL 8 の公式バージ...

データベースのデフォルトパスを変更した後にmysqlが起動できない問題の解決策

序文mysql がデフォルトのデータベース パスを変更したため、サービスを開始できませんでした。ログ...

LinuxベースのLVMシームレスディスク水平拡張の詳細な説明

環境名前財産CPU 5650 円メモリ4Gディスク20G+4TB この時点で、サーバーにはすでに次の...

tomcat ログ ディレクトリ内のログ ファイルの分析 (概要)

tomcat が起動されるたびに、次のログ ファイルがログ ディレクトリに自動的に生成され、日付順...

Windows での MySQL 8.X インストール チュートリアル

以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...

MySQL テーブルとデータベースでデータを分割する方法

目次1. 縦方向のスライス1.1 垂直データベース1.2 垂直テーブル分割2. 水平(横断)セグメン...

さまざまな解像度やブラウザでウェブページを適切に表示する方法

キーコードは次のとおりです。コードをコピーコードは次のとおりです。 html{高さ:100%; }コ...

CSS 配送先住所平行四辺形線スタイルの例コード

コードは次のようになります。 // 配送先住所の平行四辺形の線のスタイル <view clas...