客户案例|英雄互娱 —— 提升 300% !一次性能优化实战记录

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
性能测试 PTS,5000VUM额度
简介: 一次性能优化实战记录


案例背景

英雄互娱是国内知名游戏研发商和发行商,经常遇到热门线上游戏,在某瞬间出现大量登录请求,需要临时扩容资源的场景。为了让服务更好的应对突增并发请求压力,客户尝试通过把应用服务容器化部署,能通过 HPA(Horizontal Pod Autoscaling)的功能,快速弹性自动扩容应用副本数来提高承载能力。


以下数据均从某已发行游戏的真实环境所得,其应用服务主要基于 Java 技术栈开发。


问题描述

该游戏应用部署在某公有云厂商的托管 K8S 环境中,经过一次更新后,将增加新服节点。以过往经验看,同时跑 6 个相同应用的 Pod,服务的承载能力可以稳定达到每秒 5 万次的 RPS(Request per Second)。但在上线前压力测试后发现,同时跑 6 个 Pod 的 RPS 的承载峰值仅为 2 万出头。增加到 12 个 Pod 时(相同资源配置),RPS 的承载峰值为 2.4 万左右,增长并不明显。进一步增加到 18 个 Pod(相同资源配置),RPS 不再提升,仍停留在 2.4 万左右。这就出现问题了,该服务的承载能力无法随着资源扩容线性增长,将会在高峰期极大影响游戏用户体验。显然瓶颈点会在服务本身,需要配合应用性能监测分析手段来进一步追踪,找出瓶颈点并执行优化。

image.png

绿线为 RPS,峰值为 2.4 万

黄线为响应时间(Response Time),峰值约为 1000ms


使用观测云定位问题的过程

观测云是系统全链路数据可观测平台,非常适合高效定位上述问题根因。观测云应用性能监测支持使用 OpenTracing 协议的采集器,实现对分布式架构的应用进行端到端的链路分析,并能与基础设施、日志、用户访问监测进行关联分析,快速感知故障表象和定位故障根因,提高用户体验。


- 通过链路观测快速定位问题方向

1. 在容器服务环境中部署观测云的数据采集器 - DataKit,接入应用链路和日志数据。


2. 服务在 21:00 到 22:00 点间进行压测,压测开始后,观测云应用性能监测的服务概览页面立即显示出系统实时运行状态,通过对 Pxx 的响应时间做排序,快速找到了响应时间较长的服务。如下图所示:

image.png

3. 点击该服务做进一步下钻,可以看到更详细的调用相关信息。如下图所示,发现「POST /xxx/v1/login/checklgn.lg」的响应时间较长,并且随着压力的增大,平均响应时间会逐渐增加。定位到该条服务链路需要做进一步的排查。

image.png

image.png


4. 点击该服务调用,进一步下钻去探查资源详情,我们注意到该服务执行会非常频繁的去调用 Redis(56 次),如下图所示。如果并发量增大,频繁调用该服务的时候,很可能会造成 Redis 上的巨大压力。

image.png

5. 从火焰图中,我们可以看到有些 Redis 调用之间存在可疑的延迟(注意红圈部分)。虽然,Redis 本身执行的时间非常快,但因为调用间的延迟拖慢了整体性能。

image.png

随着对系统的压力增大,该现象会更加明显。下图是压测高峰期产生的火焰图。从图中可以看到,两个 Redis 间的调用延迟超过 2s。

所以,初步判断瓶颈点在 Redis 上,原因很可能是 Redis 端的压力较大,无法即时响应前端调用所需的相关资源(例如:获取连接),出现了等待,从而导致在压测中整体的 RPS 上不去。此时,压测才刚开始不到 5 分钟,观测云快速定位性能瓶颈点的能力让现场工程师着实震惊


6. 接下来就要进一步分析是 Redis 配置的问题,还是访问代码的问题了。首先开启 Redis 监测仪表板,从 Redis 的指标监控来看,在压测高峰期,出现 CPU 被打满的情况。尝试对 Redis 相关的参数做了优化调整,比如,增加连接池中连接数的数量,长链接代替短连接等的配置后,6 个 Pod 配置下压测结果 RPS 峰值可提升到 3 万左右,但再增加 Pod 数量后,RPS 峰值几乎没有变化。根因范围进一步缩小了,极有可能是访问代码的问题。但这时候现场工程师稍有犯难,此时已经是深更半夜了,这时候不可能再拉开发进来逐个模块检查代码,但明明就快揭开问题根因了,要拖到明天再继续又实在心有不甘。


这时候可以用观测云的 Profiling 能力了。


- 通过 Profiling 功能发现代码层问题

观测云 Profiling 功能支持查看应用程序运行过程中 CPU、内存和 I/O 的使用情况,通过火焰图实时展示每一个方法、类和线程的调用关系和执行效率,帮助优化代码性能。


现场再继续以下操作配置:


1. 在观测云中开启 Profiling 的采集功能。


2. Profiling 默认会1分钟左右上传一次统计数据。我们对压测开始时的数据和运行一段时间后的数据做比较,主要关注在「Lock Wait Time」和 「Socket I/O Read Time」的指标上。如下图所示:


1)  压测开始时的 Profiling 数据

image.png

2)  压测一段时间后的 Profiling 数据

image.png

