このトピックでは、パフォーマンス テスト サービス (PTS) の使用時に発生する可能性のあるエラーの考えられる原因と解決策について説明します。
一般的なエラーメッセージ
class java.net.ConnectException:null
TCP 接続の確立を試行しているときに、テスト対象エンドでリクエストが失敗したか拒否されました。バックエンドサーバーのヘルスステータスを確認し、ネットワーク接続にボトルネックが発生していないかを評価します。
org.apache.http.ConnectionClosedException:Connection closed
サーバーが異常終了しました。
org.apache.hc.core5.http.ConnectionClosedException:Connection is closed
サーバーによって終了された接続でリクエストが開始されました。ゲートウェイ層の帯域幅を確認し、ネットワーク接続にボトルネックが発生していないかを評価します。
java.io.IOException:Connection reset by peer
バックエンドサーバーが接続をリセットしました。サーバーロードバランサー (SLB) を使用している場合は、SLB の設定を確認してください。
org.apache.http.ConnectionClosedException:Connection closed unexpectedly
データを受信する前に接続が終了しました。サーバーが予想される時間内に応答できなかったか、デバッグまたはストレステストが予想よりも早く停止された可能性があります。
java.lang.RuntimeException:java.net.UnknownHostException
ドメイン名を解決できません。ドメイン名が正しく登録されていて解決できるかどうか、および未登録のドメイン名がバインドされているかどうかを確認します。
org.apache.http.client.CircularRedirectException
リクエストがループでリダイレクトされる (A -> B -> C -> A) か、10 回以上リダイレクトされます (A1 -> A2 -> A3... -> A10 -> A11)。この場合、302 リダイレクトを無効にして、ストレステストを再度実行し、元の要求情報を表示することをお勧めします。タイミングウォーターフォールフローを使用して、特定のリダイレクトパスを表示することもできます。
[シナリオ設定] ページで、302 リダイレクトを許可 スイッチをオフにします。
タイミングウォーターフォールフローで特定のリダイレクトパスを表示する: ストレステストレポートのサンプリングログの詳細でタイミングウォーターフォールフローを表示できます。詳細については、「ストレステスト結果の分析」をご参照ください。
org.apache.hc.core5.http.ProtocolException:Header 'key: value' is illegal for HTTP/2 messages
サーバーが優先的に HTTP/2 プロトコルを使用するシナリオで、HTTP/2 プロトコルでサポートされていないヘッダーが構成されています。対応するヘッダーを削除して、再試行してください。HTTP/2 は、Connection、Keep-Alive、Proxy-Connection、Transfer-Encoding、Host、および Upgrade ヘッダーをサポートしていません。
java.nio.channels.CancelledKeyException:null
バックエンドサーバーが HTTP/2 プロトコルで接続を終了しました。バックエンドサーバーのトラブルシューティングを行ってください。
java.util.concurrent.TimeoutException:null
接続がタイムアウトしました。TCP 接続の確立を試行しているときに、テスト対象エンドでリクエストが失敗したか拒否されました。タイミングウォーターフォールフローを使用して、接続フェーズに時間がかかっているかどうかを確認できます。バックエンドサーバーのヘルスステータスを確認し、ネットワーク接続にボトルネックが発生していないかを評価します。
org.apache.hc.core5.http2.H2StreamResetException:Timeout due to inactivity (5000 MILLISECONDS) * class
バックエンドサーバーからの応答がタイムアウトしました。デフォルトの要求タイムアウト期間は 5 秒です。シナリオ作成ページの [詳細設定] セクションで要求タイムアウト期間を延長できます。
java.net.SocketTimeoutException:null
応答を待機している間、またはデータの読み取り中 (アイドル) にリクエストがタイムアウトしました。サーバーが正常かどうか、ストレステスト用 API のタイムアウト期間が適切かどうか、サーバーにパフォーマンスボトルネックがあるかどうかを確認します。
java.lang.RuntimeException: Could not find the TestPlan class!
JMeter スクリプトは、PTS でサポートされている JMeter バージョンと互換性がありません。JMeter V5.0 を使用してスクリプトを編集してください。
java.lang.SecurityException: class "xxx"'s signer information does not match signer information of other classes in the same package
JMeter スクリプトの Java サンプラー依存関係の ApacheJMeter_core または ApacheJMeter_java バージョンが、PTS でサポートされている JMeter V5.0 と互換性がありません。JMeter V5.0 を使用して依存関係を JAR パッケージに再パッケージ化し、再試行してください。
Attempt to resolve method: xxx() on undefined variable or class name:
JMeter スクリプトが依存している BeanShell サンプラーのクラスがアップロードされていません。関連する JAR パッケージをアップロードして、再試行してください。
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 アドレスを使用するか、PTS コンソール にログインしてドメイン名を内部 IP アドレスにバインドする必要があります。
一般的なエラーコード
403 (Forbidden)
403 エラーコードが返されるのは、API にアクセスする権限がなく、サーバーはリクエストを受信したもののサービスの提供を拒否したためです。
ストレステストシナリオを選択し、[アクション] 列の [編集] をクリックします。[シナリオ設定] ページの [ヘッダー定義] タブで、次の図に示すように、一般的な 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
[デバッグ] をクリックします。[リクエストの詳細] ページで、リクエストが正常かどうかを確認します。UA を変更した後にリクエストが正常な場合、エラーは UA 検証が原因です。この場合、UA を変更することでストレステストを続行できます。
考えられる原因 3
リクエストが Web アプリケーションファイアウォール (WAF) によってブロックされています。この理由で 403 エラーが返されるのはまれなケースのみです。
解決策
WAF ホワイトリストが必要な場合は、PTS トラフィックを許可するルールを構成する必要があります。詳細については、「セキュリティポリシーによりストレステストトラフィックが Web アプリケーションにアクセスできない場合はどうすればよいですか?」をご参照ください。
考えられる原因 4
ストレステストのドメイン名が登録されていないか、ドメイン名が登録されていない別のドメイン名に解決されています。
解決策: 返された結果に基づいて、ドメイン名が登録されているかどうかを確認します。403 エラーが発生し、次の HTML 情報が返された場合、ドメイン名は登録されていません。この場合、最初にドメイン名の ICP 登録を申請する必要があります。
<html> <head> <meta http-equiv="Content-Type" content="textml;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>
考えられる原因 1
サーバーのバックエンド認証設定により、リクエストが受け入れられませんでした。この場合、エラーはバックエンドサービスが原因です。
解決策: サービスの認証メカニズムを確認します。
考えられる原因 2
サーバーゲートウェイがリクエストヘッダーの User-Agent
(UA) に対して強力な検証を実行します。UA が無効な場合、サーバーゲートウェイは必要な権限がないことを示すエラーメッセージを返します。PTS によって開始されたリクエストのデフォルト UA には特殊文字が含まれているため、一部のサービスは統計トラフィックとスロットルルールを区別できます。
解決策
PTS コンソール にログインし、 を選択します。
405 (Method Not Allowed)
405 エラーは、次の理由で発生する可能性があります。
POST リクエストで 302 リダイレクトが発生します。302 リダイレクトが発生すると、リクエストメソッドが変更されます。この場合、サーバーはリクエストメソッドを認識できない可能性があります。そのため、405 エラーが返されます。
リクエストサーバーがメソッドを直接検証し、対応するレスポンスヘッダーに
Allow=GET
情報が含まれています。SLB インスタンスまたは Web サーバーを転送に使用する場合、リクエストメソッドを変更しますが、バックエンドサーバーは変更を認識できません。
406 (Not Acceptable)
クライアントエラーが発生しました。リクエストされたリソースの内容がリクエストヘッダーの条件を満たすことができないため、レスポンスエンティティを生成できません。
考えられる原因
リクエストの [ヘッダー定義] タブで構成された Accept
フィールドが無効なため、デバッグ中に 406 エラーが発生します。
Accept
: 送信者が受け入れることを期待するデータのタイプ。この例では、送信者は PTS です。Content-Type
: 送信者 (PTS) によって送信されるデータのタイプ。コンテンツタイプ
本文定義[シナリオ設定] ページの ヘッダー定義Accept
ヘッダー定義 タブで構成した Content-Type は、 タブに自動的に同期されます。 タブで構成された フィールドが合意されたコンテンツと一致しない場合、406 エラーが返されます。
解決策
サーバーが Accept タイプを検証できることを確認します。各 Accept
タイプに異なる 値
を設定することで、サーバーが検証できる Accept
タイプを確認できます。次の表に、Accept
ヘッダーのフォーマットタイプと一致順序を示します。
表 1. Accept
ヘッダーのフォーマットタイプ
フォーマットタイプ | フォーマットタイプ |
| HTML 形式 |
| プレーンテキスト形式 |
| XML 形式 |
| GIF 画像形式 |
| JPG 画像形式 |
| PNG 画像形式 |
| XHTML 形式 |
| XML データ形式 |
| Atom XML 集約形式 |
| JSON データ形式 |
| PDF 形式 |
| Word 文書形式 |
| バイナリデータストリーム。一般的なファイルダウンロードなど。 |
|
|
次の Accept ヘッダーが構成されている場合: | 生成物は次の順序で一致します。
|
次の Accept ヘッダーが構成されている場合: | 生成物は次の順序で一致します。
説明 application/xml パラメーターは、メディアタイプの品質係数です。数値が大きいほど優先順位が高くなります (0 から 1)。 |
次の Accept ヘッダーが構成されている場合: | 生成物は次の順序で一致します。
|
503 (Service Unavailable)
考えられる原因 1
バックエンドサーバーは、トラフィックの過負荷によりリクエストの受信を拒否します。
解決策: バックエンドサーバーに関連するエラーログが存在するかどうかを確認します。
考えられる原因 2
PTS のサンプリングログの詳細に多数の 503 エラーが表示されますが、バックエンドサーバーに関連情報が見つかりません。ストレステストシナリオで次の条件が満たされている場合、エラーは SLB によって返されます。
HTTP または HTTPS API が使用されています。
ストレステスト環境のエントリポイントは SLB インスタンス (インターネット向け SLB インスタンスまたは内部向け 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>
ストレステストを開始する送信元 IP アドレスが制限されている可能性があります。単一の IP アドレスが SLB クラスタの単一プロキシ調整をトリガーします。または、リクエスト元のクライアントの接続はデフォルトで長期間接続されています。IP アドレスの数が少ない場合、SLB は負荷を完全に分散できません。
説明デフォルトでは、PTS とサーバーの間に長期間接続が確立されます。
解決策
PTS によって提供される IP 拡張機能を使用します。詳細については、「シナリオの開始」をご参照ください。
仮想ユーザーの最大数または 1 秒あたりのリクエスト数 (RPS) を大きい値に設定します。詳細については、「負荷モデルとレベルの構成」をご参照ください。
[シナリオ設定] ページで、[ヘッダー定義] タブのリクエストに
Connection:close
を構成します。構成が完了すると、新しく追加された API はデフォルトで構成を使用します。ビジネス要件に基づいて構成を変更できます。
504 (BadGateway Timeout)
考えられる原因
ゲートウェイに接続されているサーバーからの応答がタイムアウトしました。
解決策
バックエンドサーバーが想定どおりにサービスを提供しているかどうかを確認します。次に、ゲートウェイのタイムアウト期間を延長するか、シナリオ作成ページの [詳細設定] セクションで負荷ジェネレーターの要求タイムアウト期間を延長できます。