1 システムスループットの簡単な紹介システムのスループット(圧力耐性)は、リクエストの CPU 消費量、外部インターフェイス、IO などに密接に関連しています。 単一のリクエストの CPU 消費量が多いほど、外部システム インターフェイスと IO 影響速度が遅くなり、システム スループットが低下します。逆もまた同様です。 システムスループットの重要なパラメータ: TPS、同時実行性、応答時間
TPS = 同時実行数 / 平均応答時間 ここで、トランザクションが単一のインターフェース要求である場合、TPS を QPS と見なすこともできます。
たとえば、3,000 人のユーザー (同時実行) がテスト対象のインターフェースに同時にアクセスするとします。ユーザー側の統計によると、3,000 人のユーザーの平均応答時間は 1188.538 ミリ秒です。つまり、TPS = 3000 / 1.188538秒 = 2524.11 q/sです。 このテストは次のように説明できます。3000の同時接続の場合、TPSは2524.11、平均応答時間は1188.538msです。
システムのスループットは通常、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
2.1.3 テスト結果の解釈以下は ab のテスト出力です。 ab -n 10 -c 2 上の図は、合計リクエスト数 10 と同時実行数 2 の結果を示しています。 私たちが主に関心を持つ出力情報は次のとおりです。
その中でも、私たちが最も懸念しているのは、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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
オブジェクト上にマウスを移動したときにコンテンツ(タイトル属性の内容)を折り返す方法、HTML タイ...
目次1. オブジェクトメソッドを定義する2. プロトタイプメソッドを定義する3. イベントコールバッ...
乱雑なログ日常的に使用される Nginx は、静的リソース サーバーとリバース プロキシ サーバーの...
MySQL のインストールは比較的簡単なので、通常は次のステップに直接進み、注意が必要な点に集中する...
目次1. GTIDの基本概念2. GTIDの利点3. GTIDの仕組み4. 従来のレプリケーションに...
目次確認する:例の検証と組み合わせるselect クエリ ステートメントはロックされませんが、sel...
接続ツールを開きます。私はMobaXterm_Personal_12.1を使用します(公式サイトのダ...
目次1. 環境2. 準備3. MySQL 8.0.11をインストールするMySQL 8 の公式バージ...
序文mysql がデフォルトのデータベース パスを変更したため、サービスを開始できませんでした。ログ...
環境名前財産CPU 5650 円メモリ4Gディスク20G+4TB この時点で、サーバーにはすでに次の...
tomcat が起動されるたびに、次のログ ファイルがログ ディレクトリに自動的に生成され、日付順...
以前は MySQL 5.7 を使用していましたが、MySQL にいくつか新しい機能が追加されたため、...
目次1. 縦方向のスライス1.1 垂直データベース1.2 垂直テーブル分割2. 水平(横断)セグメン...
キーコードは次のとおりです。コードをコピーコードは次のとおりです。 html{高さ:100%; }コ...
コードは次のようになります。 // 配送先住所の平行四辺形の線のスタイル <view clas...