Linux性能优化实战学习笔记:第五十六讲

1、上节回顾

上一节,我带你一块儿梳理了,性能问题分析的通常步骤。先带你简单回顾一下。算法

咱们能够从系统资源瓶颈和应用程序瓶颈,这两个角度来分析性能问题的根源。数据库

从系统资源瓶颈的角度来讲,USE 法是最为有效的方法,即从使用率、饱和度以及错误数这三个方面,来分析 CPU、内存、磁盘和文件系统 I/O、网络以及内核资源限制等各种软硬件资源。至
于这些资源的分析方法,我也带你一块儿回顾了,我们专栏前面几大模块的分析套路。缓存

从应用程序瓶颈的角度来讲,能够把性能问题的来源,分为资源瓶颈、依赖服务瓶颈以及应用自身的瓶颈这三类。性能优化

  1. 资源瓶颈的分析思路,跟系统资源瓶颈是同样的。
  2. 依赖服务的瓶颈,可使用全链路跟踪系统,进行快速定位。
  3. 而应用自身的问题,则能够经过系统调用、热点函数,或者应用自身的指标和日志等,进行分析定位。

固然,虽然系统和应用是两个不一样的角度,但在实际运行时,它们每每相辅相成、相互影响。服务器

  1. 系统是应用的运行环境,系统瓶颈会致使应用的性能降低。
  2. 而应用程序不合理的设计,也会引起系统资源的瓶颈。

咱们作性能分析,就是要结合应用程序和操做系统的原理,揪出引起问题的“真凶“。网络

找到性能问题的来源后,整个优化工做其实也就完成了一大半,由于这些瓶颈为咱们指明了优化的方向。不过,对于性能优化来讲,又有哪些常见的方法呢?数据结构

今天,我就带你一块儿来看看,性能优化的通常方法。同上一节的性能分析同样,咱们也能够从系统和应用程序,这两个不一样的角度来进行性能优化。多线程

2、系统优化

首先来看系统的优化。在上一节,我曾经介绍过,USE 法能够用来分析系统软硬件资源的瓶颈,那么,相对应的优化方法,固然也是从这些资源瓶颈入手。架构

实际上,我们专栏的前四个模块,除了最核心的系统资源瓶颈分析以外,也已经包含了这些常见资源瓶颈的优化方法。并发

接下来,我就从 CPU 性能、内存性能、磁盘和文件系统 I/O 性能以及网络性能等四个方面,带你回顾一下它们的优化方法。

3、CPU 优化

首先来看 CPU 性能的优化方法。在CPU 性能优化的几个思路中,我曾经介绍过, CPU 性能优化的核心,在于排除全部没必要要的工做、充分利用 CPU 缓存并减小进程调度对性能的影响。

从这几个方面出发,我相信你已经想到了不少的优化方法。这里,我主要强调一下,最典型的三种优化方法。

  1. 第一种,把进程绑定到一个或者多个 CPU 上,充分利用 CPU 缓存的本地性,并减小进程间的相互影响。
  2. 第二种,为中断处理程序开启多 CPU 负载均衡,以便在发生大量中断时,能够充分利用多CPU 的优点分摊负载。
  3. 第三种,使用 Cgroups 等方法,为进程设置资源限制,避免个别进程消耗过多的 CPU。同时,为核心应用程序设置更高的优先级,减小低优先级任务的影响。

4、内存优化

说完了 CPU 的性能优化,咱们再来看看,怎么优化内存的性能。在如何“快准狠”找到系统内存的问题中,我曾经为你梳理了常见的一些内存问题,好比可用内存不足、内存泄漏、Swap 过
多、缺页异常过多以及缓存过多等等。因此,说白了,内存性能的优化,也就是要解决这些内存使用的问题。

在我看来,你能够经过如下几种方法,来优化内存的性能。

  1. 第一种,除非有必要,Swap 应该禁止掉。这样就能够避免 Swap 的额外 I/O ,带来内存访问变慢的问题。
  2. 第二种,使用 Cgroups 等方法,为进程设置内存限制。这样就能够避免个别进程消耗过多内存,而影响了其余进程。对于核心应用,还应该下降 oom_score,避免被 OOM 杀死。
  3. 第三种,使用大页、内存池等方法,减小内存的动态分配,从而减小缺页异常。

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

接下来,咱们再来看第三类系统资源,即磁盘和文件系统 I/O 的优化方法。在磁盘 I/O 性能优化的几个思路 中,我已经为你梳理了一些常见的优化思路,这其中有三种最典型的方法。

  1. 第一种,也是最简单的方法,经过 SSD 替代 HDD、或者使用 RAID 等方法,提高 I/O 性能。
  2. 第二种,针对磁盘和应用程序 I/O 模式的特征,选择最适合的 I/O 调度算法。好比,SSD 和虚拟机中的磁盘,一般用的是 noop 调度算法;而数据库应用,更推荐使用 deadline 算法。
  3. 第三,优化文件系统和磁盘的缓存、缓冲区,好比优化脏页的刷新频率、脏页限额,以及内核回收目录项缓存和索引节点缓存的倾向等等。

