ネットワーク障害、ネットワークジッター、サーバー側の高負荷、またはクライアント側でのフルガベージコレクション (GC) イベントにより、Tablestore へのアクセス時にクライアントがタイムアウトすることがあります。クライアントがタイムアウトした場合は、ネットワーク接続、サーバー側のレイテンシー、およびクライアント側のフル GC の問題を確認してトラブルシューティングを行ってください。
症状
Java SDK を使用して Tablestore にアクセスする際に、Unexpected error: java.net.SocketTimeoutException というエラーが発生する場合があります。以下はエラーメッセージの例です。
content: 11:56:48.072 WARN com.alicloud.openservices.tablestore.core.utils.LogUtil - TraceId:4bc30ca1-f112-2d52-d8b1-61a95072eda5 Failed RetriedCount:1 com.alicloud.openservices.tablestore.ClientException: Unexpected error: java.net.SocketTimeoutException
原因
このエラーは、リクエストからレスポンスまでの時間が socketTimeoutInMillisecond パラメーターの値を超えた場合に発生します。このパラメーターのデフォルト値は 30,000 ミリ秒です。
通常の条件下では、socketTimeoutInMillisecond の値を過度に低く設定しないでください。ClientConfiguration でこの値を設定できます。
考えられる原因は以下のとおりです。
-
クライアントでフル GC イベントが発生している。
-
ネットワーク障害やネットワークジッターなどのネットワーク問題が発生している。
-
サーバー側のレイテンシーが高くなり、
socketTimeoutInMillisecondの値を超えている。
ソリューション
-
クライアント側のフル GC の問題を確認します。
jmap や jcmd などのツールを使用して JVM のメモリ使用量を確認し、メモリ不足 (OOM) エラーがないかをチェックします。
OOM エラーが発生すると、HttpClient のバックグラウンド I/O スレッドが予期せず終了する可能性があります。これを解決するには、以下のいずれかの対応を行ってください。
メモリ使用量が異常である、またはメモリリークが存在する場合は、コードを最適化します。
メモリ使用量は妥当だがマシンのリソースが不足している場合は、使用可能なメモリを増やします。
マシンがアイドル状態でメモリ使用量が低い場合は、JVM ヒープメモリを増やしてフル GC イベントの発生頻度を下げます。
また、マシンの負荷が高い、ネットワークエラー率が高い、または CPU 使用率が高い場合にも
SocketTimeoutExceptionが発生することがあります。このような状況では、リクエストが送信される前にタイムアウトする可能性があります。 -
クライアントとサーバー間のネットワーク接続を確認します。
すべてのリクエストで
SocketTimeoutExceptionが発生する場合は、ネットワーク障害が原因である可能性が高いです。pingコマンドまたはcurlコマンドを使用してネットワークの問題をテストします。以下の例はテストの実行方法を示しています。
myinstanceはご利用の Tablestore インスタンス名に置き換えてください。ping myinstance.cn-hangzhou.ots.aliyuncs.com curl myinstance.cn-hangzhou.ots.aliyuncs.com-
ネットワーク障害が確認された場合は、ECS 環境外で内部エンドポイントを使用している可能性があります。正しいエンドポイントを使用していることを確認してください。エンドポイントの詳細については、「エンドポイント」をご参照ください。
クライアントが ECS インスタンスから Tablestore にアクセスする場合は、VPC またはクラシックネットワーク経由で接続します。
-
ネットワーク接続は確立されているがタイムアウトが継続する場合は、ネットワークジッターによってレイテンシーが高くなっている可能性があります。トラフィック量の増加、帯域幅の不足、パケット再送率の上昇がないかを確認してください。著しいネットワークジッターが検出された場合は、ネットワークサポートに連絡してください。
-
-
Tablestore コンソールでサーバー側のレイテンシーを確認するには、次の手順に従います。
-
Tablestore コンソールにログインします。
-
上部のナビゲーションバーでリソースグループとリージョンを選択します。
-
概要ページで、インスタンス一覧からご利用のインスタンス名をクリックします。
-
インスタンスの詳細タブのテーブルリストエリアで、データテーブル名をクリックします。
-
テーブル管理ページで、モニタリングタブをクリックします。その後、テーブルまたはインデックスを選択し、時間範囲を指定して、区分を平均レイテンシに設定し、操作タイプごとの平均レイテンシーを確認します。
サーバー側のレイテンシーが
socketTimeoutInMillisecondの値を超えている場合は、Tablestore テクニカルサポートにチケットを送信してください。
-