アプリケーションが Microservices Engine (MSE) Nacos インスタンスへの接続に失敗すると、アプリケーションログに次のエラーメッセージが表示されることがあります。
Connection timed outRead TimeoutTimeoutException: Waited 3000 milliseconds以降のセクションを参照して、ネットワーク障害からクライアント側のリソース枯渇まで、それぞれの根本原因を診断し、解決してください。
事前準備
タイムアウトが単一のクライアントノードに影響しているか、すべてのクライアントノードに影響しているかを判断します。この区別により、調査の範囲を絞り込むことができます。
単一ノード -- 問題は、そのノードのネットワーク関連またはリソース枯渇が原因である可能性が高いです。「ネットワーク接続の確認」から開始してください。
すべてのノード -- 問題は、サーバー側 (容量制限、リソースの飽和、またはアクセス制御の設定ミス) が原因である可能性が高いです。「サーバー側のメトリックの確認」から開始してください。
ネットワーク接続の確認
単一のクライアントノードのみがタイムアウトを報告する場合、そのノードが MSE Nacos インスタンスに到達できることを確認してください。
影響を受けるノードで次のコマンドを実行します。${mse.nacos.host} を、ご利用の MSE Nacos インスタンスのエンドポイントに置き換えてください。
ping ${mse.nacos.host}
telnet ${mse.nacos.host} 8848
curl ${mse.nacos.host}:8848/nacos/v1/ns/service/list結果の解釈:
| コマンド | 成功 | 失敗 |
|---|---|---|
ping | 往復レイテンシで応答します | Request timeout または 100% のパケット損失 |
telnet | Connected to ... | Connection timed out または Connection refused |
curl | サービスリストを含む JSON 応答を返します | curl: (7) Failed to connect または curl: (28) Connection timed out |
いずれかのコマンドが失敗した場合、クライアントと MSE Nacos インスタンス間のネットワークパスに問題があります。以降のセクションに進み、原因を特定してください。
ACL によるパブリックエンドポイントのブロック
アプリケーションがパブリックエンドポイント経由で接続する場合、アクセス制御リスト (ACL) によってトラフィックがブロックされている可能性があります。
クライアントの IP アドレスがホワイトリストに含まれていることを確認してください。手順については、「パブリック IP アドレスホワイトリストの設定」をご参照ください。
VPC またはリージョンの不一致 (内部エンドポイント)
アプリケーションが内部エンドポイント経由で接続する場合、MSE Nacos インスタンスと同じ VPC および同じリージョンにデプロイされている必要があります。
ご利用の MSE Nacos インスタンスのリージョンと VPC ID を確認するには、MSE コンソールの [基本情報] ページに移動します。
アプリケーションと MSE Nacos インスタンスが異なる VPC またはリージョンにある場合は、次のいずれかのアプローチを選択してください。
MSE Nacos インスタンスが存在する VPC とリージョンにアプリケーションを再デプロイします。
Cloud Enterprise Network (CEN) を使用して 2 つの VPC を接続します。詳細については、「CEN とは」をご参照ください。
無効な VPN 設定
仮想プライベートネットワーク (VPN) を使用している場合は、VPN トンネルがアクティブであり、ルーティングルールが正しいことを確認してください。設定が無効な場合は、VPN を無効にするか、構成を更新してから、接続を再試行してください。
クライアント側のリソース枯渇
ネットワークが正常であっても、ローカルのリソース負荷が原因で、クライアントが時間内に応答を処理できない場合があります。影響を受けるノードで次のメトリックを確認してください。
CPU 負荷 -- 持続的な高い CPU 使用率は、パケット処理を遅延させます。
フルガベージコレクション (フル GC) -- Java 仮想マシン (JVM) での頻繁なフル GC は、長い停止時間を引き起こします。
メモリ不足 (OOM) -- OOM エラーが発生すると、クライアントは受信データ用のバッファーを割り当てることができなくなります。
これらのいずれかの条件が存在する場合、さらなる調査の前に、クライアントノードのリソース問題を解決してください。
サーバー側のメトリックの確認
すべてのクライアントノードがタイムアウトを報告する場合、MSE Nacos インスタンス自体に負荷がかかっている可能性があります。MSE コンソールの [モニタリングセンター] ページを開き、次のメトリックを検査します。詳細については、「エンジンのモニタリング」をご参照ください。
QPS と 1 秒あたりの操作数
[概要]タブで、[クエリ/秒]または[操作/秒]がインスタンスの仕様に対するトランザクション/秒(TPS)制限を超えているかどうかを確認します。
仕様ごとの TPS 制限については、「インスタンス性能の見積もり」をご参照ください。
接続数の確認
[接続数のモニタリング] タブで、[クライアントバージョン数] または [長時間接続数] が、お使いのインスタンスの仕様に対する接続制限を超えているかどうかを確認します。
仕様ごとの接続数制限については、「インスタンス性能の見積もり」をご参照ください。
JVM のヘルス状態
[JVM 監視] タブで、[フル GC] が頻繁に実行されているかどうかを確認してください。
[データなし] と表示されている場合、フル GC は発生していません。
ネットワーク帯域幅 (インターネットネットワークタイプのみ)
MSE Nacos インスタンスがインターネットネットワークタイプを使用している場合、「[リソースモニタリング]」タブを開き、[インバウンドトラフィック] または [アウトバウンドトラフィック] がインスタンスで購入した帯域幅を超えているかどうかを確認します。
CPU とメモリの使用率
[リソースモニタリング] タブで、[メモリ使用量] または [CPU 負荷] が 100% に近いか、100% を超えているかどうかを確認します。使用率が高いと、速度制限がトリガーされ、タイムアウトが発生します。
これを解決するには、インスタンスの仕様をスペックアップします。手順については、「インスタンス仕様の変更」をご参照ください。
断続的なタイムアウトに対するタイムアウトパラメーターの設定
タイムアウトが断続的にのみ発生し、上記の根本原因が除外されている場合は、クライアント側のタイムアウト値を増やしてください。
JVM パラメーターは、Nacos Java クライアントのバージョンによって異なります。
バージョン 1.0.0 から 1.4.x
次の JVM パラメーターをアプリケーションプロセスに追加します。
-Dcom.alibaba.nacos.client.naming.ctimeout=<connection-timeout-ms>
-Dcom.alibaba.nacos.client.naming.rtimeout=<request-timeout-ms>
-DNACOS.CONNECT.TIMEOUT=<config-center-connection-timeout-ms>| パラメーター | 説明 | デフォルト値 |
|---|---|---|
com.alibaba.nacos.client.naming.ctimeout | サービスレジストリの接続タイムアウト (ms) | 3000 |
com.alibaba.nacos.client.naming.rtimeout | サービスレジストリのリクエストタイムアウト (ms) | 50000 |
NACOS.CONNECT.TIMEOUT | 設定センターの接続タイムアウト (ms) | 1000 |
バージョン 2.0.0 から 2.1.1
これらのバージョンでは、設定可能なタイムアウトパラメーターはサポートされていません。Java クライアントをバージョン 2.1.2 以降にアップグレードし、次のセクションで説明するパラメーターを設定してください。
バージョン 2.1.2 以降
次の JVM パラメーターをアプリケーションプロセスに追加します。
-Dnacos.remote.client.grpc.timeout=<request-timeout-ms>
-Dnacos.remote.client.grpc.server.check.timeout=<server-health-check-timeout-ms>
-Dnacos.remote.client.grpc.health.timeout=<connection-health-check-timeout-ms>| パラメーター | 説明 | デフォルト値 |
|---|---|---|
nacos.remote.client.grpc.timeout | gRPC リクエストタイムアウト (ms) | 3000 |
nacos.remote.client.grpc.server.check.timeout | サーバーヘルスチェックのタイムアウト。サーバーが異常な場合、クライアントは再接続します。(ms) | 3000 |
nacos.remote.client.grpc.health.timeout | 接続ヘルスチェックのタイムアウト。接続が異常な場合、クライアントは再接続します。(ms) | 3000 |