在当今数字化时代,服务器性能直接关系到业务的稳定性和用户体验。AlmaLinux 作为 CentOS 的稳定替代品,继承了 RHEL 的稳定性和安全性,但在实际部署中,我们仍需针对特定场景进行深度优化。本文将从内核调优、资源管理、文件系统优化、网络性能提升等多个维度,详细探讨提升 AlmaLinux 系统性能的关键策略与实用技巧。

一、系统监控与性能基准测试

在进行任何优化之前,我们必须先了解系统的当前状态。没有基准数据的优化是盲目的,因此掌握系统监控和基准测试工具至关重要。

1.1 系统监控工具

AlmaLinux 提供了丰富的内置监控工具,帮助我们实时了解系统资源使用情况。

top 命令 是最基础的实时监控工具,它能显示系统中各个进程的资源占用情况。通过 top,我们可以快速发现 CPU 或内存占用过高的进程。

# 启动 top 命令
top

# 在 top 界面中,我们可以使用以下常用快捷键:
# P:按 CPU 使用率排序
# M:按内存使用率排序
# k:终止指定进程
# q:退出 top

htop 是 top 的增强版本,提供了更友好的交互界面和更丰富的功能。如果系统未安装,可以通过以下命令安装:

# 安装 htop
sudo dnf install htop -y

# 启动 htop
htop

在 htop 界面中,我们可以使用 F2 进入设置,自定义显示的指标,例如启用 CPU 使用率条形图、内存使用率条形图等,让监控信息更直观。

iostat 用于监控磁盘 I/O 统计信息,帮助我们了解磁盘的读写性能。

# 安装 sysstat 包(包含 iostat)
sudo dnf install sysstat -y

# 每 2 秒刷新一次磁盘 I/O 统计信息
iostat -dx 2

输出示例:

Device             r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm  %util
sda               0.50    1.20     4.00      8.00     0.00     0.00   0.00   0.00    0.20    0.50    0.01     8.00     6.67   0.10   0.02

其中,r/sw/s 分别表示每秒读写次数,rkB/swkB/s 表示每秒读写的数据量,%util 表示磁盘利用率,如果该值持续接近 100%,说明磁盘可能成为性能瓶颈。

vmstat 用于监控虚拟内存、进程、CPU 活动等信息。

# 每 2 秒刷新一次,共 5 次
vmstat 2 5

输出示例:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 123456  12345 678900    0    0     2     4  100  200  5  2 93  0  0
 0  0      0 123456  12345 678900    0    0     0     0  150  300  3  1 96  0  0

其中,r 表示运行队列中的进程数,b 表示阻塞的进程数,us 表示用户态 CPU 时间,sy 表示内核态 CPU 时间,id 表示空闲 CPU 时间,wa 表示等待 I/O 的 CPU 时间。

1.2 基准测试工具

基准测试可以让我们量化系统性能,便于优化前后对比。

sysbench 是一款流行的基准测试工具,支持 CPU、内存、磁盘、数据库等测试。

# 安装 sysbench
sudo dnf install epel-release -y
sudo dnf install sysbench -y

# CPU 基准测试:计算 10000 个质数
sysbench cpu --cpu-max-prime=10000 run

# 内存基准测试:分配 1GB 内存,进行 100 次读写操作
sysbench memory --memory-block-size=1M --memory-total-size=100G run

# 磁盘基准测试:在 /tmp 目录下创建 10 个文件,每个 1GB,进行随机读写测试
sysbench fileio --file-total-size=10G --file-test-mode=rndrw prepare
sysbench fileio --file-total-size=10G --file-test-mode=rndrw run
sysbench fileio --file-total-size=10G --file-test-mode=rndrw cleanup

fio 是更专业的磁盘 I/O 基准测试工具,支持更复杂的测试场景。

# 安装 fio
sudo dnf install fio -y

# 随机读测试:4KB 块大小,队列深度 32,运行 60 秒
fio --name=randread --ioengine=libaio --iodepth=32 --rw=randread --bs=4k --size=1G --numjobs=1 --runtime=60 --group_reporting

