Performance Testing Service (PTS) のストレステストが失敗した場合、または予期しない結果が返された場合、エラーはエラーメッセージ内の Java 例外、またはレスポンス内の HTTP ステータスコードのいずれかです。以下のセクションでは、両方のタイプを根本原因別にグループ化し、それぞれの解決策を示します。
エラーを見つけるには、エラーメッセージを正確に検索するか、関連する HTTP ステータスコードのセクションまでスクロールしてください。
接続エラー
これらのエラーは、PTS がバックエンドサーバーへの接続を確立または維持できないことを示します。まず、サーバーの状態と、PTS とターゲットエンドポイント間のネットワークパスを確認してください。
class java.net.ConnectException:null
原因:ターゲットサーバーへの TCP 接続が失敗したか、拒否されました。
解決策:バックエンドサーバーの状態を確認し、PTS とターゲット間にネットワークのボトルネックが存在しないことを確認してください。
org.apache.http.ConnectionClosedException:Connection closed
原因:サーバーが接続を異常終了させました。
解決策:バックエンドサーバーのログで、突然の切断を引き起こす可能性のあるエラーやリソースの枯渇を確認してください。
org.apache.hc.core5.http.ConnectionClosedException:Connection is closed
原因:サーバーがすでにクローズした接続に、PTS がリクエストを送信しました。
解決策:ゲートウェイ層の帯域幅またはネットワークパスにボトルネックがあるかどうかを確認してください。サーバーがロードバランサーの背後にある場合は、アイドル接続のタイムアウト設定が PTS とロードバランサー間で整合していることを確認してください。
java.io.IOException:Connection reset by peer
原因:バックエンドサーバーが接続を強制的にリセットしました。
解決策:リクエストパスに Server Load Balancer (SLB) がある場合は、SLB のリスナー設定、特に接続タイムアウトとヘルスチェックの設定を確認してください。
org.apache.http.ConnectionClosedException:Connection closed unexpectedly
原因:PTS がレスポンスを受信する前に接続が終了しました。典型的なトリガーは次のとおりです:
サーバーが想定された時間枠内にレスポンスしませんでした。
デバッグセッションまたはストレステストがレスポンスの到着前に停止されました。
解決策:サーバーが設定されたタイムアウト内にリクエストを処理できることを確認してください。テストが意図的に停止された場合、このエラーは想定されるものであり、無視してかまいません。
タイムアウトエラー
これらのエラーは、リクエストまたは接続が許可された時間制限を超えたことを示します。一般的な根本原因には、バックエンド処理の遅延、リソースの競合、またはワークロードに対して短すぎるタイムアウト設定が含まれます。
java.util.concurrent.TimeoutException:null
原因:TCP 接続の試行がタイムアウトしました。PTS は割り当てられた時間内にターゲットサーバーに到達できませんでした。
解決策:
サンプリングログの詳細にあるタイミングウォーターフォールを使用して、接続フェーズに異常に時間がかかっているかどうかを確認してください。詳細については、「ストレステスト結果の分析」をご参照ください。
バックエンドサーバーの状態とネットワークパスにボトルネックがないか確認してください。
org.apache.hc.core5.http2.H2StreamResetException:Timeout due to inactivity (5000 MILLISECONDS) * class
原因:バックエンドサーバーがデフォルトのリクエストタイムアウトである 5 秒以内にレスポンスしませんでした。
解決策:[シナリオの作成] ページの [Advanced Settings] セクションで、リクエストのタイムアウトを延長してください。
java.net.SocketTimeoutException:null
原因:レスポンスを待機中、またはデータ読み取り中にリクエストがタイムアウトしました (アイドルタイムアウト)。
解決策:
サーバーが正常であり、想定された時間内にリクエストを処理できることを確認してください。
ストレステスト API に適切なタイムアウト設定があるかどうかを確認してください。
サーバーのパフォーマンスボトルネック (CPU、メモリ、I/O) を調査してください。
リダイレクトと DNS のエラー
java.lang.RuntimeException:java.net.UnknownHostException
原因:ドメイン名を解決できません。
解決策:
ドメイン名が登録され、正しく解決されることを確認してください。
ドメインがパブリック DNS に登録されていない場合は、テストを実行する前に PTS でバインドしてください。
org.apache.http.client.CircularRedirectException
原因:リクエストがリダイレクトループ (例:A -> B -> C -> A) に入ったか、10 回を超えるリダイレクトが発生しました。
解決策:
302 リダイレクトを無効化する:[Scenario Settings] ページで、[Allow 302 Redirect] スイッチをオフにしてください。
ストレステストを再度実行し、元のリクエストを検査してリダイレクトチェーンを確認してください。
正確なリダイレクトパスを確認するには、ストレステスト報告書のサンプリングログ詳細を開き、タイミングウォーターフォールを確認してください。詳細については、「ストレステスト結果の分析」をご参照ください。
HTTP/2 プロトコルエラー
org.apache.hc.core5.http.ProtocolException:Header 'key: value' is illegal for HTTP/2 messages
原因:シナリオに HTTP/2 が許可しないヘッダーが含まれています。HTTP/2 では次のヘッダーが禁止されています:Connection、Keep-Alive、Proxy-Connection、Transfer-Encoding、Host、およびUpgrade。
解決策:シナリオ設定からサポートされていないヘッダーを削除し、テストを再実行してください。
java.nio.channels.CancelledKeyException:null
原因:バックエンドサーバーが HTTP/2 プロトコルで接続を終了しました。
解決策:バックエンドサーバーのログを調査し、ストリームリセットや GOAWAY フレームなどの HTTP/2 固有の問題がないか確認してください。
JMeter スクリプトエラー
これらのエラーは、JMeter スクリプトが、PTS がサポートするバージョン (JMeter V5.0) と互換性がない場合に発生します。
java.lang.RuntimeException: Could not find the TestPlan class!
原因:JMeter スクリプトが JMeter V5.0 と互換性のないバージョンで作成されました。
解決策:JMeter V5.0 でスクリプトを開いて再保存し、再度 PTS にアップロードしてください。
java.lang.SecurityException: class "xxx"'s signer information does not match signer information of other classes in the same package
原因:スクリプト内の Java サンプラーの依存関係 (ApacheJMeter_core または ApacheJMeter_java) が、JMeter V5.0 以外のバージョンに対してビルドされました。
解決策:JMeter V5.0 ライブラリを使用して依存関係の JAR を再パッケージ化し、更新されたパッケージをアップロードしてください。
Attempt to resolve method: xxx() on undefined variable or class name:
原因:BeanShell サンプラーが、スクリプトと一緒にアップロードされなかったクラスを参照しています。
解決策:必要なクラスを含む不足している JAR パッケージをアップロードし、テストを再実行してください。
VPC ネットワークエラー
class java.lang.IllegalArgumentException:forbidden uri, uri host must match vpc cidr pattern 10.0.0.0/8, 172.16.0.0/12 or 192.168.0.0/16
原因:ストレステストが VPC を使用するように設定されていますが、テスト URL 内のドメイン名が内部 IP アドレスではなく、パブリック IP アドレスに解決されます。VPC でのストレステストでは、ターゲット IP がプライベート CIDR 範囲 (10.0.0.0/8、172.16.0.0/12、または192.168.0.0/16) 内にある必要があります。
解決策:以下のいずれかのアプローチが有効です:
テスト URL で内部 IP アドレスを直接使用してください。
PTS コンソールにログインし、ドメイン名を内部 IP アドレスにバインドしてください。
HTTP エラーコード
403 (Forbidden)
403 レスポンスは、サーバーがリクエストを受信したものの、その承認を拒否したことを意味します。PTS のストレステストにおける一般的な原因は次のとおりです:
バックエンド認証の拒否
原因:サーバーの認証メカニズムが、トークンの欠落や無効などを理由にリクエストを拒否します。
解決策:バックエンドサービスの認証設定を確認し、ストレステストのリクエストに有効な認証情報が含まれていることを確認してください。
User-Agent 検証の失敗
原因: サーバーゲートウェイは User-Agent (UA) ヘッダーを検証します。PTS が送信するデフォルトの UA には、一部のサービスで統計トラフィックとスロットリングルールを区別するための特殊文字が含まれています。一部のゲートウェイは、この非標準の UA を拒否します。
解決策:
PTS コンソールで、[Performance Test] > [Scenarios] の順に移動します。
シナリオを選択し、[Actions] 列の [Edit] をクリックしてください。
[シナリオ設定] ページの [ヘッダー定義] タブで、標準ブラウザの UA を設定します (
キー:User-Agent、値:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36)。[Debug] をクリックしてください。[Request Details] ページで、リクエストが成功することを確認してください。UA を変更した後にリクエストが成功した場合は、変更したヘッダーでストレステストを続行してください。
WAF によるブロック (稀なケース)
原因:Web Application Firewall (WAF) がストレステストのトラフィックをブロックしています。
解決策:PTS トラフィックを許可する WAF のホワイトリストルールを設定してください。詳細については、「セキュリティポリシーが原因で、ストレステストのトラフィックがWebアプリケーションにアクセスできない場合の対処方法」をご参照ください。
ドメインの未登録 (ICP 登録)
原因:ストレステストに使用されているドメイン名が登録されていないか、登録されていない別のドメインに解決されます。
解決策:レスポンスボディを確認します。レスポンスに以下のような HTML が含まれている場合、そのドメインは ICP 登録がされていません:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<style>body{background-color:#FFFFFF}</style>
<title>TestPage184</title>
<script language="javascript" type="text/javascript">
window.onload = function () {
document.getElementById("mainFrame").src= "http://****.aliyun.com/alww.html";
}
</script>
</head>
<body>
<iframe style="width:860px; height:500px;position:absolute;margin-left:-430px;margin-top:-250px;top:50%;left:50%;" id="mainFrame" src="" frameborder="0" scrolling="no"></iframe>
</body>
</html>ストレステストを再試行する前に、ドメインの ICP 登録を申請してください。
405 (Method Not Allowed)
405 レスポンスは、サーバーがリクエストで使用された HTTP メソッドをサポートしていないことを意味します。PTS での一般的な原因は次のとおりです:
302 リダイレクトによるリクエストメソッドの変更:POST リクエストが 302 リダイレクトをトリガーすると、HTTP クライアントはそれを GET リクエストに変換することがあります。ターゲットエンドポイントが GET を受け付けない場合、405 エラーが返されます。
サーバーは明示的にメソッドを制限します。レスポンスの
Allowヘッダー (たとえばAllow=GETなど) を参照して、サーバーが受け入れるメソッドを確認してください。SLB または Web サーバーの転送によるメソッドの変更:ロードバランサーまたはリバースプロキシがリクエストを転送する際に、メソッドが変更されることがあります。転送ルールを確認してください。
406 (Not Acceptable)
406 レスポンスは、サーバーがリクエストの Accept ヘッダーに一致するレスポンスを生成できないことを意味します。
原因: [ヘッダー定義] タブの Accept の値が、サーバーが返すことができるコンテンツタイプと一致しません。これは通常、[ボディ定義] タブの Content-Type が [ヘッダー定義] タブに自動的に同期され、Accept の値と競合する場合に発生します。
解決策:サーバーがサポートするタイプと一致するように Accept ヘッダーを調整します。さまざまな値をテストして、サーバーが受け入れるタイプを判断します。次の表に、一般的な Accept 形式とその照合順序を示します。
| フォーマット | 説明 |
|---|---|
text/html | HTML |
text/plain | プレーンテキスト |
text/xml | XML |
image/gif | GIF 画像 |
image/jpeg | JPEG 画像 |
image/png | PNG 画像 |
application/xhtml+xml | XHTML |
application/xml | XML データ |
application/atom+xml | Atom XML アグリゲーション |
application/json | JSON データ |
application/pdf | |
application/msword | Word ドキュメント |
application/octet-stream | バイナリストリーム (ファイルダウンロード) |
application/x-www-form-urlencoded | デフォルトのフォームエンコーディング (キーと値のペア) |
照合の優先順位: 複数の Accept タイプが指定された場合、サーバーは次の順序でそれらを照合します:
品質係数なし: 左から右へ照合されます。
application/xml、text/html、application/jsonは、application/xml>text/html>application/jsonの順序で照合されます。品質係数あり: より高い
q値が優先されます。application/xml;q=0.3、application/json;q=0.8、text/html(デフォルトはq=1.0) は、text/html>application/json>application/xmlの順に一致します。ワイルドカードの具体性: より具体的なタイプが最初に一致します。
*/*、text/*、text/htmlはtext/html>text/*>*/*の順で一致します。
503 (Service Unavailable)
バックエンドサーバーの過負荷
原因:バックエンドサーバーが過負荷状態で、追加のリクエストを受け付けを拒否しています。
解決策:バックエンドサーバーのエラーログで、リソースの枯渇や容量制限を確認してください。
ソース IP の制限による SLB のスロットリング
原因:PTS のサンプリングログに多数の 503 エラーが表示されますが、バックエンドサーバーには対応するエラーが表示されません。これは通常、次のすべての条件が満たされている場合に発生します:
ストレステストが HTTP または HTTPS API を使用している。
エントリーポイントが SLB インスタンス (インターネット向けまたは内部向け) である。
バックエンドサービスが 503 エラーを返さない。
503 レスポンスのボディが次のパターンと一致する:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head><title>503 Service Temporarily Unavailable</title></head> <body bgcolor="white"> <h1>503 Service Temporarily Unavailable</h1> <p>The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.</body> </html>
根本原因:PTS はデフォルトで持続的接続を使用します。ソース IP アドレスの数が少ない場合、単一の IP アドレスが SLB の単一プロキシのスロットリングをトリガーする可能性があり、SLB は効果的に負荷を分散できません。
解決策:
PTS の IP 拡張機能を有効にして、ソース IP の数を増やしてください。詳細については、「シナリオの開始」をご参照ください。
仮想ユーザーの最大数または RPS (秒間リクエスト数) の値を増やしてください。詳細については、「負荷モデルとレベルの設定」をご参照ください。
長時間接続から短時間接続に切り替えます。[シナリオ設定] ページの [ヘッダー定義] タブに、次のヘッダーを追加します。
キー:Connection値:close説明新しく追加された API は、デフォルトでこの設定を継承します。シナリオで混合接続モードが必要な場合は、API ごとに調整してください。
504 (ゲートウェイタイムアウト)
原因:ゲートウェイがバックエンドサーバーから時間内にレスポンスを受信しなかったことを意味します。
解決策:
バックエンドサーバーが正常に稼働しており、リクエストを通常通り処理していることを確認してください。
ゲートウェイ層でタイムアウト期間を延長してください。
[シナリオの作成] ページの [Advanced Settings] セクションでリクエストタイムアウトを延長し、負荷生成側により多くの時間を与えてください。