工商银行分布式服务C10K场景的解决方案

简介: 未来,中国工商银行将持续致力于 Dubbo 的金融级规模化应用。

作者:颜高飞,微服务领域架构师,主要从事服务发现、高性能网络通信等研发工作,擅长 ZooKeeper、Dubbo、RPC 协议等技术方向。

 

Dubbo是一款轻量级的开源Java服务框架,是众多企业在建设分布式服务架构时的首选。中国工商银行自2014年开始探索分布式架构转型工作,基于开源Dubbo自主研发建设了分布式服务平台。Dubbo框架在提供方消费方数量较小的服务规模下,运行稳定、性能良好。

 

随着银行业务线上化、多样化、智能化的需求越来越旺盛,在可预见的未来,会出现一个提供方为数千个、甚至上万个消费方提供服务的场景。在如此高负载量下,若服务端程序设计不够良好,网络服务在处理数以万计的客户端连接时、可能会出现效率低下甚至完全瘫痪的情况,即为C10K问题。那么,基于dubbo的分布式服务平台能否应对复杂的C10K场景?为此,我们搭建了大规模连接环境、模拟服务调用进行了一系列探索和验证。

 

C10K场景下Dubbo服务调用出现大量交易失败

 

准备环境:

 

使用dubbo2.5.9(默认netty版本为3.2.5.Final)版本编写服务提供方和对应的服务消费方。提供方服务方法中无实际业务逻辑、仅sleep 100ms;消费方侧配置服务超时时间为5s,每个消费方启动后每分钟调用1次服务。

 

准备1台8C16G服务器以容器化方式部署一个服务提供方,准备数百台8C16G服务器以容器化方式部署7000个服务消费方。

 

启动dubbo监控中心,以监控服务调用情况。

 

定制验证场景,观察验证结果:

 

 

操作步骤

观察内容

验证结果

场景1

先启动服务提供方,后分批启动消费方

调用1小时观察交易情况

存在零星交易超时失败。消费方分散在多台服务器上。

场景2

在服务正常调用一段时间后,重启提供方

观察提供方重启后的表现

在提供方重启后1-2分钟内存在大量交易超时失败,后逐渐恢复。消费方分散在多台服务器上。

 

验证情况不尽如人意,C10K场景下dubbo服务调用存在超时失败的情况。

 

如果分布式服务调用耗时长,从服务消费方到服务提供方全链路节点都会长时间占用线程池资源,增加了额外的性能损耗。而当服务调用并发突增时,很容易造成全链路节点堵塞,从而影响其他服务的调用,并进一步造成整个服务集群性能下降甚至整体不可用,导致发生雪崩。服务调用超时问题不可忽视。因此,针对该C10K场景下dubbo服务调用超时失败情况我们进行了详细分析。

 

C10K场景问题分析

 

根据服务调用交易链路,我们首先怀疑交易超时是因为提供方或消费方自身进程卡顿或网络存在延迟导致的。

image.png

 

因此,我们在存在交易失败的提供方、消费方服务器上开启进程gc日志,多次打印进程jstack,并在宿主机进行网络抓包。

 

 

观察gc日志、jstack

 

提供方、消费方进程gc时长、gc间隔、内存使用情况、线程堆栈等无明显异常,暂时排除gc触发stop the world导致超时、或线程设计不当导致阻塞而超时等猜想。

 

针对以上两种场景下的失败交易,分别观察网络抓包,对应有以下两种不同的现象:

 

针对场景1:提供方稳定运行过程中交易超时。

 

跟踪网络抓包及提供方、消费方交易日志。消费方发起服务调用请求发起后,在提供方端迅速抓到消费方请求报文,但提供方从收到请求报文到开始处理交易耗时2s+。

 

image.png

同时,观察交易请求响应的数据流。提供方业务方法处理完毕后到向消费方发送回包之间也耗时2s+,此后消费方端迅速收到交易返回报文。但此时交易总耗时已超过5s、超过服务调用超时时间,导致抛出超时异常。

 

image.png

 

由此,判断导致交易超时的原因不在消费方侧,而在提供方侧。

 

针对场景2:提供方重启后大量交易超时。

 

服务调用请求发起后,提供方迅速收到消费方的请求报文,但提供方未正常将交易报文递交给应用层,而是回复了RST报文,该笔交易超时失败。

image.png

观察在提供方重启后1-2分钟内出现大量的RST报文。通过部署脚本,在提供方重启后每隔10ms打印established状态的连接数,发现提供方重启后连接数未能迅速恢复到7000,而是经过1-2分钟后连接数才恢复至正常数值。而在此过程中,逐台消费方上查询与提供方的连接状态,均为established,怀疑提供方存在单边连接情况。

 

我们继续分别分析这两种异常场景。

