我们上一次说了,性能分析的常见套路,可以从系统资源瓶颈 应用程序瓶颈这两个角度来分析性能问题的根源

那么这一节,我们说一下性能优化的一般方法,这一次,也是从系统和应用程序这两个角度来进行性能分析

系统优化,依旧是从四个模块入手,我们从CPU性能,内存性能 磁盘和文件系统IO以及网络性能四个方面,回顾下优化方法

1.CPU的优化

在其中,我们可以先将进程和CPU进行绑定,充分发挥CPU缓冲的本地性,

然后为中断程序开启多CPU负载均衡,发生大量中断的时候,充分利用多CPU的优势分摊负载,

最后利用cgroups,限制资源使用,避免进程消耗过多的CPU,以及为核心应用程序设置更高的优先级,避免低优先级任务的影响

2.内存的优化

首先是禁用Swap,避免额外的IO

然后是使用Cgroups,为进程限制内存大小,减低oom_score

最后使用大页,内存池等方法,减少内存分配

3.磁盘IO优化

首先是升级磁盘,利用SSD代替HDD

然后是选择合适的IO调度算法,比如SSD和虚拟机汇总的磁盘,使用是noop调度算法,数据库则建议是deadline算法

优化文件系统和磁盘缓存,优化脏页的刷新频率,以及内核回收目录和索引节点缓存倾向等

4.网络的优化

从两个角度出发,分别是内核资源和网络协议

我们可以增大套接字缓冲区,连接跟踪表,最大半连接数,最大文件描述符 本地端口范围等

以及减少TIMEOUT超时,SYN-ACK重传数,Keepalive探测时间等异常处理

开启端口复用,反向地址校验,调整MTU大小等内核负担

网络协议上

可以将原本的CPU上的工作,卸载到网卡执行,比如GRO RSS VXLAN等功能

开启网络接口的多队列功能,调度到不同的CPU上执行

开启网络缓冲区大小和队列长度等,提升网络传输吞吐量

最后,可以考虑替换内核协议栈,使用dpdk,跳过内核协议栈,或者是XDP进行预处理

应用程序的优化,个人觉着重要性大于系统优化,

毕竟,系统CPU使用率过高,有时看起来是系统瓶颈,但往往是应用程序的不合理调用导致的,优化应用程序内部逻辑,比优化内核要简单的多

再者说,数据库的CPU使用率高,IO响应慢,是常见的性能问题,这种一般不是数据库本身性能不好,而是不合理的表结构或者查询语句导致的?

在观察性能指标的时候,先查看应用程序的响应时间 吞吐量 错误率等指标,然后进行优化

常见的方法有:

从CPU使用的角度来说,简化代码,优化算法,异步处理,编译器优化,都是常用的降低CPU使用率的方法

然后从数据访问的角度,使用缓存,内存,减少IO的使用,都是常用的减少磁盘IO的方法

从内存管理的角度,使用大页,内存池,预先分配内存,减少内存动态分配

之后从网络角度来说,使用IO多路复用,长链接代替短连接 DNS缓存等方法,可以优化网络IO并减少请求数

最后从进程工作模型来说,异步处理,多进程或者多线程等,可以充分的利用每一个CPU的处理能力,减少应用程序的吞吐能力

除此外,应用程序还可以使用消息队列,CDN,负载均衡等方法,优化应用程序的架构,将原来单机承担的任务,调度到多个服务器上并行

今天,我们从系统和应用程序两个角度,梳理了常见的性能优化

系统的角度,还是CPU 内存 磁盘 文件系统IO 网络这些软硬件资源

应用程序的角度,降低CPU使用,减少数据访问和网络IO,使用缓存 异步处理这些方法

可以调整应用程序的架构

发表评论

邮箱地址不会被公开。 必填项已用*标注