总结篇:性能问题分析及优化的一般方法,工具速查

目录

性能分析的一般步骤

一、CPU 性能分析

二、内存性能分析

三、磁盘和文件系统 I/O 性能分析

四、网络性能分析

五、应用程序瓶颈

性能优化的一般方法

一、CPU 优化

二、内存优化

三、磁盘和文件系统 I/O 优化

四、网络优化

五、应用程序优化

性能工具

一、工具选择的原则

二、CPU 性能工具

三、内存性能工具

 四、磁盘 I/O 性能工具

五、网络性能工具

六、基准测试工具


 

性能分析的一般步骤

一、CPU 性能分析

关于 CPU 的性能分析方法,CPU性能分析优化套路 文中,已经整理了一个迅速分析 CPU 性能瓶颈的思路:

利用 top、vmstat、pidstat、strace 以及 perf 等几个最常见的工具,获取 CPU 性能指标后,再结合进程与 CPU 的工作原理,就可以迅速定位出 CPU 性能瓶颈的来源。

top、pidstat、vmstat 这类工具所汇报的 CPU 性能指标,都源自 /proc 文件系统(比如 /proc/loadavg、/proc/stat、/proc/softirqs 等)。这些指标,都应该通过监控系统监控起来。虽然并非所有指标都需要报警,但这些指标却可以加快性能问题的定位分析。

比如说,当收到系统的用户 CPU 使用率过高告警时,

  • 从监控系统中直接查询到,导致 CPU 使用率过高的进程;

  • 然后再登录到进程所在的 Linux 服务器中,分析该进程的行为。

  • 可以使用 strace,查看进程的系统调用汇总;

  • 也可以使用 perf 等工具,找出进程的热点函数;

  • 甚至还可以使用动态追踪的方法,来观察进程的当前执行过程,直到确定瓶颈的根源。

二、内存性能分析

关于内存性能的分析方法,在 总结篇:系统内存问题如何快速定位 中也已经详细介绍。

如上图,就是一个迅速定位内存瓶颈的流程。可以通过 free 和 vmstat 输出的性能指标,确认内存瓶颈;然后,再根据内存问题的类型,进一步分析内存的使用、分配、泄漏以及缓存等,最后找出问题的来源。

比如说,当你收到内存不足的告警时,

  • 首先可以从监控系统中。找出占用内存最多的几个进程。

  • 然后,再根据这些进程的内存占用历史,观察是否存在内存泄漏问题。确定出最可疑的进程后,

  • 再登录到进程所在的 Linux 服务器中,分析该进程的内存空间或者内存分配,

  • 最后弄清楚进程为什么会占用大量内存。

三、磁盘和文件系统 I/O 性能分析

关于磁盘和文件系统的 I/O 性能分析方法,在总结篇:Linux I/O问题如何快速定位中也已经为你整理了一个快速分析的思路。

如下面这张图。使用 iostat ,发现磁盘 I/O 存在性能瓶颈(比如 I/O 使用率过高、响应时间过长或者等待队列长度突然增大等)后,可以再通过 pidstat、 vmstat 等,确认 I/O 的来源。接着,再根据来源的不同,进一步分析文件系统和磁盘的使用率、缓存以及进程的 I/O 等,从而揪出 I/O 问题的真凶。

同 CPU 和内存性能类似,很多磁盘和文件系统的性能指标,也来源于 /proc 和 /sys 文件系统(比如 /proc/diskstats、/sys/block/sda/stat 等)。自然,它们也应该通过监控系统监控起来。这样,当你收到 I/O 性能告警时,就可以从监控系统中,直接得到上图中的各项性能指标,从而加快性能定位的过程。

比如说,当你发现某块磁盘的 I/O 使用率为 100% 时,

  • 首先可以从监控系统中,找出 I/O 最多的进程。

  • 然后,再登录到进程所在的 Linux 服务器中,借助 strace、lsof、perf 等工具,分析该进程的 I/O 行为。

  • 最后,再结合应用程序的原理,找出大量 I/O 的原因。

四、网络性能分析

网络性能,其实包含两类资源,即网络接口和内核资源。在总结篇:系统的网络性能评估及优化思路中提到过,网络性能的分析,要从 Linux 网络协议栈的原理来切入。

下面这张图,就是 Linux 网络协议栈的基本原理,包括应用层、套机字接口、传输层、网络层以及链路层等。

要分析网络的性能,自然也是要从这几个协议层入手,通过使用率、饱和度以及错误数这几类性能指标,观察是否存在性能问题。比如 :

  • 在链路层,可以从网络接口的吞吐量、丢包、错误以及软中断和网络功能卸载等角度分析;

  • 在网络层,可以从路由、分片、叠加网络等角度进行分析;

  • 在传输层,可以从 TCP、UDP 的协议原理出发,从连接数、吞吐量、延迟、重传等角度进行分析;

  • 在应用层,可以从应用层协议(如 HTTP 和 DNS)、请求数(QPS)、套接字缓存等角度进行分析。

网络的性能指标也都来源于内核,包括 /proc 文件系统(如 /proc/net)、网络接口以及 conntrack 等内核模块。这些指标同样需要被监控系统监控。这样,当你收到网络告警时,就可以从监控系统中,查询这些协议层的各项性能指标,从而更快定位出性能问题。

比如,当你收到网络不通的告警时,

  • 可以从监控系统中,查找各个协议层的丢包指标,确认丢包所在的协议层。

  • 然后,从监控系统的数据中,确认网络带宽、缓冲区、连接跟踪数等软硬件,是否存在性能瓶颈。

  • 最后,再登录到发生问题的 Linux 服务器中,借助 netstat、tcpdump、bcc 等工具,分析网络的收发数据,并且结合内核中的网络选项以及 TCP 等网络协议的原理,找出问题的来源。

五、应用程序瓶颈

除了以上这些来自网络资源的瓶颈外,还有很多瓶颈,其实直接来自应用程序。比如,最典型的应用程序性能问题,就是吞吐量(并发请求数)下降、错误率升高以及响应时间增大。

不过,这些应用程序性能问题虽然各种各样,但就其本质来源,实际上只有三种,也就是资源瓶颈、依赖服务瓶颈以及应用自身的瓶颈。

 

第一种资源瓶颈,其实还是指刚才提到的 CPU、内存、磁盘和文件系统 I/O、网络以及内核资源等各类软硬件资源出现了瓶颈,从而导致应用程序的运行受限。对于这种情况,我们就可以用前面系统资源瓶颈模块提到的各种方法来分析。

 

第二种依赖服务的瓶颈,也就是诸如数据库、分布式缓存、中间件等应用程序,直接或者间接调用的服务出现了性能问题,从而导致应用程序的响应变慢,或者错误率升高。这说白了就是跨应用的性能问题,使用全链路跟踪系统,就可以帮你快速定位这类问题的根源。

 

最后一种,应用程序自身的性能问题,包括了多线程处理不当、死锁、业务算法的复杂度过高等等。对于这类问题,在应用程序指标监控以及日志监控中,观察关键环节的耗时和内部执行过程中的错误,就可以缩小问题的范围。

 

不过,由于这是应用程序内部的状态,外部通常不能直接获取详细的性能数据,所以就需要应用程序在设计和开发时,就提供出这些指标,以便监控系统可以了解应用程序的内部运行状态。

如果这些手段过后还是无法找出瓶颈,还可以用系统资源模块提到的各类进程分析工具,来进行分析定位。比如:

  • 可以用 strace,观察系统调用;

  • 使用 perf 和火焰图,分析热点函数;

  • 甚至使用动态追踪技术,来分析进程的执行状态。

