百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

优化性能套路:带你战胜这只后段程序员的拦路虎

sinye56 2025-02-26 13:44 4 浏览 0 评论

来源|极客时间《卖桃者说》

作者|池建强

编辑|成敏

你好,这里是卖桃者说。

今天给大家推荐一篇文章,来自倪朋飞老师的专栏《Linux 性能优化实战》 ,文章主要讲的是优化性能的套路,这几乎是每个后端程序员都会遇到的拦路虎,欢迎收听。


你好,我是倪朋飞。

首先先来思考一下性能问题分析的一般步骤。

我们可以从系统资源瓶颈和应用程序瓶颈,这两个角度来分析性能问题的根源。

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

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

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

当然,虽然系统和应用是两个不同的角度,但在实际运行时,它们往往相辅相成、相互影响。

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

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

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

今天,我就带你一起来看看,性能优化的一般方法。同上一节的性能分析一样,我们也可以从系统和应用程序,这两个不同的角度来进行性能优化。

系统优化

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

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

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

CPU 优化

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

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

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

内存优化

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

在我看来,你可以通过以下几种方法,来优化内存的性能。

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

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

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

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

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

网络优化

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

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

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

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

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

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

最后,在极限性能情况(比如 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、负载均衡等各种方法,来优化应用程序的架构,将原来单机要承担的任务,调度到多台服务器中并行处理。这样也往往能获得更好的整体性能。

小结

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

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

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

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

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

思考

最后,我想邀请你一起来聊聊,当碰到性能问题后,你是怎么进行优化的?有没有哪个印象深刻的经历可以跟我分享呢?你可以结合我的讲述,总结自己的思路。


内容听完了,你对系统性能优化是不是有了更深入的认识?很多人问我该学什么,如果你基础不够扎实,应该优先去学习和理解这样的基础知识,比如计算机原理、算法、网络、协议、性能等等,万丈高楼平地起,有了这些基础,其他问题就会迎刃而解了。

这就是今天的内容,希望能给你带来帮助!

点击链接,阅读更多文章!

相关推荐

CTO偷偷传我的系统性能优化十大绝招(万字干货)

上篇引言:取与舍软件设计开发某种意义上是“取”与“舍”的艺术。关于性能方面,就像建筑设计成抗震9度需要额外的成本一样,高性能软件系统也意味着更高的实现成本,有时候与其他质量属性甚至会冲突,比如安全性、...

提升效率!VMware虚拟机性能优化十大实用技巧

我40岁,干跨境婚恋中介的。为服务各国用户,常得弄英语、日语、俄语系统环境,VMware虚拟机帮了不少忙。用久了发现优化下性能,效率能更高。今儿就来聊聊优化技巧和同类软件。一、VMware虚拟...

低延迟场景下的性能优化实践

本文摘录自「全球C++及系统软件技术大会」ScottMeyers曾说到过,如果你不在乎性能,为什么要在C++这里,而不去隔壁的Pythonroom呢?今天我们就从“低延迟的概述”、“低延迟系...

Linux性能调优之内存负载调优的一些笔记

写在前面整理一些Linux内存调优的笔记,分享给小伙伴博文没有涉及的Demo,理论方法偏多,可以用作内存调优入门博文内容涉及:Linux内存管理的基本理论寻找内存泄露的进程内存交换空间调优不同方式的...

优化性能套路:带你战胜这只后段程序员的拦路虎

来源|极客时间《卖桃者说》作者|池建强编辑|成敏你好,这里是卖桃者说。今天给大家推荐一篇文章,来自倪朋飞老师的专栏《Linux性能优化实战》,文章主要讲的是优化性能的套路,这几乎是每个后端程序员...

SK海力士CXL优化解决方案已成功搭载于Linux:带宽提升30%,性能提升12%以上

SK海力士宣布,已将用于优化CXL(ComputeExpressLink)存储器运行的自研软件异构存储器软件开发套件(HMSDK)中主要功能成功搭载于全球最大的开源操作系统Linux上,不但提升了...

Linux内核优化:提升系统性能的秘诀

Linux内核优化:提升系统性能的艺术在深入Linux内核优化的世界之前,让我们先来理解一下内核优化的重要性。Linux内核是操作系统的核心,负责管理系统资源和控制硬件。一个经过精心优化的内核可以显著...

Linux系统性能优化:七个实战经验

Linux系统的性能是指操作系统完成任务的有效性、稳定性和响应速度。Linux系统管理员可能经常会遇到系统不稳定、响应速度慢等问题,例如在Linux上搭建了一个web服务,经常出现网页无法打开、打开速...

腾讯面试:linux内存性能优化总结

【1】内存映射Linux内核给每个进程都提供了一个独立且连续的虚拟地址空间,以便进程可以方便地访问虚拟内存;虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长的处理器,地址空间的范围也不同...

Linux文件系统性能调优《参数优化详解》

由于各种的I/O负载情形各异,Linux系统中文件系统的缺省配置一般来说都比较中庸,强调普遍适用性。然而在特定应用下,这种配置往往在I/O性能方面不能达到最优。因此,如果应用对I/O性能要求较高,除...

Nginx 性能优化(吐血总结)

一、性能优化考虑点当我需要进行性能优化时,说明我们服务器无法满足日益增长的业务。性能优化是一个比较大的课题,需要从以下几个方面进行探讨当前系统结构瓶颈了解业务模式性能与安全1、当前系统结构瓶颈首先需要...

Linux问题分析与性能优化

排查顺序整体情况:top/htop/atop命令查看进程/线程、CPU、内存使用情况,CPU使用情况;dstat2查看CPU、磁盘IO、网络IO、换页、中断、切换,系统I/O状态;vmstat2查...

大神级产品:手机装 Linux 运行 Docker 如此简单

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:灵昱Termux作为一个强大的Android终端模拟器,能够运行多种Linux环境。然而,直接在Termux上运行Docker并不可行,需要...

新手必须掌握的Linux命令

Shell就是终端程序的统称,它充当了人与内核(硬件)之间的翻译官,用户把一些命令“告诉”终端程序,它就会调用相应的程序服务去完成某些工作。现在包括红帽系统在内的许多主流Linux系统默认使用的终端是...

Linux 系统常用的 30 个系统环境变量全解析

在Linux系统中,环境变量起着至关重要的作用,它们犹如隐藏在系统背后的“魔法指令”,掌控着诸多程序的运行路径、配置信息等关键要素。尤其在shell脚本编写时,巧妙运用环境变量,能让脚本如虎...

取消回复欢迎 发表评论: