(go语言速度)(go语言运行速度)

合集文章传送门:

在导读中,我们讲了关于性能优化最重要的三个部分,作为上中下三篇来分别阐述。

咱们这篇,性能指标分析,就先来讲讲在性能优化中最应该关注的一些关键指标,以及它们背后的含义,通过这些指标我们能对当前系统有很准确的认知。

优化目标

做一件事,目标是最重要的,它决定我们向哪个方向前进,何时应该停止(毕竟资源有限不可能永远投入在一件事上)。

在笔者遇到的性能优化case中,经常会有以下几种交付目标:

  1. 系统吞吐能力,指的是系统每秒(每分钟、每小时)可以处理多少数据量,比较典型的就是Kafka,每秒可以处理XX条消息,或者HDFS,每秒可以写入XX GB数据,这种数据处理能力的上限,就是我们要优化的目标;
  2. 系统响应时间,指的是在某个系统负载下,每个请求的响应时间,比如说我们在百度/谷歌上搜索一个关键词,多久可以出来搜索结果,又比如说我们依赖了某个下游系统,一次请求能在XX毫秒之内完成响应;
  3. 最小资源消耗,在满足XX吞吐量,或者XX最大响应时间的前提下,系统所耗费的最小资源量。

在实际的项目中,我们需要根据自己的实际情况来确定优化的方向,不同的方向下采取的方式可能也会稍有不同。

系统表现

这里说的系统表现,其实上也是应用程序进程本身的表现,但它和操作系统、网络这些底层概念有更多的关联,优化的时候需要多考虑这些部分的因素,因此归为了系统表现。

我们需要重点关注的系统表现有如下几种:

  1. CPU消耗,毕竟程序是跑在CPU上的,因此绝大部分的性能问题都和CPU使用息息相关, 我们在观测CPU的时候,一方面要观察CPU总的使用情况,是资源不足了呢,还是资源使用不上去,或者是某一个核的使用率很高其他核使用率很低(比如网卡中断绑定在某个核上,它打满了导致系统IO无法提升),不同的情况有不同的技术原理;
  2. IO,一般分为磁盘IO和网络IO两种分别来看:磁盘IO,如果是使用SATA盘,一般一块盘的IO上限是100MB/s,我们需要观察是否有某一块磁盘的IO达到了上限从而影响程序性能,或者干脆是所有的盘都已经打满,导致整体的IO再也无法上去;网络IO,企业服务器中,常见的几种机器网卡配置有单千兆网卡、双千兆网卡、四千兆网卡以及万兆网卡等等,不管具体的配置是什么,需要观测的是网卡是否全部跑满,或者网卡之间是否有倾斜,或者某些网卡是不是没有真正的发挥作用(比如某个网卡并未bind上去,流量为0);
  3. 内存,在我的印象中,内存好像很少成为真正的瓶颈,一般都是因为上述的资源遇到了瓶颈,只有一种情况例外,就是当上述资源遇到瓶颈我们需要做缓存的时候,内存不够大而使内存无法容纳下来所有的缓存内容,从而无法发挥缓存的作用。

应用程序表现

应用程序的表现这里主要是指应用程序内部某些机制相关的数据,包含一些Go相关的内容,也有一些语言无关的指标:

缓存命中率,好的系统设计,缓存命中率基本上能达到98%以上,命中缓存带来的性能收益能达到10倍以上,下面的这张表展示了计算机体系中一些存储介质之间访问速度的差异,其实应用程序设计中缓存能起到的作用也是很夸张的(有时候可以轻松优化成百上千倍)。

事件

延时

相对时间比例

1个 CPU 周期

0.3 ns

1 s

L1 缓存访问

0.9 ns

3 s

L2 缓存访问

2.8 ns

9 s

L3 缓存访问

12.9 ns

43 s

主存访问

120 ns

6 分

固态硬盘(SSD)

50-150 us

2-6 天

旋转磁盘

1-10 ms

1-12 月

网络:从北京上海

30 ms

3 年

网络:从北京到旧金山

190 ms

19 年

TCP 重传

1-3 s

105-317 年

函数CPU占比,这一项一般通过火焰图(Flame graph)来分析,可以看到系统中各个部分占用的CPU比例,能比较直观的看出有使用异常,比如说某个函数对CPU的使用明显超过了合理值,就需要进一步的分析代码,里面的逻辑是否合理,或者具体的代码写的是否足够好。

GC间隔,因为有自动内存管理的存在,在Go应用程序中,GC的发生往往意味着对CPU的消耗(要扫描所有的内存,并且标记、回收他们),甚至还有STW(Stop The World),这些都会极大的影响应用程序的性能。

日志数量,这是一个非典型的指标,在很多系统中,日志库并不具备足够高的性能,因此在日志级别有误或者有bug的情况下会打很多的日志,打日志消耗了非常非常多的CPU和磁盘IO,对性能造成了强烈的冲击,所以可以关注一下系统的日志数量是否有明显异常。

理论升华

我们这里讲的东西都是出自于实践经验的总结,再深入下去已经超出了这几篇文章能承载的范畴,但性能优化终究是需要更进一步的从理论上完善自身的,因此推荐两本这方面的权威著作。

性能之巅笔者是完整看过一遍的,从性能的本质入手逐步讲解原理,再到工具的使用,非常好,BPF之巅笔者其实没怎么看过,但笔者的一位同事从事专业的性能优化工作,对这本书推崇之至,因此也一并推荐了。

大部头要啃下来其实还是比较费劲的,但一旦学成还是有很大的收益,建议大家开卷有益。

《性能之巅——洞悉系统、企业与云计算》

(go语言速度)(go语言运行速度)

基于Linux 和Solaris 系统阐述了适用于所有系统的性能理论和方法,Brendan Gregg 将业界普遍承认的性能方法、工具和指标收集于本书之中。阅读本书,你能洞悉系统运作的方式,学习到分析和提高系统与应用程序性能的方法,这些性能方法同样适用于大型企业与云计算这类最为复杂的环境的性能分析与调优。

《BPF之巅——洞悉Linux系统和应用性能》

(go语言速度)(go语言运行速度)

BPF之巅:洞悉Linux系统和应用性能》作为全面介绍 BPF 技术的图书,从 BPF 技术的起源到未来发展方向都有涵盖,不仅全面介绍了 BPF 的编程模型,还完整介绍了两个主要的 BPF 前端编程框架 — BCC 和 bpftrace,更给出了一系列实现范例,生动展示了 BPF技术的实际能力和未来发展前景。 本书的另一个关注方向是 Linux 系统性能和应用程序性能的调优。内容涉及系统性能调优的策略、工具与实践案例,不仅介绍了对应的 BPF 工具,还着重介绍了这些工具如何与 Linux 传统性能工具进行互补,这样读者可以有选择地进行使用。

声明:我要去上班所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者胖子老豆所有,原文出处。若您的权利被侵害,请联系删除。

本文标题:(go语言速度)(go语言运行速度)
本文链接:https://www.51qsb.cn/article/m8xr5.html

(0)
打赏微信扫一扫微信扫一扫QQ扫一扫QQ扫一扫
上一篇2023-02-22
下一篇2023-02-22

你可能还想知道

发表回复

登录后才能评论