Linux 性能优化:轻松入门
文章目录
- 前言
- 一、磁盘性能优化
- 1、 磁盘 RAID 模式选择
- 2、文件系统优化
- 二、优化 CPU
- 1、性能监控 :
- 2、进程优先级调整 :
- 3、进程与 CPU 绑定 :
- 三、优化内存
- 四、网络性能优化
- 1、调整 TCP 缓冲区大小
- 2、修改系统级别的文件描述符的数量
- 3、调整 TCP 时间等待(TIME-WAIT)套接字的数量
- 4、启用或调整 TCP 拥塞控制算法
- 5、 禁用 ipv6 网络
- 6、其他改善网络性能的方法
- 总结
前言
Linux 系统作为众多关键技术基础设施的 核心 ,其性能优化的重要性不言而喻。掌握 Linux 系统 性能优化 的策略和技巧,都是提升系统效率、保障服务稳定性的关键。本文将带领大家深入探索Linux系统性能优化的 多个维度 ,从磁盘的 RAID 模式选择到 CPU 和内存的精细调整,再到网络性能的全面提升,每一环节都旨在帮助您的系统达到更高的 运行效率 。
(图片来源网络,侵删)大家好,我是技术界的小萌新,今天要和大家分享一些干货。在阅读之前请先点赞👍,给我一点鼓励吧!这对我来说很重要 (*^▽^*)
一、磁盘性能优化
1、 磁盘 RAID 模式选择
系统优化是一个 持续 的过程,它涉及到硬件、软件以及它们之间的 交互 。磁盘阵列作为系统硬件的基础组成部分,在优化过程中扮演着关键角色。合理配置磁盘阵列不仅可以 提升系统性能 ,还可以根据应用需求实现成本效益和技术性能的最佳 平衡 。
系统安装是构建任何服务平台的第一步。每一步都对系统的最终性能有着深远的影响。特别是磁盘阵列的配置,它决定了数据的存储方式、读写速度以及数据的安全性,常用的独立磁盘冗余阵列 (RAID) 模式有 RAID 0 (条带模式),RAID 1 (镜像模式), RAID 5 与 RAID 6 (镜像校验模式),以及冗余增加 100% ,I/O 效率提升的 RAID 10 (镜像条带化模式)。根据业务场景可以参考以下思路进行优化:
- RAID 0:适用于高速读写需求,无数据冗余,成本效益高,适合视频编辑、大数据分析等场景。
- RAID 1:镜像双份数据,提供数据的高安全性,读写性能受限,适用于财务系统、医疗记录等对数据安全要求极高的业务。
- RAID 5:分布式奇偶校验,提供数据安全同时优化读取性能,写入性能较低,适合Web服务器、邮件系统等读密集型应用。
- RAID 6:双奇偶校验,进一步增强数据安全,可在两块硬盘故障时保护数据,适合需要高可靠性和数据冗余的数据中心。
- RAID 10:结合镜像与条带化,提供高性能和数据安全,成本较高,适用于对读写性能和数据保护都有高要求的数据库系统。
RAID 具体的各方面特点比较如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xaI3srhM-1721013974272)(https://i-blog.csdnimg.cn/direct/e19225da61a04017a864db46c4cefa62.png#pic_center =80%x)]
2、文件系统优化
在 Linux 系统中,文件系统不仅是数据存储的基础设施,也是影响系统性能的因素之一。选择好的文件系统并对其进行细致的优化,可以进行数据存取效率方面的提升,并 降低延迟 ,提高系统的整体性能,
不同的文件系统设计目标不同,如 ext4 适合多数通用场景, XFS 适合大数据量处理,选择易于管理和维护的文件系统也可以降低系统的 长期运营成本 ,以下同样是一些不同文件系统可以应用的场景提供给大家,作为优化的思路和方向:
- Web应用通常需要快速响应和高并发处理能力,选择具有高 I/O 吞吐量的文件系统如XFS或Btrfs。
- 数据库操作对数据的安全性和一致性要求高,ext4 的 journaling 模式或 XFS 的 WAL 特性是好的选择。
- 大数据处理需要高效的读写性能和大文件支持,HDFS 或 Btrfs 可能更合适。
- 视频和音频编辑需要高速读写和大文件处理能力,XFS 或专为 SSD 优化的文件系统如 F2FS 是优选。
文件系统的优化是 Linux 性能优化中不可忽视的一环。通过细致的需求分析、明智的选择和恰当的配置调整,可以确保文件系统高效稳定地服务于应用需求,提升 Linux 系统的性能和响应速度。性能优化是一个持续的过程,需要根据系统的实际运行情况进行不断的评估和调整。
二、优化 CPU
在Linux系统的性能优化中,CPU 优化是 核心 环节之一。CPU 作为计算的核心资源,往往是系统性能的瓶颈,特别是在计算密集型应用中,其性能的充分发挥对于整个系统的性能表现至关重要,优化CPU 性能可以 减少 进程等待时间, 提高 系统响应速度。
CPU 优化思路是确保系统资源得到有效利用,在面对高负载或特定应用场景时,合理的优化方式可以显著提升系统性能,不过深入的了解 CPU 优化可能让人晦涩难懂,这里只提出几点容易 实现 的思路与方法:
1、性能监控 :
通常可以使用工具如 top 、ps 和 pidstat 等监控 CPU 使用情况,对性能瓶颈进行识别,这时候我们需要清楚 CPU 使用率 和 平均负载率 的区别,平均负载率是指单位时间内,指的是正在运行或等待 CPU 资源的进程,平均负载率不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。
有这样一种场景,发生在 I/O 密集型操作中,当系统进行大量的磁盘读写操作时,进程可能会因为等待 I/O 操作完成而 阻塞 ,导致平均负载升高,而 CPU 使用率却不高,而如果数据库查询时没有 索引 或存在 死锁 也可能出现同样的状况,这时候就需要根据脚本工具 甄别 系统 瓶颈 。
2、进程优先级调整 :
使用 nice 和 renice 命令:通过 nice 命令可以在启动进程时设置其优先级,而 renice 命令可以调整正在运行的进程的优先级。例如,要将某个进程的优先级设置为 -10 (高优先级),可以使用 renice -10 pid 命令。
3、进程与 CPU 绑定 :
使用 taskset 命令:taskset 命令可以将进程绑定到特定的 CPU 核心上,可以减少 CPU 的上下文切换,提高执行效率。例如,要将进程ID为 123 的进程绑定到 CPU 核心 2 上,可以使用 taskset -cp 2 123 (-c 指定 CPU -p 指定 PID 号),这样人为的调度进程对于一些核心业务可能会更加合理。
三、优化内存
在任何系统中,内存资源都是有限的。随着应用程序的增多和数据量的增大,对内存的需求也随之增长。内存资源的优化至关重要,因为内存是影响系统性能的关键因素之一。内存不足会导致频繁的页面交换( Page Swapping ),进而降低系统响应速度和处理能力。页面交换是当物理内存不足时,操作系统将部分内存数据暂时存储到磁盘上的过程。
这个过程会显著降低系统响应速度。通过优化内存,可以减少页面交换,提高系统的整体性能。内存优化通常是使磁盘 I/O 操作减少来提高能效。因为磁盘操作通常比内存操作消耗更多的能量,减少页面交换可以降低系统的整体能耗。
一般来说,如果能不使用交换空间 ( swap ) 最好,因为磁盘 I/O 操作通常比内存慢很多,例如一条 64 位的 DDR4-3200 内存的数据传输速率可以通过以下计算得出:3200MT/s x 64bit / 8 = 25600MB/s = 25.6 GB/s。而现在通用的 PCIE 4.0 固态硬盘速度最高都只有 7000 MB/s 左右的读取速率,两者差距接近四倍。
所以 Kubernetes 1.22 版本前不支持 Linux 节点上的交换空间,因为交换内存的使用会影响性能和资源管理。Kubelet 官方 建议 不使用交换空间,默认在检测到交换空间时无法启动。关闭交换空间可以避免性能下降,尤其是在性能敏感的环境下。尽管新版本改进了对交换空间的支持,但在追求高性能的场景中,关闭交换空间仍然是 推荐 的做法。接下来可通过以下命令关闭交换空间:
swapoff -a
# 关闭所有交换空间的挂载
sed -i '/swap/d' /etc/fstab
# 匹配删除所有 swap 交换空间挂载行
如果业务临时需要交换空间的 冗余性 以对抗系统高负载情景,也可以通过优化 vm.swappiness 参数,它是 Linux 内核中用于控制内存和交换空间 使用倾向 的一个参数,决定了内核在内存紧张时使用交换空间的积极程度。它的取值范围是0到100,vm.swappiness = 0 时,内核将 尽可能少 地使用交换空间,同时优化以下参数也可以优化内存使用情况。
vm.dirty_ratio 和 vm.dirty_background_ratio 参数是 Linux 系统中控制内存中脏页(dirty pages)行为的两个关键内核参数。脏页是指那些已经 被修改过 并且需要 被写入 磁盘的 内存页 。这 2 个参数可以视为内存使用的 安全警戒线 。一旦内存中的脏页比例达到这个值,系统就会主动介入,确保数据及时被 "写回 到磁盘,防止内存被过度 占用 ,vm.dirty_background_ratio 则是针对后台进程,这两个参数默认值通常为 30%,10%。对于内存受限的系统,合理配置 vm.swappiness 可以防止 内存溢出 ,同时保持系统性能。有两种需要调整脏页比例的场景如下:
- 应用服务数据较为重要 → 通常减少脏页比例,加快数据写入硬盘速度,提高数据安全性。
- 在某些应用中数据重要性较低,可以接受数据丢失 → 增加脏页比例,加快内存响应速度。
最后我们通过以下方法修改系统内核中交换倾向和脏页比例。
[root@ECS-TEST ~] echo "vm.swappiness = 0 vm.dirty_background_ratio = 50 vm.dirty_ratio = 80 " >> /etc/sysctl.conf [root@ECS-TEST ~] sysctl -p vm.swappiness = 0 vm.dirty_background_ratio = 50 vm.dirty_ratio = 80 # 脏页比例修改成功
四、网络性能优化
在现代计算环境中,网络成为连接各种服务和应用的关键纽带。Linux 系统作为服务器或工作站,其网络性能直接影响到数据传输效率、服务响应速度和 用户体验 。网络延迟和带宽限制可能导致 服务中断 、数据包丢失,甚至 安全问题 ,网络性能也将成为限制系统整体性能的瓶颈。
例如,在高并发场景下,如果网络处理能力不足,将导致请求 积压 ,影响服务的可用性和响应速度。因此,优化网络性能是确保 Linux 系统高效、稳定运行的 前提 。对网络性能的调优需要借助各种工具来了解系统的瓶颈,这里推荐 iperf3 广泛用于测试网络带宽和延迟,Netperf 支持多种网络性能测试, iftop 实时监控网络接口的流量,帮助识别流量高峰和异常流量模式,非常好用。通过工具 分析网络流量 和系统日志, 识别 网络性能的 瓶颈 是网络硬件、配置问题还是软件缺陷。由于篇幅原因,具体的使用方法就不多赘述,可自行了解。
这里我专门收集了一些简单易上手的网络性能优化方法,在保证效果的同时也帮助大家了解 Linux 网络调优 的思路并入门。
1、调整 TCP 缓冲区大小
TCP 协议的一个重要特性是它使用 缓冲区 来管理数据的发送和接收。缓冲区大小是指 TCP socket 为发送和接收数据保留的 内存空间大小 。在高带宽、 高并发 、或高延迟环境下,需要增大缓冲区,来提高 TCP 连接一次性发送的数据量,减少网络 往返次数 ,提高大数据传输的效率。
但设置过大的缓冲区可能会导致内存浪费。如果缓冲区较小,接收方可能需要更频繁地处理数据包,这可能导致网络延迟。通过以下调整内核参数来指定 TCP socket 缓冲区的默认和 最大值 。
[root@TEST ~] echo "net.core.rmem_default=8388608" >> /etc/sysctl.conf # TCP 套接字缓冲用于接受数据包的内存默认值,这里设置为 8 MB(8388608 字节)。 [root@TEST ~] echo "net.core.rmem_max=16777216" >> /etc/sysctl.conf # TCP 套接字缓冲用于接受数据包的内存最大值,这里设置为 16 MB,单个 TCP 连接的发送缓冲区也不会超过这个大小。 [root@TEST ~] echo "net.core.wmem_default=68388608" >> /etc/sysctl.conf # TCP 套接字缓冲用于发送数据包的内存默认值,设置为 8 MB [root@TEST ~] echo "net.core.wmem_max=16777216" >> /etc/sysctl.conf # TCP 套接字缓冲用于发送数据包的内存最大值,设置为 16 MB [root@TEST ~] sysctl -p net.core.rmem_default=8388608 net.core.rmem_max=16777216 net.core.wmem_default=68388608 net.core.wmem_max=16777216
2、修改系统级别的文件描述符的数量
增加文件描述符的数量可以允许系统打开更多的 网络连接 ,适用于高并发场景。但过高的值可能会消耗过多资源,我们可以适当提高系统打开文件描述符的最大值。
[root@TEST ~] echo "fs.file-max = 100000" >> /etc/sysctl.conf [root@TEST ~] sysctl -p fs.file-max = 100000
3、调整 TCP 时间等待(TIME-WAIT)套接字的数量
TIME-WAIT 状态是 TCP 连接关闭过程中的最后一个状态,这个状态的目的是确保所有重复的或延迟的数据包都被 丢弃 ,避免它们干扰新的连接。在 TIME-WAIT 状态下,连接使用的本地端口和远程IP地址+端口对被保留,不能用于新的连接。
net.ipv4.tcp_max_tw_buckets 用于设置 TIME-WAIT 套接字的最大数量,如果将 TIME-WAIT 状态参数调小,内核将更积极地清除 TIME-WAIT 状态的套接字。这可以减少它所占用的资源,加快端口的复用,从而允许更多的连接能够被快速建立。
不过过多减少 TIME-WAIT 可能会引起IP地址冲突,导致新的连接建立失败或不稳定,调整这个参数之前,应该根据 实际 的网络流量和应用需求进行评估,以找到合适的 平衡点 ,我们可以大体可以调整为以下的值:
[root@TEST ~] sysctl -a | grep net.ipv4.tcp_max_tw_buckets net.ipv4.tcp_max_tw_buckets = 8192 net.ipv4.tcp_congestion_control=bbr # 这里我的默认 TIME-WAIT 状态套接字最大值为 8192,将它进行调低。 [root@TEST ~] echo "net.ipv4.tcp_max_tw_buckets=5000" >> /etc/sysctl.conf # 系统将尝试保持 TIME-WAIT 套接字的数量不超过这个值,超出的套接字将被更快地清除。 [root@TEST ~] sysctl -p net.ipv4.tcp_max_tw_buckets=5000
4、启用或调整 TCP 拥塞控制算法
网络传输过程中,一段时间内如果网络中对于服务器中资源的需求超过了该资源提供传输的最大部分,网络性能就会变坏,这时候系统就发生了 网络拥塞 ,即输入的负载大于系统最大的网络吞吐量 , TCP 拥塞控制算法是用于管理网络数据传输速率的机制,以避免网络拥塞和数据包丢失。TCP 协议通过这些算法动态调整其发送窗口大小,以适应网络条件。
其中 BBR 是 Google 开发的一种新的 TCP 拥塞控制算法,它在 2016 年被引入 Linux 内核。 使用 BBR 算法的好处有:
- 提高吞吐量:BBR 能够更有效地利用可用带宽,减少因拥塞导致的丢包和重传。
- 减少延迟:通过更平滑的窗口大小调整,BBR 会减少数据传输的延迟。
- 适应性强:BBR 算法适用于各种网络条件,包括高带宽延迟积(BDP)网络。
最后我们通过一段例子来理解 BBR 算法时如何工作的。
假设你拥有一个在线视频流服务,用户通过互联网连接观看视频。视频数据通过 TCP 连接从服务器传输到用户的设备。现在,我们考虑网络拥塞控制算法在这个过程中的作用。
- 初始阶段 - 慢启动:
① 当用户开始观看视频时,TCP 连接建立,拥塞窗口( cwnd )设置为一个最大报文段(MSS)大小。
② 服务器开始发送数据,由于是慢启动阶段,cwnd 逐渐按指数增长,每次收到一个 ACK,cwnd 增加一个 MSS 大小。
# 拥塞窗口 cwnd:TCP 协议用来控制数据发送速率的一个参数,它的大小表示了在任何时刻,发送方可以向接收方发送但还没有收到确认(ACK)的数据量。
# 最大报文段(MSS):TCP 中一个报文段的最大尺寸,也就是四层传输层 TCP 层一次能传输的最大数据量。MSS 是在 TCP 连接建立时,双方协商确定的,它取决于网络环境和接收方的处理能力。与 MTU (最大传输单元) 区别,MTU 为二层链路层一个数据帧的大小,通常规定为 1500 字节。
-
拥塞避免阶段
① 当 cwnd 增长到一定程度(通常是慢启动阈值,ssthresh),进入拥塞避免阶段。
② 在这个阶段,cwnd 的增长速度变慢,按线性速率增长,每次收到 ACK,cwnd 增加 1/MSS大 小。
-
检测到拥塞
① 如果在传输过程中发生了丢包,用户设备没有及时发送 ACK,服务器检测到超时或收到三个重复的 ACK(快速重传机制),认为发生了拥塞。
② 服务器将 ssthresh 设置为当前 cwnd 的一半,并重传丢失的数据包。cwnd 重置为一个 MSS 大小,再次进入慢启动阶段。
-
BBR 算法的介入
① 如果服务器使用了BBR算法,它将通过测量 ACK 的到达模式来估计网络的瓶颈带宽。
② BBR 算法会根据当前的带宽和 RTT (Round-Trip Time,往返时延) 动态调整 cwnd ,而不是简单地在丢包时减半。
③ BBR 会尝试维持一个稳定的队列大小,避免网络拥塞,同时充分利用可用带宽。
-
结果
① 使用 BBR 算法的服务器能够更有效地 适应 网络条件的变化,例如带宽的波动或延迟的增加。
② 用户在观看视频时,体验更加流畅,因为 BBR 算法减少了因拥塞导致的缓冲和重传。
③ 视频流服务能够 处理 更多的并发用户,因为 BBR 算法优化了带宽的使用,减少了不必要的拥塞。
通过这个例子,我们可以了解 TCP 拥塞控制算法如何帮助管理网络数据传输速率,避免拥塞,并确保数据包的 可靠传输 。BBR 算法作为其中的一种,通过智能的 窗口调整 ,提高了网络传输的效率和稳定性。
BBR 算法介绍:https://blog.csdn.net/weixin_41910694/article/details/117229422
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zAKHv13E-1721013974276)(https://i-blog.csdnimg.cn/direct/2b373f64d9cc4a28bdc0301cb5660a3c.png#pic_center)]
引用来源:https://blog.csdn.net/love_668/article/details/116913790最后介绍了这么多,开启 BBR 拥塞算法的方式是十分简单的,只需要修改内核参数 net.ipv4.tcp_congestion_control 即可。
[root@TEST ~] echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf # 启用或修改 TCP 拥塞控制算法为 BBR [root@TEST ~] sysctl -p net.ipv4.tcp_congestion_control=bbr
5、 禁用 ipv6 网络
众所周知,IPv6 网络目前支持不完善,一些旧的软件或硬件可能不支持 IPv6,或者与 IPv6 的交互存在问题,IPv6 由于其设计,可能在某些配置中更容易受到某些类型的网络攻击,如邻居欺骗攻击,所以禁用 IPv6 可以减少潜在的攻击面,特别是在 IPv6 安全措施没有得到充分实施的情况下。
如果网络环境中所有的通信都通过 IPv4 进行,且没有使用 IPv6 的需求,禁用 IPv6 可以减少配置的复杂性。禁用 IPv6 可以减少内核为 IPv6 维护的路由表和其他数据结构所需的内存,提高系统内存空间,修改以下内核参数可以进行 ipv6 网络的禁用。
# Disable IPv6 net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1 # 禁用 IPv6 路由和转发 net.ipv6.conf.all.forwarding = 0 net.ipv6.conf.default.forwarding = 0 # 禁用 IPv6 自动配置 net.ipv6.conf.all.autoconf = 0 net.ipv6.conf.default.autoconf = 0
6、其他改善网络性能的方法
- 使用负载均衡 :为网络传输均衡技术,分散网络流量,避免单点过载,提高网络的吞吐量和稳定性。
- 升级网络硬件 :更换更快的网络接口卡 (NIC)、使用更高性能的路由器和交换机,可以从硬件层面改善 Linux 系统网络性能。
- 优化网络的物理布局 :减少网络设备之间的物理距离,使用高质量的网线和光纤,可以减少信号衰减和延迟。
- 优化网络逻辑结构 :减少路由跳数,优化路由路径,确保数据包以最短的路径传输。
- 使用 CDN(Content Delivery Network) :内容分发网络可以将内容缓存到离用户更近的服务器上,减少延迟和提高用户访问速度。
- 实施网络分段和隔离 :通过将网络分割成多个虚拟局域网(VLAN),可以提高安全性和性能,防止广播风暴。
- 优化应用程序的网络使用 :在应用程序层面,优化数据传输方式,减少不必要的网络请求,使用压缩和批量处理技术,如启用 Nginx 的 Gzip 压缩功能,提高 Web 服务性能的常用技术之一,尤其适用于文本内容较多的网站。通过减少传输的数据量,Gzip 压缩可以显著减少页面加载时间,提升用户体验。
总结
在本文中,我们深入探讨 了Linux 系统性能优化的多个关键点,涵盖了磁盘 RAID 模式的选择、文件系统的优化、CPU 和内存的调整,以及网络性能的全面提升。通过这些细致的优化措施,我们不仅可以提高系统的运行效率,还能确保服务的稳定性和 响应速度 。
通过本文的分享,我们希望能够帮助技术爱好者和系统管理员在面对 Linux 系统性能优化时,能够有更多的思路和方法。优化是一个 持续 的过程,需要不断地评估和调整以适应不断变化的应用需求和技术环境。希望您能从本文中获得有价值的信息,并将其应用于实践中,让您的系统运行得更加 流畅 和 高效 。
文章到这里就结束了,希望我的分享能为你的技术之旅增添一抹亮色。如果你喜欢这篇文章,请点赞收藏支持我,给予我前行的动力!🚀
-
- 初始阶段 - 慢启动: