我们上一次说了,性能分析的常见套路,可以从系统资源瓶颈 应用程序瓶颈这两个角度来分析性能问题的根源
那么这一节,我们说一下性能优化的一般方法,这一次,也是从系统和应用程序这两个角度来进行性能分析
系统优化,依旧是从四个模块入手,我们从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,使用缓存 异步处理这些方法
可以调整应用程序的架构