网站链接: element-ui dtcms
当前位置: 首页 > 技术博文  > 技术博文

【linux性能优化】优化性能问题的一般方法

2021/6/25 0:24:30 人评论

找到性能问题的来源后,整个优化工作其实也就完成了一大半,因为这些瓶颈指明了优化的方向。不过,对于性能优化来说又有哪些常见的方法呢? 和性能分析一样,从系统和应用程序这两个不同的角度来进行性能优化。接下来一起…

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

和性能分析一样,从系统和应用程序这两个不同的角度来进行性能优化。接下来一起看看性能优化的一般方法

一、系统优化

首先来看系统的优化

USE法可以用来分析系统软硬件资源的瓶颈,那么,相对应的优化方法当然也是从这些资源瓶颈入手

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

1.1 CPU 优化

首先来看CPU性能的优化方法

在CPU性能优化的几个思路中提及,CPU性能优化的核心在于排除所有不必要的工作、充分利用CPU缓存并减少进程调度对性能的影响

从这几个方面出发,涉及到很多的优化方法。这里主要强调最典型的三种优化方法

  • 把进程绑定到一个或者多个CPU上

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

  • 为中断处理程序开启多CPU负载均衡

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

  • 为进程设置资源限制

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

1.2 内存优化

再来看看怎么优化内存的性能

在【linux性能优化】如何定位系统内存的问题中梳理了常见的一些内存问题,比如可用内存不足、内存泄漏、Swap过多、缺页异常过多以及缓存过多等等。所以,内存性能的优化也就是要解决这些内存使用的问题

可以通过以下几种方法来优化内存的性能

  • 禁止掉Swap

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

  • 为进程设置内存限制

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

  • 使用大页、内存池等方法

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

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

接下来看第三类系统资源,即磁盘和文件系统 I/O 的优化方法

在【linux性能优化】磁盘I/O性能优化思路中,梳理了一些常见的优化思路

这其中有三种最典型的方法

  • SSD替代HDD

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

  • 选择最适合的I/O调度算法

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

  • 优化文件系统和磁盘的缓存

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

除此之外,其他常用的优化思路:

  1. 使用不同磁盘隔离不同应用的数据
  2. 优化文件系统的配置选项
  3. 优化磁盘预读
  4. 增大磁盘队列长度

1.4 网络优化

最后一个是网络的性能优化

在【linux性能优化】网络性能优化的思路中,梳理了一些常见的优化思路

这些优化方法都是从Linux的网络协议栈出发,针对每个协议层的工作原理进行优化。这里同样强调一下最典型的几种网络优化方法:

1.4.1 从内核资源和网络协议的角度

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

  • 可以增大套接字缓冲区、连接跟踪表、最大半连接数、最大文件描述符数、本地端口范围等内核资源配额
  • 可以减少TIMEOUT超时时间、SYN+ACK重传数、Keepalive探测时间等异常处理参数
  • 可以开启端口复用、反向地址校验,并调整MTU大小等降低内核的负担

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

1.4.2 从网络接口的角度

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

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

1.4.2 在极限性能情况

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

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

二、应用程序优化

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

虽然系统的软硬件资源是保证应用程序正常运行的基础,但性能优化的最佳位置还是应用程序内部。为什么这么说呢?接下来简单举两个例子

  • 系统CPU使用率(sys%)过高

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

  • 数据库的CPU使用率高且I/O响应慢

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

所以,在观察性能指标时应该先查看应用程序的响应时间、吞吐量以及错误率等指标,因为它们才是性能优化要解决的终极问题

从这些角度出发涉及到很多优化方法,推荐下面几种方法

  • 从CPU使用的角度

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

  • 从数据访问的角度

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

  • 从内存管理的角度

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

  • 从网络的角度

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

  • 从进程的工作模型

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

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

三、小结

一起从系统和应用程序这两个角度,梳理了常见的性能优化方法

  • 从系统的角度

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

  • 从应用程序的角度

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

虽然性能优化的方法很多,不过一定要避免过早优化。性能优化往往会提高复杂性,这一方面降低了可维护性,另一方面也为适应复杂多变的新需求带来障碍

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

相关资讯

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?