当然,系统资源和应用程序本来就是相互影响、相辅相成的一个整体。实际上,很多资源瓶颈,也是应用程序自身运行导致的。比如,进程的内存泄漏,会导致系统内存不足;进程过多的 I/O 请求,会拖慢整个系统的 I/O 请求等。所以,很多情况下,资源瓶颈和应用自身瓶颈,其实都是同一个问题导致的,并不需要重复分析。

系统是应用的运行环境,系统的瓶颈会导致应用的性能下降;而应用的不合理设计,也会引发系统资源的瓶颈。

 

性能优化的一般方法

一、CPU 优化

CPU 性能优化的核心,在于排除所有不必要的工作、充分利用 CPU 缓存并减少进程调度对性能的影响。在CPU性能分析优化套路也介绍了CPU优化方法

最典型的三种优化方法:

  • 第一种,把进程绑定到一个或者多个 CPU 上,充分利用 CPU 缓存的本地性,并减少进程间的相互影响。

  • 第二种,为中断处理程序开启多 CPU 负载均衡,以便在发生大量中断时,可以充分利用多 CPU 的优势分摊负载。

  • 第三种,使用 Cgroups 等方法,为进程设置资源限制,避免个别进程消耗过多的 CPU。同时,为核心应用程序设置更高的优先级,减少低优先级任务的影响。

 

二、内存优化

内存性能的优化,也就是要解决内存不足、内存泄漏、Swap 过多、缺页异常过多以及缓存过多等的问题。可以通过以下几种方法,来优化内存的性能。

详情可以参考总结篇:系统内存问题如何快速定位

  • 第一种,除非有必要,Swap 应该禁止掉。这样就可以避免 Swap 的额外 I/O ,带来内存访问变慢的问题。

  • 第二种,使用 Cgroups 等方法,为进程设置内存限制。这样就可以避免个别进程消耗过多内存,而影响了其他进程。对于核心应用,还应该降低 oom_score,避免被 OOM 杀死。

  • 第三种,使用大页、内存池等方法,减少内存的动态分配,从而减少缺页异常。

 

三、磁盘和文件系统 I/O 优化

磁盘和文件系统 I/O 的优化方法。在总结篇:Linux I/O问题如何快速定位 中,梳理了一些常见的优化思路,这其中有如下典型的方法。

  • 第一种,也是最简单的方法,通过 SSD 替代 HDD、或者使用 RAID 等方法,提升 I/O 性能。

  • 第二种,针对磁盘和应用程序 I/O 模式的特征,选择最适合的 I/O 调度算法。比如,SSD 和虚拟机中的磁盘,通常用的是 noop 调度算法;而数据库应用,更推荐使用 deadline 算法。

  • 第三,优化文件系统和磁盘的缓存、缓冲区,比如优化脏页的刷新频率、脏页限额,以及内核回收目录项缓存和索引节点缓存的倾向等。

  • 第四,使用不同磁盘隔离不同应用的数据、优化文件系统的配置选项、优化磁盘预读、增大磁盘队列长度等

 

四、网络优化

总结篇:系统的网络性能评估及优化思路中,我也已经梳理了一些常见的优化思路。这些优化方法都是从 Linux 的网络协议栈出发,针对每个协议层的工作原理进行优化。最典型的几种网络优化方法。

1、首先,从内核资源和网络协议的角度来说,我们可以对内核选项进行优化,比如:

  • 可以增大套接字缓冲区、连接跟踪表、最大半连接数、最大文件描述符数、本地端口范围等内核资源配额;

  • 也可以减少 TIMEOUT 超时时间、SYN+ACK 重传数、Keepalive 探测时间等异常处理参数;

  • 还可以开启端口复用、反向地址校验,并调整 MTU 大小等降低内核的负担。

这些都是内核选项优化的最常见措施。

2、其次,从网络接口的角度来说,我们可以考虑对网络接口的功能进行优化,比如:

  • 可以将原来 CPU 上执行的工作,卸载到网卡中执行,即开启网卡的 GRO、GSO、RSS、VXLAN 等卸载功能;

  • 也可以开启网络接口的多队列功能,这样,每个队列就可以用不同的中断号,调度到不同 CPU 上执行;

  • 还可以增大网络接口的缓冲区大小以及队列长度等,提升网络传输的吞吐量。

3、最后,在极限性能情况(比如 C10M)下,内核的网络协议栈可能是最主要的性能瓶颈,所以,一般会考虑绕过内核协议栈。

  • 可以使用 DPDK 技术,跳过内核协议栈,直接由用户态进程用轮询的方式,来处理网络请求。同时,再结合大页、CPU 绑定、内存对齐、流水线并发等多种机制,优化网络包的处理效率。

  • 可以使用内核自带的 XDP 技术,在网络包进入内核协议栈前,就对其进行处理。这样,也可以达到目的,获得很好的性能。

 

五、应用程序优化

虽然系统的软硬件资源,是保证应用程序正常运行的基础,但你要知道,性能优化的最佳位置,还是应用程序内部。为什么这么说呢?如下举例:

第一个例子,是系统 CPU 使用率(sys%)过高的问题。有时候出现问题,虽然表面现象是系统 CPU 使用率过高,但分析过后,很可能会发现,应用程序的不合理系统调用才是罪魁祸首。这种情况下,优化应用程序内部系统调用的逻辑,显然要比优化内核要简单也有用得多。

第二个例子,数据库的 CPU 使用率高、I/O 响应慢的性能问题。一般来说,并不是因为数据库本身性能不好,而是应用程序不合理的表结构或者 SQL 查询语句导致的。这时候,优化应用程序中数据库表结构的逻辑或者 SQL 语句,显然要比优化数据库本身,能带来更大的收益。

 

所以,在观察性能指标时,应该先查看应用程序的响应时间、吞吐量以及错误率等指标,因为它们才是性能优化要解决的终极问题。以终为始,从这些角度出发,你一定能想到很多优化方法,下面几种方法。

  • 第一,从 CPU 使用的角度来说,简化代码、优化算法、异步处理以及编译器优化等,都是常用的降低 CPU 使用率的方法,这样可以利用有限的 CPU 处理更多的请求。

  • 第二,从数据访问的角度来说,使用缓存、写时复制、增加 I/O 尺寸等,都是常用的减少磁盘 I/O 的方法,这样可以获得更快的数据处理速度。

  • 第三,从内存管理的角度来说,使用大页、内存池等方法,可以预先分配内存,减少内存的动态分配,从而更好地内存访问性能。

  • 第四,从网络的角度来说,使用 I/O 多路复用、长连接代替短连接、DNS 缓存等方法,可以优化网络 I/O 并减少网络请求数,从而减少网络延时带来的性能问题。

  • 第五,从进程的工作模型来说,异步处理、多线程或多进程等,可以充分利用每一个 CPU 的处理能力,从而提高应用程序的吞吐能力。

  • 除上述方法,也可以使用消息队列、CDN、负载均衡等各种方法,来优化应用程序的架构,将原来单机要承担的任务,调度到多台服务器中并行处理。这样也往往能获得更好的整体性能。

 

虽然性能优化的方法很多,不过,一定要避免过早优化。性能优化往往会提高复杂性,这一方面降低了可维护性,另一方面也为适应复杂多变的新需求带来障碍。所以,性能优化最好是逐步完善,动态进行;不追求一步到位,而要首先保证,能满足当前的性能要求。发现性能不满足要求或者出现性能瓶颈后,再根据性能分析的结果,选择最重要的性能问题进行优化。

 

性能工具

一、工具选择的原则

只有当想了解某个性能指标,却不知道该怎么办的时候,才会想到,“要是有一个性能工具速查表就好了”这个问题。如果已知一个性能工具可用,我们更多会去查看这个工具的手册,找出它的功能、用法以及注意事项。

