Tablestore-OTSClient连接池连接无法复用分析

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
可观测可视化 Grafana 版,10个用户账号 1个月
性能测试 PTS,5000VUM额度
简介: 某应用在压测过程中,发现OTSClient与OTS服务端之间的TCP连接有大量处于TIME_WAIT状态。

问题现象

某应用在压测过程中,发现OTSClient与OTS服务端之间的TCP连接有大量处于TIME_WAIT状态。

查看与OTS服务端进行交互的不同TCP连接状态的数量:

netstat -ant | grep 10.4.170.39 | awk '/^tcp/{++state[$NF]};END{for(key in state) print key,state[key]}'

分析过程

TIME_WAIT

OTSClient连接处于TIME_WAIT状态,由上图可知TCP连接是由OTSClient主动关闭的,所以OTSClient为什么要频繁的关闭TCP连接?在什么情况下关闭的?

tcpdump

通过tcpdump抓包可以清楚OTSClient与OTS服务端通讯协议及建立连接、传输数据、断开连接的过程。

OTSClient与OTS服务端通讯协议是HTTP1.1,HTTP1.1默认开启长连接,所以代码在某个地方主动断开了连接,接下来是找到代码中什么地方主动关闭的连接。

OTSClient

OTSClient构造方法中用于构造与OTS服务端通讯的代码如下:

public OTSClient(String endpoint, String accessKeyId,
                     String accessKeySecret, String instanceName,
                     ClientConfiguration config, OTSServiceConfiguration otsConfig, String stsToken) {
  ... ...
  this.client = new AsyncServiceClient(config);
  ... ...
}

AsyncServiceClient构造方法如下:

IdleConnectionEvictor

场景回顾

应用中配置的socketTimeout=50ms,根据上面逻辑closePeriod=20ms,即当TCP连接空闲20ms的时候就主动关闭,主动关闭造成的现象是大量连接处于TIME_WAIT状态。

对系统的影响

  • 连接无法复用,每次请求OTS服务端都要新建TCP连接/关闭连接,造成客户端和服务端资源浪费
  • 频繁新建/关闭连接,更容易造成响应时间的毛刺
  • 大量连接处于TIME_WAIT状态,消耗系统内存、文件描述符等资源

QA

Q:是否可以调大socketTimeout来避免TIME_WAIT的问题?

A:不合适,该应用在线上访问OTS服务端平均响应时间是5ms,如果设置的过大,当与OTS服务端交互发生超时的时候,线程需要等待更长的时间会造成整个接口超时(业务要求该查询接口响应时间在60ms以下,线上平均响应时间是30ms)。

解决办法

查看了OTSClient 5.13.7的实现,与当前版本实现逻辑一致,所以更新OTSClient版本并不能解决这个问题。

<dependency>
  <groupId>com.aliyun.openservices</groupId>
  <artifactId>tablestore</artifactId>
  <version>5.13.7</version>
</dependency>

已经向阿里反馈该问题,估计阿里的改动如下:

  • 将IdleConnectionEvictor定时间隔参数开放出来,让业务可以配置
  • 将IdleConnectionEvictor空闲时间参数开发出来,让业务可以配置

参看资料

Apache HttpClient Connection eviction policy

Apache HttpClient IdleConnectionEvictor

TimingWheels

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
阿里云表格存储使用教程
表格存储(Table Store)是构建在阿里云飞天分布式系统之上的分布式NoSQL数据存储服务,根据99.99%的高可用以及11个9的数据可靠性的标准设计。表格存储通过数据分片和负载均衡技术,实现数据规模与访问并发上的无缝扩展,提供海量结构化数据的存储和实时访问。 产品详情:https://www.aliyun.com/product/ots
目录
相关文章
|
12月前
|
存储 索引
表格存储根据多元索引查询条件直接更新数据
表格存储是否可以根据多元索引查询条件直接更新数据?
97 3
|
SQL 存储 弹性计算
玩转Tablestore:使用Grafana快速展示时序数据
Grafana 是一款采用 go 语言编写的开源应用,主要用于大规模指标数据的可视化展现,是网络架构和应用分析中最流行的时序数据展示工具,可以通过将采集的数据查询然后可视化的展示,实现报警通知;Grafana拥有丰富的数据源,官方支持以下数据源:Graphite,Elasticsearch,InfluxDB,Prometheus,Cloudwatch,MySQ
1736 0
|
3月前
|
DataWorks NoSQL 关系型数据库
DataWorks产品使用合集之如何从Tablestore同步数据到MySQL
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
分布式计算 DataWorks API
DataWorks常见问题之按指定条件物理删除OTS中的数据失败如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
|
5月前
|
DataWorks NoSQL 关系型数据库
可以使用dataworks从tablestore同步数据到mysql吗?
可以使用dataworks从tablestore同步数据到mysql吗?
63 1
|
NoSQL 开发工具
TableStore表格存储(阿里云OTS)多行数据操作查询,支持倒序,过滤条件和分页
1. 批量读取操作 批量读取操作可以通过多种方式进行,包括: GetRow:根据主键读取一行数据。 BatchGetRow:批量读取多行数据。 GetRange:根据范围读取多行数据。
828 0
|
存储 消息中间件 NoSQL
物联网数据通过规则引擎流转到OTS|学习笔记
快速学习物联网数据通过规则引擎流转到OTS
308 0
物联网数据通过规则引擎流转到OTS|学习笔记
|
存储 负载均衡 开发者
表格存储数据多版本介绍| 学习笔记
快速学习表格存储数据多版本介绍。
271 0
表格存储数据多版本介绍| 学习笔记
|
存储 NoSQL 关系型数据库
基于TableStore的海量气象格点数据解决方案实战 王怀远
基于TableStore的海量气象格点数据解决方案实战 王怀远
406 0
基于TableStore的海量气象格点数据解决方案实战 王怀远
|
存储 SQL 运维
基于Tablestore 实现大规模订单系统海量订单/日志数据分类存储的实践
前言:从最早的互联网高速发展、到移动互联网的爆发式增长,再到今天的产业互联网、物联网的快速崛起,各种各样新应用、新系统产生了众多订单类型的需求,比如电商购物订单、银行流水、运营商话费账单、外卖订单、设备信息等,产生的数据种类和数据量越来越多;其中订单系统就是一个非常广泛、通用的系统。而随着数据规模的快速增长、大数据技术的发展、运营水平的不断提高,包括数据消费的能力要求越来越高,这对支撑订单系统的数据库设计、存储系统也提出了更多的要求。在新的需求下,传统的经典架构面临着诸多挑战,需要进一步思考架构优化,以更好支撑业务发展;
741 0
基于Tablestore 实现大规模订单系统海量订单/日志数据分类存储的实践
下一篇
无影云桌面