由于网络不通或网络抖动、服务器高负载、客户端Full GC等原因可能会导致客户端访问表格存储超时。当出现客户端访问超时的问题时,您需要通过检查网络连通性、服务器延迟、客户端是否出现Full GC问题等操作来解决该问题。
问题现象
使用Java SDK访问表格存储时出现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为表格存储实例名称。
ping myinstance.cn-hangzhou.ots.aliyuncs.com curl myinstance.cn-hangzhou.ots.aliyuncs.com
如果发现是网络不通,则可能是在非ECS环境中使用了内网的Endpoint,请使用合适的Endpoint。关于Endpoint的更多信息,请参见服务地址。
如果客户端从ECS环境中访问表格存储,建议客户端通过专有网络或者经典网络访问表格存储。
如果网络可连通,则可能是网络抖动导致整体延迟长,请检查是否存在流量过高、带宽吃紧、网络重传率高等情况。如果网络抖动较大,请联系网络相关技术支持人员排查处理。
通过表格存储控制台确认服务端延迟是否过高。具体步骤如下: