系统性能分析优化必知必会

做后台开发或者是运维都会碰到分析系统性能,找出系统瓶颈的问题,笔者结合自己在工作中的一些经验,将一些基础的概念纪录如下,希望能对读者有一定帮忙

系统吞吐量和延迟

系统的吞吐量和延迟是系统最重要的两个指标,很多时候大家都分不清它们之间的区别。

吞吐量是一个系统一定时间内能处理的请求数,一般用qps还表示,意为秒内所能处理的请求数。而延迟是一个请求从发送到返回结果之间消耗的时间,一般用平均延迟,以及最大延迟来衡量

两者衡量一个系统性能的不同方面,没有必然的联系,但是会相互影响。

如果发现延迟比较大,需要分析时间耗费在哪一部分。当压力小的时候的延迟如果很小,但是压力大了以后延迟也变大,那就需要分析系统是不是哪部分资源不足(cpu 内存,如果能将top中所有关于cpu与内存的指标都看明白,我相信找出这两部分的因素是很容易的 网络,磁盘),导致队列阻塞了请求很长时间。如果系统负载都没有问题,相信我,那八成是你程序的处理结果存在问题,某个地方阻塞住了请求,即使系统负载有问题,也可能是你程序的问题,是否真的需要消耗这么多资源?同样的方法适用于分析其他的系统问题

Q:延迟大的系统是否吞吐量一定低?

非也,读者可以自己体会下之间的区别

Q:吞吐量、延迟和体系结构中用到的带宽、延迟是否同一性质的概念的延伸?

笔者觉得是

 

同步和异步

同步程序开发通常简单直接,异步程序开发通常需要写回调,各种callback(事情也在慢慢的变好,协程概念正在慢慢的得以应用,将大大建华异步程序开发)

异步带来什么好处?笔者理解就是一句话,计算资源不用再为等待io而消耗资源,从而释放更多资源的潜力

apache跟nginx的区别就是这个道理的验证,apache采用同步的概念,导致很多计算资源在等待io资源,所以吞吐量上不去

异步程序往往采用reactor的模式,对提升系统吞吐量有非常好的帮助

(一些好用的异步库,c++中的libevent ,python中的eventlet,采用协程,是python异步编程首选)

批处理

之前碰到过这样一个问题:从一台控制机上要一天要更新一亿条请求到其他三个机房,到这三个机房的速度死慢,之前的策略是每次更新一条,但是很快发现这样一天下来更新不完全部的数据,怎么办?

相信你看标题也猜的出来了,控制机到各个机房之间是延迟大,但是带宽不小,所以批量的发数据更新是一个经济的方法,这样就能将延迟分摊到批量数据的每一条上。笔者用的redis数据库,其中有pipeline的命令,可以完美的完成这个任务

大家都知道tcp中有慢启动,先发一个包,有应答了下次再发两个,下下次发四个,对于局域网,这是ok的,但是对于广域网延迟大的情况下,这是非常耗时的,所以google有个优化,就是增大慢启动的第一次发包数,也是同样的道理

这些都给如何克服延迟大带来了一些启示

连接数与qps

压测工具中一般会有连接数与qps的选项,这是两个完全不同的概念,需要体会下

 

eof

posted on   zhangjing230  阅读(1246)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
< 2013年5月 >
28 29 30 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

统计

点击右上角即可分享
微信分享提示