压测中是逐步增加 RPS 的量,从上图的对比中,可以清楚的看到压测过程中「Lock Wait Time」 和 「Socket I/O Read Time」的值会变得非常大。这里就可能存在瓶颈点。需要进一步下钻去看更详细的信息。


3. 从 Redis 监控指标发现有大量的 Read 操作。所以,进一步看「Socket I/O Read Time」相关的详细信息。如下图所示:

image.png

调用顺序按列从上往下,方块越长代表耗时占比越大。如上图红色标记的 3 个方块基本是最耗时的调用。在右侧,也可以通过不同的维度(类,方法,包等)进行数据查看。选择其中 ActionHandler 继续往下一级下取信息。

image.png

4. 在 ActionHandler 的详细信息中,能看到客户的代码中通过不同的实现方法在频繁调用 Redis 来完成相关的操作。如下图所示:

image.png

其中,以 setCacheModel 和 addCount 方法占用的时间最多。

image.png

image.png

5. 用同样的方法,发现其他的类方法中例如 Invocation.invoke() 等都存在类似频繁调用 Redis 的情况。这种情况会导致一个服务调用会产生大量的服务调用。当并发量大的时候,Redis 会成为热点,压力较大。


此时已是第二天凌晨,但终于找到了问题根因,的确因为代码内对 Redis 过于频繁的冗余调用所导致,甚至能清晰的定位到有问题的方法名,只待给开发提 ISSUE 即可。



最终成效

代码优化后,效果远超预期!


第二天,开发同学在观测云面板上,回溯到昨晚压测过程的时间段,看到了当时应用状态仪表板和 Profiling 仪表板数据,快速理解了问题上下文,当天就完成了相关代码部分的优化并提了测试发版。


在当晚 21 点开始的新一轮的压测中,仍使用 6 个 Pod,RPS 跑到了超过 8 万峰值,相比第一次压测的 2 万 RPS 结果,性能足足提升到 4 倍,同时响应时间仍能控制在 800ms 以下,结果远超预期。

image.png






相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
SQL 缓存 Java
揭秘物联网性能优化的终极攻略!提升系统效率的七大法宝
小米在物联网项目中遇到了性能优化问题,他从数据库、集群、硬件、代码、并行处理、JVM及操作系统等多个层面分享了优化经验。包括SQL优化、分库分表、缓存使用、水平扩容、分布式调度、硬件升级、代码分析、并行处理、GC调优及操作系统参数调整等。小米强调性能优化需结合实际情况,逐步提升系统响应速度与稳定性。欢迎留言交流,共同进步。关注他的微信公众号“软件求生”,获取更多技术干货。
66 0
|
6月前
|
API Go 异构计算
技术经验分享:d3d9查询(QueriesDirect3d9)
技术经验分享:d3d9查询(QueriesDirect3d9)
45 0
|
7月前
|
缓存 负载均衡 网络协议
作者推荐 | 高并发挑战?试试这些架构优化篇技巧,让你的系统焕发新生!
作者推荐 | 高并发挑战?试试这些架构优化篇技巧,让你的系统焕发新生!
394 1
|
消息中间件 缓存 分布式计算
真牛!阿里最新发布这份《亿级高并发系统设计手册》涵盖所有操作
前言 我们知道,高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。 那我们改如何应对大流量的三种方式? 第一种方法:Scale-out。 第二种方法:使用缓存提升性能 第三种方法:异步处理 面试京东,阿里这些大厂遇到这些问题改怎么办? 秒杀时如何处理每秒上万次的下单请求? 如何保证消息仅仅被消费一次? 如何降低消息队列系统中消息的延迟?
|
设计模式 缓存 Java
好家伙!阿里新产Java性能优化(终极版),涵盖性能优化所有操作
上月公司来了一位大佬,入职不到一周就把公司现有项目的性能优化了一遍,直接给公司节省了一半的成本。 一问情况,才知道这位仁兄也是一路被虐过来的。去年年底被裁,本以为自己技术还行,看了一段时间面经,复习了基础知识,就开始投大厂简历。阿里最先给他面试机会,结果没能扛过三面,然后是各种大大小小的公司,在实际面试中被碾压得翻不了身。整整一个半月,一个offer都没拿到,最后针对性的恶补,才入职了我司。
|
数据采集 供应链 数据管理
实时数据中心建设思路与企业实践|青训营笔记
本篇文章主要分为四个方面介绍实时数据中心建设思路与企业实践:1. 企业数据架构;2. 数据中心案例;3. 实时数据生产;4. 数据服务
154 0
实时数据中心建设思路与企业实践|青训营笔记
好客租房138-长列表性能优化
好客租房138-长列表性能优化
55 0
好客租房138-长列表性能优化
|
Cloud Native 搜索推荐 中间件
在线教育行业,不可不知的阿里云中间件实战秘笈
基于开放的技术标准、理念和实践,云原生已经成为企业数字化转型的最短路径。中间件作为云原生的核心支点,凭借种类丰富、接入简单、稳定高效的核心优势,已经成为在线教育企业业务稳定、效率提升的“法宝”。 阿里云中间件正在以全面领先的技术、产品和最佳实践,引领在线教育进入新的阶段。
2393 6
在线教育行业,不可不知的阿里云中间件实战秘笈
下一篇
DataWorks