性能分析要写什么内容(性能分析概述)
要点
性能分析的目标。
性能优化的常用手段。
概述
性能分析的目标是改进最终用户的体验以及降低运行成本。对于性能分析来说,最好的分析方法是能够将分析目标进行量化,以可视化的形式提供给开发者。
性能分析通常有两个视角:资源分析和负载分析。其中,资源分析是从CPU、内存、磁盘、网络等方面进行考察,关注的指标有:IOPS(每秒发生的输入/输出操作的次数)、吞吐量(数据传输速度:字节/秒)、使用率(给定时间内的繁忙程度)和饱和度(某一资源无法满足服务的排队工作量)。负载分析是检查应用程序的性能,分析对象为请求、延时(响应时间)和完成度(错误率),关注的指标有:每秒业务处理量和延时。
著名性能优化大师Brendan Gregg,所以了十多种分析方法论。常用方法有:
业务负载画像
找出实际运行的业务负载进行分析,具体内容:
1、WHO:负载是谁产生的?比如:进程ID、用户ID、进程名、IP地址。
2、WHY:负载为什么会产生?比如:代码路径、调用栈、火焰图。
3、WHAT:负载的组成是什么?比如:IOPS、吞吐量、负载类型。
4、HOW:负载怎么样随着时间发生变化?比如:比较每个周期的摘要信息。
下钻分析
从一个指标出发,然后将这个指标拆分成多个组件,将最大的组件进一步拆分为更小的组件,不断重复这个过程,直到定位出一个或多个原因。具体步骤:
1、从业务最高层级开始分析。
2、检查下一个层级的细节。
3、挑出最感兴趣的部分或者线索。
4、如果问题还没有解决,跳转至第2步。
USE方法
针对每个资源,分别去检查:
1、使用率(utilization):在规定的时间间隔内,资源用于服务工作的时间百分比。
2、饱和度(saturation):资源不能再服务更多额外工作的程度,通常有等待队列。
3、错误(errors):错误事件的个数。
检查清单法
通过列出一系列工具和指标,用于对照运行和检查。
分析工具
如上图,它列举了系统各资源检测的工具。图中,部分工具是BCC工具集,需要单独安装。
BCC
github:https://github.com/iovisor/bcc。
CentOS安装
echo-e'[iovisor]\\nbaseurl=https://repo.iovisor.org/yum/nightly/f23/$basearch\\nenabled=1\\ngpgcheck=0'|sudotee/etc/yum.repos.d/iovisor.repo
yuminstall-ybcc-tools
安装测试,在安装目录下,执行:
./cachetop
默认安装路径:/usr/share/bcc/tools。
bpftrace
github:https://github.com/iovisor/bpftrace。
CentOS安装
curlhttps://repos.baslab.org/rhel/7/bpftools/bpftools.repo–output/etc/yum.repos.d/bpftools.repo
yuminstallbpftracebpftrace-toolsbpftrace-docbcc-staticbcc-tools
安装测试
bpftrace-e'tracepoint:syscalls:sys_enter_open{printf("%s%s\\n",comm,str(args->filename));}'
默认安装路径:/usr/share/bpftrace/tools。
CPU
CPU的性能优化手段:
合理使用锁:spin-lock,能减少cpu切换,在锁的粒度较小时较合适。读写锁适用于,读多写少场景。对于大块内存的锁,可以考虑把内存块进行hash,每hash的内存块单独持有自己的锁,减少锁的粒度。
合理设置工作线程数:如:N核服务器,通过执行业务的单线程分析出本地计算时间为x,等待时间为y,则工作线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化。
指令优化:使用SSE等指令集提高并行计算速度,需要注意的是,使用SSE优化时,需要进行内存对齐。
绑定cpu:减少上下文切换,提高cache的命中率。
考虑分支预测及局部性原理。
内存
内存的性能优化手段:
使用高效的内存管理组件,减少内存频繁申请,如tcmalloc、jemalloc等。
利用线程局部变量(Thread Local),线程内部使用不需要加锁。
读多写少的内存块,可以考虑使用双buffer管理,减少数据更新时锁的竞争。
位图、布隆过滤器可以提高查找性能。
对内存进行hash分片,来提高查找速度,如果一次hash不行,就再进行一次hash。
可以考虑实现无锁数据结构。
IO
IO的性能优化手段:
尽量不读写磁盘:将数据尽可能地加载到内存。
尽量少读写磁盘:在进行磁盘写操作前,进行数据压缩。
尽量顺序读写磁盘:磁盘的顺序读写速度要优于随机读写。
在无法避免磁盘操作时,可以考虑使用异步写、合并写操作、定时刷盘、zero-copy等技术,从而降低IO延时。需要注意的是,逻辑IO和物理IO可能是不对称的,因此,需要分开进行考查。
网络
网络的性能优化手段:
合理使用长连接,减少连接的频繁创建。
传输数据进行压缩,可以减少带宽,但需要评估压缩和解压带来的cpu消耗。
选择合理的通讯协议,HTTP or RPC。
支持多路复用。
使用事件模型。
某些业务场景下,可以考虑使用UDP协议。
所以
性能优化工作,一方面,需要有足够的耐心,通过各种工具或者手段,找出性能瓶颈;另一方面,对整个业务流程也需要足够熟悉。
对于应用程序,影响性能的因子可能有很多,但并不是每一个指标都可以优化到极致,更多的是需要找到一个平衡点。比如,我们需要优化IO性能,最直接的做法,是将数据全部加载至内存,但是这样,必然会导致内存成本的上升。所以,我们可能会考虑只加载热点数据至内存。
性能优化时,需要以系统整体性能为目标,去进行优化。对于一个庞大的业务系统来说,可能会涉及到很多的处理流程,可能会依赖很多的子系统。这些流程中,某个业务流程是否已经弃用,是否可以并行处理,是否可以合并请求,是否可以预加载,是否可以解耦,是否可以离线处理等等,都可以作为性能优化的点来考虑。因此,从系统整体性能去进行优化,其收益往往会远大于某个具体应用程序的优化。
另外,性能优化是一个长期的多变的过程。一次性能优化,可能在软硬件升级、业务规模变化之后,引出新的性能瓶颈。也可能在不同的环境下,性能优化后的效果并不一定相同。
在性能分析中,有三个重要的概念:
已知的已知:你知道你需要查看哪些指标,并且知道怎么获得这些指标。
已知的未知:你知道你需要查看哪些指标,但是你不知道怎么去获得这些指标。
未知的未知:你不知道需要查看哪些指标。
所以,性能分析工作,就是你知道的越多,不知道的也会越多。其他知识系统,想必也是这个道理吧。
相关文章:
相关推荐: