使用Java SDK访问表格存储时出现SocketTimeoutException异常

由于网络不通或网络抖动、服务器高负载、客户端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的值。

解决方案

  1. 确认客户端中是否出现Full GC问题。

    通过jmap、jcmd等工具排查JVM,确认JVM的内存占用情况,确认是否出现内存溢出OOM。

    如果出现OOM,则会导致HttpClient后台的IO线程直接退出。请根据以下方式进行处理。

    • 如果存在不合理的内存使用或内存泄露问题,请优化代码。

    • 如果内存使用合理但是机器资源不足,请扩容内存。

    • 如果机器空闲且内存占用较少,请调大JVM的堆内存,降低问题发生的概率。

    另外,当机器的负载较高、网络异常率高、CPU使用率高时,也会出现SocketTimeoutException错误,一般是请求可能还未发出就已超时。

  2. 排查客户端与服务端的网络连通性。

    如果全部请求都出现SocketTimeoutException,则可能是网络不通,您可以通过ping或者curl命令测试是否为网络问题。

    测试示例如下,其中myinstance为表格存储实例名称。

    ping myinstance.cn-hangzhou.ots.aliyuncs.com
    curl myinstance.cn-hangzhou.ots.aliyuncs.com
    • 如果发现是网络不通,则可能是在非ECS环境中使用了内网的Endpoint,请使用合适的Endpoint。关于Endpoint的更多信息,请参见服务地址

      如果客户端从ECS环境中访问表格存储,建议客户端通过专有网络或者经典网络访问表格存储。

    • 如果网络可连通,则可能是网络抖动导致整体延迟长,请检查是否存在流量过高、带宽吃紧、网络重传率高等情况。如果网络抖动较大,请联系网络相关技术支持人员排查处理。

  3. 通过表格存储控制台确认服务端延迟是否过高。具体步骤如下:

    1. 登录表格存储控制台

    2. 在页面顶部选择资源组和地域。

    3. 概览页面的实例列表中,单击实例名称。

    4. 实例详情页签的数据表列表区域,单击数据表名称。

    5. 表管理页面的监控指标页签中,选择表或索引,指定时间范围,并选择指标分组平均访问延迟,即可查看不同操作类型的平均访问延迟信息。

      如果服务端延迟大于socketTimeoutInMillisecond的值,请提交工单联系表格存储技术支持。

      fig_20220217_mointor