场景1:提供方实际交易前后均耗时长、导致交易超时

 

细化收集提供方的运行状态及性能指标:

 

  1. 在提供方服务器上每隔3s收集服务提供方jstack,观察到netty worker线程每60s左右频繁处理心跳。
  2. 同时打印top -H,观察到占用cpu时间片较多的线程排名前10中包含9个netty worker线程。因提供方服务器为8C,dubbo默认netty worker线程数为9个,即所有9个netty worker线程均较忙碌。

image.png

  1. 部署服务器系统性能采集工具nmon,观察到cpu每隔60秒左右产生毛刺;相同时间网络报文数也有毛刺。

image.png

  1. 部署ss -ntp连续打印网络接收队列、发送队列中的数据积压情况。观察到在耗时长的交易时间点附近队列堆积较多。

image.png

  1. Dubbo服务框架中提供方和消费方发送心跳报文(报文长度为17)的周期为60s,与以上间隔接近。结合网络抓包,耗时长的交易时间点附近心跳包较多。

image.png

根据Dubbo框架的心跳机制,当消费方数量较大时,提供方发送心跳报文、需应答的消费方心跳报文将会很密集。因此,怀疑是心跳密集导致netty线程忙碌,从而影响交易请求的处理,继而导致交易耗时增加。

image.png

进一步分析netty worker线程的运行机制,记录每个netty worker线程在处理连接请求、处理写队列、处理selectKeys这三个关键环节的处理耗时。观察到每间隔60s左右(与心跳间隔一致)处理读取数据包较多、耗时较大,期间存在交易耗时增加的情况。同一时间观察网络抓包,提供方收到较多的心跳报文。

image.png

因此,确认以上怀疑。心跳密集导致netty worker线程忙碌,从而导致交易耗时增长。

场景2:单边连接导致交易超时

 

分析单边连接产生的原因

 

TCP建立连接三次握手的过程中,若全连接队列满,将导致单边连接。

image.png

 

全连接队列大小由系统参数net.core.somaxconn及listen(somaxconn,backlog)的backlog取最小值决定。somaxconn是Linux内核的参数,默认值是128;backlog在创建Socket时设置,dubbo2.5.9中默认backlog值是50。因此,生产环境全连接队列是50。通过ss命令(Socket Statistics)也查得全连接队列大小为50。

image.png

 

观察TCP连接队列情况,证实存在全连接队列溢出的现象。

image.png

 

即:全连接队列容量不足导致大量单边连接产生。因在本验证场景下,订阅提供方的消费方数量过多,当提供方重启后,注册中心向消费方推送提供方上线通知,所有消费方几乎同时与提供方重建连接,导致全连接队列溢出。

 

分析单边连接影响范围

单边连接影响范围多为消费方首笔交易,偶发为首笔开始连续失败2-3笔。

 

建立为单边的连接下,交易非必然失败。三次握手全连接队列满后,若半连接队列空闲,提供方创建定时器向消费方重传syn+ack,重传默认5次,重传间隔以倍数增长,1s..2s..4s..共31s。在重传次数内,若全连接队列恢复空闲,消费方应答ack、连接建立成功。此时交易成功。

 

image.png

 

在重传次数内,若全连接队列仍然忙碌,新交易到达超时时间后失败。

 

到达重传次数后,连接被丢弃。此后消费方发送请求,提供方应答RST。后交易到达超时时间失败。

 

image.png

 

根据Dubbo的服务调用模型,提供方发送RST后,消费方抛出异常Connection reset by peer,后断开与提供方的连接。而消费方无法收到当前交易的响应报文、导致超时异常。同时,消费方定时器每2s检测与提供方连接,若连接异常,发起重连,连接恢复。此后交易正常。

 

image.png

C10K场景问题分析总结

 

总结以上造成交易超时的原因有两个:

 

  1. 心跳机制导致netty worker线程忙碌。在每个心跳任务中,提供方向所有1个心跳周期内未收发过报文的消费方发送心跳;消费方向所有1个心跳周期内未收发过报文的提供方发送心跳。提供方上所连接的消费方较多,导致心跳报文堆积;同时,处理心跳过程消耗较多CPU,影响了业务报文的处理时效。

 

  1. 全连接队列容量不足。在提供方重启后该队列溢出,导致大量单边连接产生。单边连接下首笔交易大概率超时失败。

 

下一步思考

 

针对以上场景1:如何能降低单个netty worker线程处理心跳的时间,加速IO线程的运行效率?初步设想了如下几种方案:

 

  • 降低单个心跳的处理耗时
  • 增加netty worker线程数,降低单个IO线程的负载
  • 打散心跳,避免密集处理

 

针对以上场景2:如何规避首笔大量半连接导致的交易失败?设想了如下方案:

 

  • 增加TCP全连接队列的长度,涉及操作系统、容器、Netty
  • 提高服务端accept连接的速度

 

交易报文处理效率提升

逐层优化

 

基于以上设想,我们从系统层面、dubbo框架层面进行了大量的优化,以提升C10K场景下交易处理效率,提升服务调用的性能容量。

 

优化内容包括以下方面:

 

image.png

 

具体涉及优化的框架层如下:

 

image.png

 

经对各优化内容逐项验证,各措施均有不同程度的提升,效果分别如下:

 

优化内容

优化效果

tcp全连接队列扩容

提供方重启后交易超时失败现象消除

epoll模型调整

提供方重启后全连接队列溢出次数明显降低,连接accept速度有所提升

心跳绕过序列化

提供方在心跳周期无CPU毛刺,CPU峰值降低20%

消费方与提供方之间平均处理时差由27ms降低至3ms

前99%的交易耗时从191ms下降至133ms

增加Iothreads线程数

将默认的iothreads线程数9调整为20后,消费方与提供方之间平均处理时差由27ms降低至14ms

前99%的交易耗时从191ms下降至186ms

提供方心跳打散

从提供方网络抓包分析,心跳数据包的毛刺峰值从1.5万/秒压降至3000/秒

消费方心跳打散

从提供方网络抓包分析,心跳数据包几乎不再有毛刺峰

 

综合优化验证效果

 

综合运用以上优化效果最佳。在此1个提供方连接7000个消费方的验证场景下,重启提供方后、长时间运行无交易超时场景。对比优化前后,提供方CPU峰值下降30%,消费方与提供方之间处理时差控制在1ms以内,P99交易耗时从191ms下降至125ms。在提升交易成功率的同时,有效减少了消费方等待时间、降低了服务运行资源占用、提升了系统稳定性。

 

线上实际运行效果

 

基于以上验证结果,中国工商银行在分布式服务平台中集成了以上优化内容。截至发文日期,线上已存在应用一个提供方上连接上万个消费方的场景。落地该优化版本后,在提供方版本升级、及长时间运行下均无异常交易超时情况,实际运行效果符合预期。

 

未来展望

 

中国工商银行深度参与Dubbo社区建设,在Dubbo金融级规模化运用的过程中遇到了诸多技术挑战,为满足金融级高敏交易的苛刻运行要求,开展了大规模自主研发,并通过对Dubbo框架的扩展和定制持续提升服务体系的稳定性,以“源于开源、回馈开源”的理念将通用增强能力不断贡献至开源社区。未来,我们将持续致力于Dubbo的金融级规模化应用,协同社区继续提升Dubbo的性能容量和高可用水平,加速金融行业数字化创新和转型及基础核心关键的全面自主可控。

原文链接

本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513652.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用html() undefined_SweetAlert2使用教程

SweetAlert2是一款功能强大的纯Js模态消息对话框插件。SweetAlert2用于替代浏览器默认的弹出对话框,它提供各种参数和方法,支持嵌入图片,背景,HTML标签等,并提供5种内置的情景类,功能非常强大。SweetAlert2…

埃森哲携手阿里云,采用K8s容器云服务为客户提供无限弹性

简介: 埃森哲作为全球领先的专业服务公司,在数字化、云计算等领域拥有全球领先的能力,我们在多年的实际客户项目中,找到并沉淀出了适合企业数字化转型的方法论,积累了丰富的落地经验。 作者:姚迪、周警伟 …

4阶范德蒙德行列式例题_线性代数入门——“爪型行列式”的计算及其应用

系列简介:这个系列文章讲解线性代数的基础内容,注重学习方法的培养。线性代数课程的一个重要特点(也是难点)是概念众多,而且各概念间有着千丝万缕的联系,对于初学者不易理解的问题我们会不惜笔墨加以解释。在内容上,以…

如何使用Arthas提高日常开发效率?

简介: 1. Arthas有什么功能,怎么用,请看:Arthas使用手册 2. Arthas命令比较复杂,一个帮助生成命令的IDEA插件:arthas idea plugin 使用文档 3. 基于Arthas实现的简单好用的热部署插件:ArthasHot…

stringutils 用哪个包 apache spring_spring整合mq、jsonp跨越、httpclient工具的使用

训练大纲(第087天)大家如果想快速有效的学习,思想核心是“以建立知识体系为核心”,具体方法是“守破离”。确保老师课堂上做的操作,反复练习直到熟练。第173次(ActiveMQ)学习主题:ActiveMQ学习目标:1 掌握什么是spring…

几种Java常用序列化框架的选型与对比

简介: 序列化与反序列化是我们日常数据持久化和网络传输中经常使用的技术,但是目前各种序列化框架让人眼花缭乱,不清楚什么场景到底采用哪种序列化框架。本文会将业界开源的序列化框架进行对比测试,分别从通用性、易用性、可扩展性…