# 顺序写测试:64KB 块大小,队列深度 16,运行 60 秒
fio --name=seqwrite --ioengine=libaio --iodepth=16 --rw=write --bs=64k --size=1G --numjobs=1 --runtime=60 --group_reporting

通过这些工具,我们可以全面了解 AlmaLinux 系统的当前性能状态,为后续的优化提供数据支持。

二、内核参数调优

内核参数的调整是提升系统性能的关键环节。AlmaLinux 使用与 RHEL 相同的内核,我们可以通过修改 /etc/sysctl.conf 文件来调整内核参数,使其更适应我们的业务场景。

2.1 网络性能优化

对于网络密集型应用,如 Web 服务器、数据库服务器,网络参数的优化至关重要。

TCP 连接优化:增加 TCP 连接队列的长度,避免高并发下连接被丢弃。

# 编辑 /etc/sysctl.conf 文件
sudo vi /etc/sysctl.conf

# 添加或修改以下参数
# 增大 TCP 最大连接队列
net.core.somaxconn = 65535

# 增大 TCP 连接队列的最小值
net.ipv4.tcp_max_syn_backlog = 65535

# 开启 TCP SYN Cookie,防止 SYN 洪水攻击
net.ipv4.tcp_syncookies = 1

# 增大可用的端口范围
net.ipv4.ip_local_port_range = 1024 65535

# 开启 TCP 时间戳,提高网络性能
net.ipv4.tcp_timestamps = 1

# 开启 TCP 窗口缩放,提高大带宽网络性能
net.ipv4.tcp_window_scaling = 1

# 增大 TCP 接收缓冲区大小
net.core.rmem_max = 16777216
net.core.rmem_default = 16777216

# 增大 TCP 发送缓冲区大小
net.core.wmem_max = 16777216
net.core.wmem_default = 16777216

# 增大 TCP 自动调整缓冲区的最大值
net.ipv4.tcp_mem = 16777216 16777216 16777216

应用修改:

sudo sysctl -p

UDP 性能优化:如果应用使用 UDP 协议(如视频流、DNS 服务器),可以调整以下参数:

# 在 /etc/sysctl.conf 中添加
# 增大 UDP 接收缓冲区
net.core.rmem_max = 26214400
net.core.rmem_default = 26214400

# 增大 UDP 发送缓冲区
net.core.wmem_max = 26214400
net.core.wmem_default = 26214400

2.2 内存管理优化

内存管理参数的调整可以提高内存使用效率,减少交换(swap)使用,提升系统响应速度。

# 在 /etc/sysctl.conf 中添加
# 降低交换倾向,当内存使用率达到 80% 时才开始交换
vm.swappiness = 10

# 增大文件系统缓存,提高文件读取性能
vm.vfs_cache_pressure = 50

# 调整内存过量使用策略,允许分配超过物理内存的进程内存(需谨慎使用)
vm.overcommit_memory = 0  # 0:启发式过量使用;1:总是允许;2:严格检查

# 当内存不足时,杀死进程的策略(0-17,数值越小越倾向于杀死进程)
vm.panic_on_oom = 0  # 0:启用 OOM Killer;1:内核恐慌(不推荐)

2.3 磁盘 I/O 优化

磁盘 I/O 性能对数据库、文件服务器等应用至关重要。

# 在 /etc/sysctl.conf 中添加
# 增大 I/O 调度器队列长度
kernel.sched_autogroup_enabled = 0

# 调整 I/O 调度器(针对 SSD 硬盘)
# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler

# 临时修改为 none(适用于 NVMe SSD)或 deadline(适用于 SATA SSD)
echo none > /sys/block/sda/queue/scheduler

# 永久修改:在 /etc/default/grub 中添加 elevator=none
# 然后更新 grub 并重启
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

注意:I/O 调度器的选择取决于硬件类型。对于 SSD,推荐使用 nonemq-deadline;对于 HDD,推荐使用 cfqdeadline

三、文件系统优化

文件系统是数据存储的基础,选择合适的文件系统并进行优化可以显著提升磁盘性能。

