大厂都是如何对高并发系统做性能优化的?(下)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 高并发系统的奥义:高性能、高可用、可扩展。 性能反应了系统的使用体验 都是上万QPS的系统,一个响应时间毫秒级,一个秒级,用户体验明显不同 可用性则表示系统可以正常服务用户的时间 上万QPS的系统,一个可全年不停机且无异常,一个隔三差五就宕机 可扩展性 流量可分为平时流量、峰值流量。峰值流量可能会是平时流量的几倍至几十倍,在应对峰值流量时,通常需在架构方案上做更多准备。易于扩展的系统能在短期内迅速扩容,更加平稳分摊峰值流量。

提高系统的处理核心数

提高系统的处理核心数就是增加系统的并行处理能力。

比如可以把系统的处理核心数增加为两个,并且增加一个进程,让这两个进程跑在不同的核心上。这样从理论上,你系统的吞吐量可以增加一倍。

这种情况下,吞吐量和响应时间就不是倒数关系了,而是:

吞吐量=并发进程数/响应时间

计算机领域的阿姆达尔定律(Amdahl’s law)是吉恩·阿姆达尔在1967年提出的。它描述了并发进程数与响应时间之间的关系,含义是在固定负载下,并行计算的加速比,也就是并行化之后效率提升情况,可以用下面公式来表示:

(Ws + Wp) / (Ws + Wp/s)
  • Ws表示任务中的串行计算量
  • Wp表示任务中的并行计算量
  • s表示并行进程数

可推出另外一个公式:

1/(1-p+p/s)

s还是表示并行进程数

p表示任务中并行部分的占比

当p为1时,也就是完全并行时,加速比与并行进程数相等;当p为0时,即完全串行时,加速比为1,也就是说完全无加速;当s趋近于无穷大的时候,加速比就等于1/(1-p),你可以看到它完全和p成正比。特别是,当p为1时,加速比趋近于无穷大。

我们似乎找到了解决问题的银弹,无限制地增加处理核心数就能无限制地提升性能?

随并发进程数的增加,并行的任务对于系统资源的争抢也会愈发严重。在某一个临界点上继续增加并发进程数,反而会造成系统性能的下降,这就是性能测试中的拐点模型。

image.png

并发用户数处于轻压力区时,响应时间平稳,吞吐量和并发用户数线性相关

并发用户数处于重压力区时,系统资源利用率到达极限,吞吐量开始有下降的趋势,响应时间也会略有上升。这个时候,再对系统增加压力,系统就进入拐点区,处于超负荷状态,吞吐量下降,响应时间大幅度上升。

所以评估系统性能时通常需要做压测,找到系统的“拐点”,从而知道系统的承载能力,也便于找到系统瓶颈,持续优化系统性能。

减少单次任务响应时间

首先看你的系统是CPU密集型还是IO密集型的,不同类型的系统性能优化方式不尽相同。


CPU密集型系统中,需要处理大量的CPU运算,那么选用更高效的算法或者减少运算次数就是这类系统重要的优化手段。比方说,如果系统的主要任务是计算Hash值,那么这时选用更高性能的Hash算法就可以大大提升系统的性能。发现这类问题的主要方式,是通过一些Profile工具来找到消耗CPU时间最多的方法或者模块,比如Linux的perf、eBPF等。


IO密集型系统指的是系统的大部分操作是在等待IO完成:

  • 磁盘IO
  • 网络IO

大部分都属于IO密集型,比如数据库系统、缓存系统、Web系统。这类系统的性能瓶颈可能出在系统内部,也可能是依赖的其他系统,而发现这类性能瓶颈的手段主要有两类:

采用工具

Linux的工具集很丰富,完全可以满足你的优化需要,比如网络协议栈、网卡、磁盘、文件系统、内存,等等。这些工具的用法很多,你可以在排查问题的过程中逐渐积累。除此之外呢,一些开发语言还有针对语言特性的分析工具,比如说Java语言就有其专属的内存分析工具。

监控来发现性能问题

在监控中我们可以对任务的每一个步骤做分时的统计,从而找到任务的哪一步消耗了更多的时间。


找到了系统瓶颈,如何优化呢?

