由於網路不通或網路抖動、伺服器高負載、用戶端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的值。
解決方案
確認用戶端中是否出現Full GC問題。
通過jmap、jcmd等工具排查JVM,確認JVM的記憶體佔用情況,確認是否出現記憶體溢出OOM。
如果出現OOM,則會導致HttpClient背景IO線程直接退出。請根據以下方式進行處理。
如果存在不合理的記憶體使用量或記憶體流失問題,請最佳化代碼。
如果記憶體使用量合理但是機器資源不足,請擴容記憶體。
如果機器空閑且記憶體佔用較少,請調大JVM的堆記憶體,降低問題發生的機率。
另外,當機器的負載較高、網路異常率高、CPU使用率高時,也會出現SocketTimeoutException錯誤,一般是請求可能還未發出就已逾時。
排查用戶端與服務端的網路連通性。
如果全部請求都出現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。
如果網路可連通,則可能是網路抖動導致整體延遲長,請檢查是否存在流量過高、頻寬吃緊、網路重傳率高等情況。如果網路抖動較大,請聯絡網路相關技術支援人員排查處理。
通過Table Store控制台確認服務端延遲是否過高。具體步驟如下:
在頁面頂部選擇資源群組和地區。
在概覽頁面的執行個體列表中,單擊執行個體名稱。
在執行個體詳情頁簽的資料表列表地區,單擊資料表名稱。
在表管理頁面的監控指標頁簽中,選擇表或索引,指定時間範圍,並選擇指標分組為平均訪問延遲,即可查看不同操作類型的平均訪問延遲資訊。
如果服務端延遲大於socketTimeoutInMillisecond的值,請提交工單聯絡Table Store支援人員。