3.1 选择合适的文件系统

AlmaLinux 默认使用 XFS 文件系统,它在处理大文件和大目录方面表现出色。对于不同的应用场景,我们可以选择不同的文件系统:

  • XFS:适合大文件、高并发的场景,如视频服务器、数据库。
  • ext4:适合通用场景,兼容性好,适合小文件和传统应用。
  • Btrfs:支持快照、压缩、RAID 等高级功能,适合需要数据保护和灵活存储的场景。

3.2 XFS 文件系统优化

XFS 是 AlmaLinux 的默认文件系统,我们可以通过以下方式进行优化:

挂载选项优化:在 /etc/fstab 中调整挂载参数。

# 查看当前挂载选项
cat /etc/fstab

# 示例:优化 /data 分区的挂载选项
# 原始内容可能为:
# /dev/sdb1 /data xfs defaults 0 0

# 优化后:
/dev/sdb1 /data xfs noatime,nodiratime,logbufs=8,logbsize=256k 0 0

参数说明:

  • noatime:禁止更新文件访问时间,减少磁盘写操作。
  • nodiratime:禁止更新目录访问时间。
  • logbufs=8:增加日志缓冲区数量,提高日志写入性能。
  • logbsize=256k:增加日志缓冲区大小。

应用修改:

sudo mount -o remount /data

XFS 文件系统碎片整理:XFS 不需要频繁碎片整理,但可以使用 xfs_fsr 工具进行优化。

# 整理 /data 分区的碎片(仅对有大量写入/删除操作的分区有效)
sudo xfs_fsr /data

3.3 ext4 文件系统优化

如果使用 ext4 文件系统,可以进行以下优化:

挂载选项优化

# 在 /etc/fstab 中修改
/dev/sdb1 /data ext4 defaults,noatime,nodiratime,data=writeback,barrier=0 0 0

参数说明:

  • data=writeback:提高写入性能,但可能增加数据丢失风险(需根据业务需求选择)。
  • barrier=0:禁用写入屏障,提高性能,但断电可能导致数据损坏(仅适用于有 UPS 的场景)。

调整保留块:默认情况下,ext4 会为 root 用户保留 5% 的磁盘空间,对于大容量磁盘,可以降低该比例。

# 将 /dev/sdb1 的保留块比例调整为 1%
sudo tune2fs -m 1 /dev/sdb1

3.4 文件系统性能监控

使用 iostatdstat 监控文件系统性能:

# 安装 dstat
sudo dnf install dstat -y

# 监控磁盘、CPU、内存、网络等信息,每 2 秒刷新
dstat -cdmn 2

四、CPU 与进程管理优化

CPU 是系统的核心资源,合理管理 CPU 和进程可以提高系统整体性能。

4.1 进程优先级调整

通过调整进程优先级,可以让关键进程获得更多 CPU 时间。

nice 和 renice 命令

# 启动一个进程并设置优先级(-20 到 19,数值越小优先级越高)
nice -n -10 ./my_app

# 调整已运行进程的优先级
renice -n -10 -p <PID>

cgroups(控制组):cgroups 是 Linux 内核功能,用于限制、隔离和记录进程组的资源使用。对于需要严格控制资源的应用(如容器),cgroups 非常有用。

# 安装 libcgroup-tools
sudo dnf install libcgroup-tools -y

# 创建一个名为 myapp 的 cgroup,限制 CPU 使用率为 50%
sudo cgcreate -g cpu:/myapp
sudo cgset -r cpu.cfs_quota_us=50000 myapp
sudo cgset -r cpu.cfs_period_us=100000 myapp

# 在 cgroup 中运行进程
sudo cgexec -g cpu:myapp ./my_app

4.2 CPU 亲和性调整

CPU 亲和性(Affinity)可以将进程绑定到特定的 CPU 核心,减少上下文切换,提高性能。

taskset 命令

# 查看进程的 CPU 亲和性
taskset -p <PID>

# 设置进程的 CPU 亲和性(绑定到 CPU 0 和 1)
taskset -p 0x3 <PID>

# 启动进程并设置 CPU 亲和性
taskset -c 0,1 ./my_app

4.3 中断亲和性调整

对于网络密集型应用,将网络中断绑定到特定 CPU 核心可以提高网络性能。

# 查看网络中断分配情况
cat /proc/interrupts | grep eth0

# 假设 eth0 的中断号为 123,将其绑定到 CPU 0 和 1
echo 0x3 > /proc/irq/123/smp_affinity

注意:中断号和 CPU 掩码需要根据实际情况调整。CPU 掩码是十六进制,每一位代表一个 CPU 核心(从右到左)。

4.4 锁竞争优化

在多线程应用中,锁竞争可能导致 CPU 使用率过高。可以通过以下方式优化:

  • 使用无锁数据结构:如原子操作、CAS(Compare-And-Swap)等。
  • 减少锁粒度:将大锁拆分为小锁,减少竞争范围。
  • 使用读写锁:在读多写少的场景下,使用读写锁(pthread_rwlock_t)可以提高并发性能。

五、网络性能优化

网络性能是服务器的关键指标,尤其对于 Web 服务、API 服务等。

5.1 网络接口参数优化

调整网卡队列长度:对于高并发网络场景,增加网卡队列长度可以减少丢包。

# 查看当前队列长度
ethtool -g eth0

# 设置接收队列长度(假设最大支持 4096)
ethtool -G eth0 rx 4096 tx 4096

启用网卡多队列:现代网卡支持多队列,可以充分利用多核 CPU。

# 查看当前队列数量
ethtool -l eth0

# 设置队列数量(假设支持 8 个队列)
ethtool -L eth0 combined 8

调整网卡中断亲和性:将网卡中断分配到不同的 CPU 核心,避免单个 CPU 过载。

# 查看网卡中断
cat /proc/interrupts | grep eth0

# 假设 eth0 有 8 个中断,分别绑定到 CPU 0-7
for i in {0..7}; do
  echo $(printf "%x" $((1 << $i))) > /proc/irq/$(($i + 123))/smp_affinity
done

5.2 TCP/IP 协议栈优化

除了之前提到的内核参数,还可以进一步优化 TCP/IP 协议栈。

启用 TCP Fast Open:减少 TCP 握手延迟。

# 在 /etc/sysctl.conf 中添加
net.ipv4.tcp_fastopen = 3  # 1:客户端启用;2:服务端启用;3:同时启用

# 应用修改
sudo sysctl -p

调整 TCP 重传参数:在网络延迟较高的环境中,调整重传参数可以提高可靠性。

# 在 /etc/sysctl.conf 中添加
# 初始 RTO(重传超时)为 1 秒
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_synack_retries = 3

# 最小 RTO 为 200ms
net.ipv4.tcp_min_rto = 200

# 最大 RTO 为 5 秒
net.ipv4.tcp_max_rto = 5000

5.3 网络工具监控

使用 ssnetstat 监控网络连接状态。

# 查看所有 TCP 连接状态
ss -tan

# 查看监听端口
ss -tln

# 查看连接数统计
ss -s

iftop 可以实时监控网络流量:

# 安装 iftop
sudo dnf install iftop -y

# 监控 eth0 网络流量
iftop -i eth0

六、服务与应用优化

系统服务和应用程序的优化是提升性能的直接手段。

6.1 服务管理优化

禁用不必要的服务:减少系统资源占用。

# 查看所有正在运行的服务
systemctl list-units --type=service --state=running

# 禁用不需要的服务(例如 cups 打印服务,如果服务器不需要打印)
sudo systemctl disable cups
sudo systemctl stop cups

调整服务启动顺序:对于关键服务,可以设置为优先启动。

# 创建服务依赖文件
sudo mkdir -p /etc/systemd/system/myapp.service.d

# 创建依赖配置文件
sudo vi /etc/systemd/system/myapp.service.d/after.conf

# 添加以下内容,确保在 network.target 后启动
[Unit]
After=network.target

# 重新加载 systemd 配置
sudo systemctl daemon-reload

6.2 应用程序优化

编译优化:对于从源码编译的应用,可以使用优化的编译选项。

# 使用 GCC 编译时,添加优化选项
# -O2:标准优化
# -march=native:针对当前 CPU 架构优化
# -flto:链接时优化
gcc -O2 -march=native -flto -o my_app my_app.c

使用高性能库:例如,使用 jemalloc 替代 glibc 的 malloc,可以减少内存碎片,提高多线程性能。

# 安装 jemalloc
sudo dnf install jemalloc -y

# 运行程序时使用 jemalloc
LD_PRELOAD=/usr/lib64/libjemalloc.so ./my_app

6.3 数据库优化(以 MySQL 为例)

如果在 AlmaLinux 上运行数据库,可以进行以下优化:

MySQL 配置优化/etc/my.cnf):

[mysqld]
# 内存相关
innodb_buffer_pool_size = 4G  # 设置为物理内存的 50-70%
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M

# I/O 相关
innodb_flush_log_at_trx_commit = 2  # 0:每秒写入;1:每次事务提交写入;2:每次事务提交写入但不刷盘
innodb_flush_method = O_DIRECT  # 绕过系统缓存,直接写入磁盘

# 连接相关
max_connections = 1000
thread_cache_size = 100

优化后重启 MySQL

sudo systemctl restart mysqld

七、高级优化技巧

7.1 使用 tuned 动态调优

tuned 是 RHEL/CentOS/AlmaLinux 的动态调优工具,提供了多种预设配置文件。

# 安装 tuned
sudo dnf install tuned -y

# 启动并启用 tuned
sudo systemctl enable --now tuned

# 查看可用配置文件
tuned-adm list

# 选择适合的配置文件(例如,网络服务器)
sudo tuned-adm profile network-latency

# 查看当前配置文件
tuned-adm active

tuned 提供了多种配置文件,如:

  • latency-performance:低延迟性能模式。
  • throughput-performance:高吞吐量模式。
  • virtual-guest:虚拟机优化模式。
  • network-latency:网络低延迟模式。
  • network-throughput:网络高吞吐量模式。

7.2 使用 eBPF 进行深度监控

eBPF(Extended Berkeley Packet Filter)是 Linux 内核的革命性技术,可以用于深度监控和性能分析。

安装 bpftrace

sudo dnf install bpftrace -y

示例:监控系统调用

# 监控所有进程的 open 系统调用
bpftrace -e 'tracepoint:syscalls:sys_enter_open { printf("Process %s opened %s\n", comm, str(args->filename)); }'

示例:监控 TCP 重传

# 监控 TCP 重传事件
bpftrace -e 'tracepoint:tcp:tcp_retransmit_skb { printf("TCP retransmit: %s\n", comm); }'

7.3 使用 systemd 资源控制

systemd 支持通过 cgroups 对服务进行资源限制。

限制服务的 CPU 使用率

# 编辑服务文件
sudo systemctl edit myapp.service

# 添加以下内容
[Service]
CPUQuota=50%  # 限制 CPU 使用率为 50%
MemoryLimit=2G  # 限制内存使用为 2GB

重新加载并重启服务

sudo systemctl daemon-reload
sudo systemctl restart myapp.service

八、总结

提升 AlmaLinux 系统性能是一个系统工程,需要从监控、内核调优、文件系统、CPU、网络、服务等多个方面入手。在实际操作中,我们应遵循以下原则:

  1. 先监控后优化:通过监控工具了解系统瓶颈,有针对性地进行优化。
  2. 逐步调整:每次只调整少量参数,观察效果,避免一次性调整过多导致系统不稳定。
  3. 测试验证:在生产环境应用优化前,务必在测试环境进行充分测试。
  4. 文档记录:记录所有优化操作和效果,便于后续维护和回滚。

通过本文介绍的策略和技巧,相信您可以显著提升 AlmaLinux 系统的性能,满足不同业务场景的需求。记住,性能优化是一个持续的过程,需要根据业务发展和硬件变化不断调整和优化。