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

3 性能的度量指标

========================================================================

一般度量性能的指标是系统接口的响应时间,需要收集一段时间的响应时间数据,然后依据统计方法计算特征值,这些特征值就能够代表这段时间的性能情况。常见的特征值有以下几类。

平均值


这段时间所有请求的响应时间数据和/总请求数。

在一定程度上反应这段时间的性能,但它敏感较差,若这段时间有少量慢请求,在平均值上并不能反应出来。

最大值


段时间内所有请求响应时间最长的值。

问题在于过于敏感。

分位值


有很多种,比如90分位、95分位、75分位。以90分位为例,我们把这段时间请求的响应时间从小到大排序,假如一共有100个请求,那么排在第90位的响应时间就是90分位值。分位值排除了偶发极慢请求对于数据的影响,能够很好地反应这段时间的性能情况,分位值越大,对于慢请求的影响就越敏感。

分位值是最适合作为时间段内,响应时间统计值来使用的,在实际工作中也应用最多。

平均值也可以作为一个参考值。

通常使用吞吐量或者响应时间来度量并发和流量,使用吞吐量的情况会更多一些。这两个指标是呈倒数关系:

响应时间1s时,吞吐量是每秒1次,响应时间缩短到10ms,那么吞吐量就上升到每秒100次。所以,一般我们度量性能时都会同时兼顾吞吐量和响应时间,比如我们设立性能优化的目标时通常会这样表述:在每秒1万次的请求量下,响应时间99分位值在10ms以下。

那么,响应时间究竟控制在多长时间比较合适呢?

从用户使用体验的角度来看,200ms是第一个分界点:接口的响应时间在200ms之内,用户是感觉不到延迟的,就像是瞬时发生的一样。而1s是另外一个分界点:接口的响应时间在1s之内时,虽然用户可以感受到一些延迟,但却是可以接受的,超过1s之后用户就会有明显等待的感觉,等待时间越长,用户的使用体验就越差。所以,健康系统的99分位值的响应时间通常需要控制在200ms之内,而不超过1s的请求占比要在99.99%以上。

现在你了解了性能的度量指标,那我们再来看一看,随着并发的增长我们实现高性能的思路是怎样的。

4 性能优化

=====================================================================

假如说,你现在有一个系统,这个系统中处理核心只有一个,执行的任务的响应时间都在10ms,它的吞吐量是在每秒100次。那么我们如何来优化性能从而提高系统的并发能力呢?主要有两种思路:一种是提高系统的处理核心数,另一种是减少单次任务的响应时间。

提高系统的处理核心数


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

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

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

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

计算机领域的阿姆达尔定律(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时,加速比趋近于无穷大。

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

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

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

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

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

减少单次任务响应时间


首先看你的系统是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.减少单次任务响应时间
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。

很多人担心学了容易忘,这里教你一个方法,那就是重复学习。

打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。

从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

[外链图片转存中…(img-iXfqWaV5-1713626801822)]

人的本性就是容易遗忘,只有不断加深印象、重复学习才能真正掌握,所以很多书我都是推荐大家多看几遍。哪有那么多天才,他只是比你多看了几遍书。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值