12v小型电机型号大全_电动机型号参数大全,再也不怕看不懂电机型号了

电动机型号是便于使用、设计、制造等部门进行业务联系和简化技术文件中产品名称、规格、型式等叙述而引用的一种代号。下面为大家介绍电动机型号含义等信息。1电动机型号组成及含义由电机类型代号、电机特点代号、设计序号和励磁方式代号等四个小节顺序组成。1、类型代号是表征…

基于DataWorks搭建新零售数据中台

文章作者:许日(欢伯),在2016年盒马早期的时候,转到盒马事业部作为在线数据平台的研发负责人,现任阿里云计算平台DataWorks建模引擎团队负责人。 文章简介:本篇文章向大家分享新零售企业如何基于…

身份云平台 Authing 完成 2300 万美元 A 轮融资

10 月 24 日,身份云平台 Authing 宣布完成 2300 万美元 A 轮融资。本轮融资由老虎环球基金领投,鼎晖VGC(创新与成长基金)、声网 Agora、老股东 GGV纪源资本和奇绩创坛跟投,跃为资本担任独家财务顾问。Authing 表示&…

大数据计算存储资源池_管家实践:轻松玩转大数据计算服务

以下是直播内容精华整理,主要包括以下四个方面:1.背景速览;2.功能介绍;3.案例讲解;4.新功能预告。一、背景速览MaxCompute(原ODPS)是一项大数据计算服务,它能提供快速、完全托管的PB级数据仓库解决方案&…

客如云数据中台建设

简介: 本次分享介绍客如云如何利用阿里云大数据产品来建设数据中台。 客如云是2012年成立的一家公司,覆盖餐饮、零售、美业,还有其他的业态以及服务的一家综合性的SaaS公司。到2020年为止,客如云已经服务了60万商家,帮…

微博机器学习平台云上最佳实践

简介: 本文讲述了微博机器学习平台和深度学习平台的业务功能和云上实践,剖析了阿里云大数据在微博这两大学习平台的架构建设上所起到的作用。 作者:新浪微博数据计算平台系统架构师 曹富强 本文讲述了微博机器学习平台和深度学习平台的业务功…

搞懂异地多活,看这篇就够了

来源:水滴与银弹作者:Kaito阅读本文大约需要 20 分钟。你好,我是 Kaito。在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理。异地多活到底是什么&…

搭建一个微服务商城到底可以有多快?

简介: 极速部署一个微服务电商商城,体验 Serverless 带给您的应用全托管体验。 作者:云原生技术运营 - 望宸 技术实践的门槛不仅在于应用上线后各类问题的排查难度,也在于搭建一个 Demo 应用时的复杂度。 今天我们尝试 3 种方法来…

分享2种规划思维和4个规划方法

简介: 为结果买单,为过程鼓掌。 作者:不拔 每年各个部门都要进行规划,规划能让目标更聚焦,让我们清晰地知道今后我们要做什么、如何去做。并非每个人都会参与规划中去,但需要掌握规划的方法,否…

apache 统计404日志_Apache监控与调优(四)Apachetop监控

除了使用status监控外,还可以使用第三方软件来监控。现在使用的最多的第三方监控软件是apachetop。虽然我们使用status也可以监控到很多信息,但是对于一些统计信息来说,例如统计哪些URL的访问量最大,不同状态码下分别有多少个HTTP…

揭秘 | 2021年移动云API大赛决赛大奖花落谁家?

10月21日,2021年移动云API应用创新开发大赛决赛暨移动云开发者论坛,在苏州圆满举办。现场,移动云开发者社区重磅发布首批MVP名单,同时公布2021年API创新开发大赛决赛获奖名单。中国移动、英特尔、CSDN、PingCAP、各参赛团队等技术…

冷热分离之OTS表格存储实战

简介: 为什么要冷热分离由于2020疫情的原因,在线教育行业提前被大家所重视,钉钉教育已经服务超过21万所学校、700万教师和1.4亿学生用户,每天大量的教育数据产生。整体数据量:随着时间的积累,数据量越来直大…

世界地图可以无限放大_不敢相信!世界地图,你竟然骗了我这么多年...

本文转载自微信公众号:中国国家地理(ID:dili360)原文首发于2018年10月13日,标题为《世界地图,我竟然被你骗了这么多年!》不代表FM93交通之声观点。都说眼见为实,其实眼见到的也不一定为实相信你们很多人都以为世界就像…

WebAssembly + Dapr = 下一代云原生运行时?

简介: 云计算已经成为了支撑数字经济发展的关键基础设施。云计算基础设施也在持续进化,从 IaaS,到容器即服务(CaaS),再到 Serverless 容器和函数 PaaS (fPaaS 或者 FaaS),新的计算形态相继出现。…