除此以外,使用不一样磁盘隔离不一样应用的数据、优化文件系统的配置选项、优化磁盘预读、增大磁盘队列长度等,也都是经常使用的优化思路。

6、网络优化

最后一个是网络的性能优化。在网络性能优化的几个思路中,我也已经为你梳理了一些常见的优化思路。这些优化方法都是从 Linux 的网络协议栈出发,针对每一个协议层的工做原理进行优化。
这里,我一样强调一下,最典型的几种网络优化方法。

首先,从内核资源和网络协议的角度来讲,咱们能够对内核选项进行优化,好比:

  • 你能够增大套接字缓冲区、链接跟踪表、最大半链接数、最大文件描述符数、本地端口范围等
  • 也能够减小 TIMEOUT 超时时间、SYN+ACK 重传数、Keepalive 探测时间等异常处理参数;
  • 还能够开启端口复用、反向地址校验,并调整 MTU 大小等下降内核的负担。

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

其次,从网络接口的角度来讲,咱们能够考虑对网络接口的功能进行优化,好比:

  • 你能够将原来 CPU 上执行的工做,卸载到网卡中执行,即开启网卡的 GRO、GSO、RSS、VXLAN 等卸载功能;
  • 也能够开启网络接口的多队列功能,这样,每一个队列就能够用不一样的中断号,调度到不一样 CPU上执行;
  • 还能够增大网络接口的缓冲区大小以及队列长度等,提高网络传输的吞吐量。

最后,在极限性能状况(好比 C10M)下,内核的网络协议栈多是最主要的性能瓶颈,因此,通常会考虑绕过内核协议栈。

  • 你可使用 DPDK 技术,跳过内核协议栈,直接由用户态进程用轮询的方式,来处理网络请求。同时,再结合大页、CPU 绑定、内存对齐、流水线并发等多种机制,优化网络包的处理效率。
  • 你还可使用内核自带的 XDP 技术,在网络包进入内核协议栈前,就对其进行处理。这样,也能够达到目的,得到很好的性能。

7、应用程序优化

说完了系统软硬件资源的优化,接下来,咱们再来看看应用程序的优化思路。

虽然系统的软硬件资源,是保证应用程序正常运行的基础,但你要知道, 性能优化的最佳位置,仍是应用程序内部。为何这么说呢?我简单举两个例子你就明白了。

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

再好比说,数据库的 CPU 使用率高、I/O 响应慢,也是最多见的一种性能问题。这种问题,通常来讲,并非由于数据库自己性能很差,而是应用程序不合理的表结构或者 SQL 查询语句致使
的。这时候,优化应用程序中数据库表结构的逻辑或者 SQL 语句,显然要比优化数据库自己,能带来更大的收益。

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

  1. 第一,从 CPU 使用的角度来讲,简化代码、优化算法、异步处理以及编译器优化等,都是经常使用的下降 CPU 使用率的方法,这样能够利用有限的 CPU 处理更多的请求。
  2. 第二,从数据访问的角度来讲,使用缓存、写时复制、增长 I/O 尺寸等,都是经常使用的减小磁盘I/O 的方法,这样能够得到更快的数据处理速度。
  3. 第三,从内存管理的角度来讲,使用大页、内存池等方法,能够预先分配内存,减小内存的动态分配,从而更好地内存访问性能。
  4. 第四,从网络的角度来讲,使用 I/O 多路复用、长链接代替短链接、DNS 缓存等方法,能够优化网络 I/O 并减小网络请求数,从而减小网络延时带来的性能问题。
  5. 第五,从进程的工做模型来讲,异步处理、多线程或多进程等,能够充分利用每个 CPU 的处理能力,从而提升应用程序的吞吐能力。

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

8、小结

今天,我带你一块儿,从系统和应用程序这两个角度,梳理了常见的性能优化方法。

从系统的角度来讲,CPU、内存、磁盘和文件系统 I/O、网络以及内核数据结构等各种软硬件资源,为应用程序提供了运行的环境,也是咱们性能优化的重点对象。你能够参考我们专栏前面四
个模块的优化篇,优化这些资源。

从应用程序的角度来讲,下降 CPU 使用,减小数据访问和网络 I/O,使用缓存、异步处理以及多进程多线程等,都是经常使用的性能优化方法。除了这些单机优化方法,调整应用程序的架构,或是
利用水平扩展,将任务调度到多台服务器中并行处理,也是经常使用的优化思路。

虽然性能优化的方法不少,不过,我仍是那句话,必定要避免过早优化。性能优化每每会提升复杂性,这一方面下降了可维护性,另外一方面也为适应复杂多变的新需求带来障碍。

因此,性能优化最好是逐步完善,动态进行;不追求一步到位,而要首先保证,能知足当前的性能要求。发现性能不知足要求或者出现性能瓶颈后,再根据性能分析的结果,选择最重要的性能问题进行优化。

相关文章
相关标签/搜索