全部產品
Search
文件中心

Tablestore:使用Java SDK訪問Table Store時出現SocketTimeoutException異常

更新時間:Nov 15, 2024

由於網路不通或網路抖動、伺服器高負載、用戶端Full GC等原因可能會導致用戶端訪問Table Store逾時。當出現用戶端訪問逾時的問題時,您需要通過檢查網路連通性、伺服器延遲、用戶端是否出現Full GC問題等操作來解決該問題。

問題現象

使用Java SDK訪問Table Store時出現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的值。socketTimeoutInMillisecond的預設值為30000,單位為毫秒。

說明

在正常情況下,不建議將socketTimeoutInMillisecond的值設定得過小。您可以在ClientConfiguration中設定socketTimeoutInMillisecond的值。

出現此問題的可能原因如下:

  • 用戶端出現Full GC問題。

  • 網路問題,例如網路不同或者網路抖動。

  • 服務端延遲過高,大於socketTimeoutInMillisecond的值。

解決方案

  1. 確認用戶端中是否出現Full GC問題。

    通過jmap、jcmd等工具排查JVM,確認JVM的記憶體佔用情況,確認是否出現記憶體溢出OOM。

    如果出現OOM,則會導致HttpClient背景IO線程直接退出。請根據以下方式進行處理。

    • 如果存在不合理的記憶體使用量或記憶體流失問題,請最佳化代碼。

    • 如果記憶體使用量合理但是機器資源不足,請擴容記憶體。

    • 如果機器空閑且記憶體佔用較少,請調大JVM的堆記憶體,降低問題發生的機率。

    另外,當機器的負載較高、網路異常率高、CPU使用率高時,也會出現SocketTimeoutException錯誤,一般是請求可能還未發出就已逾時。

  2. 排查用戶端與服務端的網路連通性。

    如果全部請求都出現SocketTimeoutException,則可能是網路不通,您可以通過ping或者curl命令測試是否為網路問題。

    測試樣本如下,其中myinstance為Table Store執行個體名稱。

    ping myinstance.cn-hangzhou.ots.aliyuncs.com
    curl myinstance.cn-hangzhou.ots.aliyuncs.com
    • 如果發現是網路不通,則可能是在非ECS環境中使用了內網的Endpoint,請使用合適的Endpoint。關於Endpoint的更多資訊,請參見服務地址

      如果用戶端從ECS環境中訪問Table Store,建議用戶端通過專用網路或者傳統網路訪問Table Store。

    • 如果網路可連通,則可能是網路抖動導致整體延遲長,請檢查是否存在流量過高、頻寬吃緊、網路重傳率高等情況。如果網路抖動較大,請聯絡網路相關技術支援人員排查處理。

  3. 通過Table Store控制台確認服務端延遲是否過高。具體步驟如下:

    1. 登入Table Store控制台

    2. 在頁面頂部選擇資源群組和地區。

    3. 概覽頁面的執行個體列表中,單擊執行個體名稱。

    4. 執行個體詳情頁簽的資料表列表地區,單擊資料表名稱。

    5. 表管理頁面的監控指標頁簽中,選擇表或索引,指定時間範圍,並選擇指標分組平均訪問延遲,即可查看不同操作類型的平均訪問延遲資訊。

      如果服務端延遲大於socketTimeoutInMillisecond的值,請提交工單聯絡Table Store支援人員。

      fig_20220217_mointor