このトピックでは、アプリケーションが Microservices Engine (MSE) Nacos インスタンスに接続しようとしたときに発生する可能性のある接続タイムアウトの問題のトラブルシューティング方法について説明します。
問題の説明
アプリケーションが MSE Nacos インスタンスに接続しようとすると、次のエラーメッセージが返される場合があります。
接続がタイムアウトしました
読み取りタイムアウト
TimeoutException: 3000 ミリ秒待機しました
考えられる原因
接続タイムアウトの問題は、次の原因で発生する可能性があります。
クライアントとサーバー間のネットワーク転送が失敗します。その結果、クライアントからサーバーにリクエストを送信できないか、サーバーからのレスポンスをクライアントに返却できません。場合によっては、サーバーのリクエスト処理速度が遅い場合にも、クライアントは接続タイムアウトの問題が発生していると見なします。
パブリックエンドポイントへのアクセスが、ネットワークアクセス制御リスト (ACL) によってブロックされています。
仮想プライベートネットワーク (VPN) が使用されていますが、VPN 設定が無効です。
クライアントの処理スレッドがブロックされているか異常であるか、フルガベージコレクション (GC)、メモリ不足 (OOM) エラー、または CPU リソースのプリエンプションが原因で、クライアントがサーバーからのデータパケットをできるだけ早く処理できません。その結果、クライアントは接続タイムアウトの問題が発生していると見なします。
解決策
クライアントノードの 1 つだけで接続タイムアウトエラーが報告された場合は、クライアントノードと MSE Nacos インスタンス間のネットワーク転送が失敗したか、クライアントノードが異常であるかブロックされている可能性があります。
この場合は、
ping、telnet、curlなどのコマンドを障害のあるクライアントノードで実行して、MSE Nacos インスタンスにアクセスします。クライアントのメトリックデータを表示して、CPU 負荷が高すぎる、頻繁なフル GC、OOM などの問題が発生していないかどうかを確認します。問題が発生した場合、ネットワーク転送は失敗します。ping ${mse.nacos.host} telnet ${mse.nacos.host} 8848 curl ${mse.nacos.host}:8848/nacos/v1/ns/service/listパブリックエンドポイントを使用している場合は、パブリックエンドポイントへのアクセスが ACL によってブロックされていないかどうかを確認します。
パブリックエンドポイントへのアクセスが ACL によってブロックされているかどうかの確認方法については、「パブリック IP アドレスのホワイトリストの構成」をご参照ください。
内部エンドポイントを使用する場合は、アプリケーションが MSE Nacos インスタンスと同じリージョンと同じ VPC にデプロイされているかどうかを確認します。アプリケーションと MSE Nacos インスタンスが異なるリージョンにデプロイされている場合、または異なる VPC に属している場合は、MSE Nacos インスタンスが存在するリージョンまたは VPC にアプリケーションをデプロイする必要があります。また、Cloud Enterprise Network (CEN) を使用して、VPC 間の接続を確立することもできます。 CEN の詳細については、CEN とはをご参照ください。
MSE コンソールの [基本情報] ページで、MSE Nacos インスタンスが存在するリージョンと、内部エンドポイントに対応する VPC ID を表示できます。
VPN を使用している場合は、VPN 設定が有効かどうかを確認します。 VPN 設定が無効な場合は、VPN を無効にするか、VPN 設定を変更して、再試行してください。
すべてのクライアントノードで接続タイムアウトエラーが報告された場合は、MSE コンソールの [監視センター] ページに移動し、MSE Nacos インスタンスのメトリックデータを表示します。
監視センター ページで MSE Nacos インスタンスのメトリックデータを表示する方法については、エンジンの監視をご参照ください。
[概要] タブで、MSE Nacos インスタンスの [1 秒あたりのクエリ数] または [1 秒あたりの操作数] の値が 1 秒あたりのトランザクション数 (TPS) 値を超えているかどうかを確認します。
さまざまな仕様に対応する TPS 値については、一般的なインスタンスの機能の推定をご参照ください。
[接続数の監視] タブで、クライアントバージョンの数または [ロングリンクの数] の値が接続数を超えているかどうかを確認します。
さまざまな仕様に対応する接続数については、一般的なインスタンスの機能の推定をご参照ください。
[jvm 監視] タブで、[フル GC] が頻繁に実行されていないかどうかを確認します。
説明[データなし] と表示されている場合は、フル GC は実行されていません。
MSE Nacos インスタンスのネットワークタイプがインターネットの場合は、[リソース監視] タブをクリックし、[受信トラフィック] または [送信トラフィック] が、MSE Nacos インスタンスの購入時に指定した帯域幅を超えていないかどうかを確認します。
[リソース監視] タブで、[メモリ使用量] または [CPU 負荷] が 100% に近いか、超えていないかどうかを確認します。メモリ使用量または CPU 負荷が 100% に近いか超えている場合は、スロットリングがトリガーされます。インスタンスの仕様を変更して、MSE Nacos インスタンスの構成をアップグレードしてみてください。
インスタンス仕様の変更方法については、インスタンス仕様の変更をご参照ください。
接続タイムアウトの問題が断続的に発生する場合は、タイムアウト期間を長く設定して問題を防ぎます。
Java クライアントのバージョンが 1.0.0 ~ 1.4.X の場合は、アプリケーションプロセスの Java 仮想マシン (JVM) パラメータに次のパラメータを追加します。
-D com.alibaba.nacos.client.naming.ctimeout=${レジストリの接続タイムアウト期間。単位: ミリ秒。デフォルト値: 3000} -D com.alibaba.nacos.client.naming.rtimeout=${レジストリの要求タイムアウト期間。単位: ミリ秒。デフォルト値: 50000} -D NACOS.CONNECT.TIMEOUT=${構成センターの接続タイムアウト期間。単位: ミリ秒。デフォルト値: 1000}Java クライアントのバージョンが 2.0.0 ~ 2.1.1 の場合は、Java クライアントのバージョンを 2.1.2 以降にアップグレードしてから、タイムアウト期間を設定します。
Java クライアントのバージョンが 2.1.2 以降の場合は、アプリケーションプロセスの JVM パラメータに次のパラメータを追加します。
-Dnacos.remote.client.grpc.timeout=${要求タイムアウト期間。単位: ミリ秒。デフォルト値: 3000} ## 接続されているサーバーが正常かどうかを確認します。接続されているサーバーが異常な場合は、サーバーをクライアントに再接続します。 -Dnacos.remote.client.grpc.server.check.timeout=${サーバーヘルスチェックのタイムアウト期間。単位: ミリ秒。デフォルト値: 3000} ## 接続が正常かどうかを確認します。接続が異常な場合は、サーバーをクライアントに再接続します。 -Dnacos.remote.client.grpc.health.timeout=${接続ヘルスチェックのタイムアウト期間。単位: ミリ秒。デフォルト値: 3000}