如果是数据库访问慢,那么就要看是不是有锁表的情况、是不是有全表扫描、索引加得是否合适、是否有JOIN操作、需不需要加缓存

如果是网络的问题,就要看网络的参数是否有优化的空间,抓包来看是否有大量的超时重传,网卡是否有大量丢包等。


比如做广告检索遇到的问题,倒排索引存在Redis,每次都要请求Redis,但是并发时,Redis连接数太大,甚至打开文件数过大,后采用Redis连接池,Redis连接数得到控制,而且响应更快,后来随着并发数的增大,连接池资源耗尽,而且Redis也有并发限制,数据传输导致大量占用带宽,响应时间更久,因此,又使用了本地缓存,每次请求先请求本地缓存,找不到再请求Redis,缓存到本地,缓存更新时通过消息队列来通知程序更新本地缓存,这样节省了大量的和Redis之间的请求耗时和带宽占用,性能有了数倍的提升。

总结

高并发:高性能(响应时间)、高可用(down机、故障、维护)、可扩展(应急扩容)

响应时间(平均值、最大值、分位值),响应为1s,吞吐量为每秒1次,响应缩短到10ms,吞吐量上升到每秒100次,从用户体验来说:200ms分界点,1s为另一个分界点,健康系统的99分位值的响应时间控制在200ms以内,不超过1s的请求占比要超过99.99%

高并发下的性能优化手段:

1.提高系统的处理核心数(吞吐量=核心数(并发进程数)/响应时间(s))

但并非无限增加核心数就可以增加吞吐量,随着进程数增加,并行的任务对于资源的争夺也增加,在某

个临界点,进程增加导致系统的性能下降,这就是性能测试中的拐点模型,所以在评估系统性能时,需要做压力测试,找到拐点

2.减少单次任务响应时间

cpu密集型:优化算法

io密集型:1.采用工具,linux的工具集

2.通过监控,对任务的每一个步骤做分时统计,从而找到任务中哪一步小号消耗了更多的时间


相关实践学习
基于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
目录
相关文章
|
3月前
|
缓存 NoSQL 关系型数据库
|
3月前
|
消息中间件 缓存 NoSQL
谈谈高并发系统的设计方法论
设计 `高并发` 系统,就是要让该系统保证它 `整体可用` 的同时,能够尽可能多的 `处理很高的并发用户请求`,能够 `承受很大的负载流量冲击`。
410 6
|
5月前
|
消息中间件 NoSQL Java
Java高级开发:高并发+分布式+高性能+Spring全家桶+性能优化
Java高架构师、分布式架构、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师之路
|
6月前
|
消息中间件 缓存 负载均衡
高并发与性能优化的神奇之旅
高并发与性能优化的神奇之旅
|
2月前
|
监控 NoSQL Java
记一次线上商城系统高并发的优化
记一次线上商城系统高并发的优化
19 0
|
2月前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
|
4月前
|
网络协议 算法 Linux
关于Linux服务器高并发场景下系统参数优化的诸多奇技淫巧
关于Linux服务器高并发场景下系统参数优化的诸多奇技淫巧
|
5月前
|
缓存 架构师 算法
高并发系统简单玩!Alibaba全新出品亿级并发设计速成笔记真香
如何提升系统性能,设计出一个靠谱的系统是每一个架构师或者正在往架构师方向进阶的同僚们都需要考虑的问题。公司所处的行业,业务场景决定了你设计的系统演进过程,不过万变不离其宗,系统设计和优化的思想都是相通的(当然如果你刚入行没多久,目前肯定还不需要苦恼这种问题,但是工作用不到,不代表面试不问)。
|
5月前
|
存储 SQL 缓存
高并发web系统的设计
高并发web系统的设计
|
6月前
|
数据库
易搭工作流引擎用是什么开源 还是阿里自研产品,零代码平台场景页面映射数据库表是动态创建,采用什么框架处理,怎么让系统产生高并发能力。易搭权限有没有了解,求解。
易搭工作流引擎用是什么开源 还是阿里自研产品,零代码平台场景页面映射数据库表是动态创建,采用什么框架处理,怎么让系统产生高并发能力。易搭权限有没有了解,求解。

热门文章

最新文章