关于工具手册的查看,man 应该是我们最熟悉的方法,除了 man 之外,还有另外一个查询命令手册的方法info。info 可以理解为 man 的详细版本,提供了诸如节点跳转等更强大的功能。相对来说,man 的输出比较简洁,而 info 的输出更详细。所以,通常使用 man 来查询工具的使用方法,只有在 man 的输出不太好理解时,才会再去参考 info 文档。

要查询手册,前提一定是已知哪个工具可用。如果你还不知道要用哪个工具,就要根据想了解的指标,去查找有哪些工具可用。这其中:

  • 有些工具不需要额外安装,就可以直接使用,比如内核的 /proc 文件系统;

  • 而有些工具,则需要安装额外的软件包,比如 sar、pidstat、iostat 等。

所以,在选择性能工具时,除了要考虑性能指标这个目的外,还要结合待分析的环境来综合考虑。比如,实际环境是否允许安装软件包,是否需要新的内核版本等。

 

明白了工具选择的基本原则后,我们来看 Linux 的性能工具。如下面这张图,也就是 Brendan Gregg 整理的性能工具谱图。从 Linux 内核的各个子系统出发,汇总了对各个子系统进行性能分析时可以选择的工具。但还不够具体,比如,当你需要查看某个性能指标时,这张图里对应的子系统部分,可能有多个性能工具可供选择。但实际上,并非所有这些工具都适用,具体要用哪个,还需要你去查找每个工具的手册,对比分析做出选择。

图片来源:http://www.brendangregg.com/linuxperf.html

 

如下,就从 CPU、内存、磁盘 I/O 以及网络等几个角度,梳理这些常见的 Linux 性能工具,特别是从性能指标的角度出发,理清楚到底有哪些工具,可以用来监测特定的性能指标。

 

二、CPU 性能工具

从 CPU 的角度来说,主要的性能指标就是 CPU 的使用率、上下文切换以及 CPU Cache 的命中率等。下面这张图就列出了常见的 CPU 性能指标。

从这些指标出发,再把 CPU 使用率,划分为系统和进程两个维度,我们就可以得到,下面这个 CPU 性能工具速查表。

 

三、内存性能工具

从内存的角度来说,主要的性能指标,就是系统内存的分配和使用、进程内存的分配和使用以及 SWAP 的用量。下面这张图列出了常见的内存性能指标。

从这些指标出发,我们就可以得到如下表所示的内存性能工具速查表

注:最后一行 pcstat 的源码链接:https://github.com/tobert/pcstat

 

 四、磁盘 I/O 性能工具

从文件系统和磁盘 I/O 的角度来说,主要性能指标,就是文件系统的使用、缓存和缓冲区的使用,以及磁盘 I/O 的使用率、吞吐量和延迟等。下面这张图列出了常见的 I/O 性能指标。

从这些指标出发,我们就可以得到,下面这个文件系统和磁盘 I/O 性能工具速查表。

 

五、网络性能工具

从网络的角度来说,主要性能指标就是吞吐量、响应时间、连接数、丢包数等。根据 TCP/IP 网络协议栈的原理,可以把这些性能指标,进一步细化为每层协议的具体指标。如下图分别从链路层、网络层、传输层和应用层,列出了各层的主要指标。

从这些指标出发,我们就可以得到下面的网络性能工具速查表。

 

六、基准测试工具

除了性能分析外,很多时候,还需要对系统性能进行基准测试。比如,

  • 在文件系统和磁盘 I/O 模块中,使用 fio 工具,测试了磁盘 I/O 的性能。

  • 在网络模块中,使用 iperf、pktgen 等,测试了网络的性能。

  • 而在很多基于 Nginx 的案例中,使用 ab、wrk 等,测试 Nginx 应用的性能。

除了这些工具外,对于 Linux 的各个子系统来说,还有很多其他的基准测试工具可能会用到。下面这张图,是 Brendan Gregg 整理的 Linux 基准测试工具图谱:

图片来源:http://www.brendangregg.com/linuxperf.html

 


文章内容及图片整理来源:极客时间-Linux性能优化实战,希望对大家有所帮助~

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C-Jonn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值