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次元配列に変換する例

推薦する

Centos での Python のアップグレードと Mongodb ドライバーのインストールに関する問題

Python バージョンを確認します (python -V)。2.7 未満の場合は、アップグレードす...

CentOS で新しいユーザーを作成し、キーログインを有効にする方法

目次新しいユーザーを作成する新規ユーザーを承認する新規ユーザーのSSHキーログインを有効にする他のS...

Nginx ベースの Mencached キャッシュ構成の詳細な説明

導入Memcached は分散キャッシュ システムです。Memcached には認証とセキュリティ制...

Linuxはjoin -a1を使用して2つのファイルを結合します

次の2つのファイルを結合するには、それらを結合して1.txtに結合します。 # 1.txt ジェリー...

ユーザーエクスペリエンスの構築

<br />おそらく、あなたは会社に入社したばかりで、その会社が「ユーザビリティ」に関す...

閲覧時に作成されたWebページの下部にある余分な空白スペースを削除する方法

Dreamweaver または FrontPage を使用して HTML Web ページを作成する場...

Mysql で group_concat の長さ制限を変更する方法

MySQL には、「group_concat」という関数があります。通常の使用では問題がないかもしれ...

Linux のよく使うコマンドの使い方を詳しく解説(第 2 回)———— テキストエディタのコマンド vi/vim

vi/vim の紹介どちらもマルチモード エディターです。違いは、vim が vi のアップグレー...

MySQL 8.0.16 圧縮版のダウンロードと Win10 システムへのインストール チュートリアル

公式サイトからダウンロード: https://www.mysql.com MySQLの公式サイトにア...

純粋な CSS でマークダウンの自動番号付けを実装するサンプル コード

問題の起源私がタイトルの番号付けの問題に初めて注目したのは、学部の論文を書いていた頃まで遡ります。当...

JavaScriptプロトタイプチェーン図のまとめと実践

目次プロトタイプチェーンプロトタイプチェーンに基づいてシンプルなJQueryライブラリを実装すること...

MySQL をデプロイするときに発生する「テーブル mysql.plugin が存在しません」という問題の解決方法

今日、MySQL の無料インストール版をデプロイしたところ、テーブル 'mysql.plug...

MySQL 5.7.18 無料インストールバージョンの設定チュートリアル

MySQL 5.7.18 無料インストール版のインストールチュートリアルMySQL は現在、世界で最...

MySQL フィールドで NOT NULL を使用する必要があるのはなぜですか?

私は最近新しい会社に入社したのですが、データベース設計にいくつか小さな問題があることに気付きました。...

Nginx 構成の実装 https

目次1: https証明書を準備する2: nginx sslモジュールを準備する3: SSL証明書を...