引言:为什么需要优化 AlmaLinux?

AlmaLinux 作为 CentOS 的稳定替代品,继承了 RHEL 的稳定性和安全性,广泛应用于企业级服务器环境。然而,随着业务规模的扩大,系统默认配置往往无法满足高并发、高吞吐量的需求。性能优化不是一蹴而就的,而是需要从内核参数、文件系统、资源调度等多个维度进行精细化调整。

本文将深入探讨 AlmaLinux 的性能优化策略,涵盖以下核心内容:

  1. 内核参数调整:通过 sysctl 优化网络、内存和进程调度。
  2. 文件系统优化:选择合适的文件系统并调整挂载参数。
  3. 资源限制与控制:使用 cgroups 和 systemd 资源控制。
  4. 网络性能优化:调整 TCP 栈参数和网络设备配置。
  5. 监控与调优工具:使用 perf、vmstat 等工具定位瓶颈。

一、内核参数调整:sysctl 的魔力

内核参数是系统性能的基石。通过调整 /etc/sysctl.conf/etc/sysctl.d/ 下的配置文件,我们可以优化内存管理、网络性能和进程调度。

1.1 内存管理优化

问题场景:系统频繁发生 OOM(Out of Memory),导致进程被杀死。

解决方案:调整内存回收策略和虚拟内存参数。

# 编辑 /etc/sysctl.conf 或创建新文件 /etc/sysctl.d/99-memory.conf
# 1. 调整内存过度分配策略(默认值 50,表示允许分配超过物理内存 50% 的内存)
vm.overcommit_memory = 1

# 2. 设置 OOM 杀死进程的优先级(-100 到 1000,值越大越容易被杀死)
vm.oom_kill_allocating_task = 1

# 3. 调整交换分区的使用倾向(值越大,越倾向于使用交换分区)
vm.swappiness = 10

# 4. 调整脏页写回策略(默认值 30,表示内存中脏页占比超过 30% 时开始写回)
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

# 应用配置
sysctl -p /etc/sysctl.d/99-memory.conf

详细说明

  • vm.overcommit_memory = 1:允许超量分配内存,适用于需要大量内存的应用(如数据库)。但需配合 vm.overcommit_ratio 使用。
  • vm.swappiness = 10:降低交换分区的使用频率,优先使用物理内存,提升响应速度。
  • vm.dirty_ratiovm.dirty_background_ratio:减少脏页堆积,避免 I/O 阻塞。

1.2 网络性能优化

问题场景:高并发网络服务(如 Nginx、Redis)出现连接超时或丢包。

解决方案:优化 TCP 栈参数。

# 编辑 /etc/sysctl.d/99-network.conf
# 1. 增大 TCP 最大连接数
net.core.somaxconn = 65535

# 2. 增大 TCP 接收和发送缓冲区
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216

# 3. 启用 TCP 时间戳(用于 RTT 估算和防止序列号回绕)
net.ipv4.tcp_timestamps = 1

# 4. 启用 TCP SACK(Selective Acknowledgment)和 DSACK
net.ipv4.tcp_sack = 1
net.ipv4.tcp_dsack = 1

# 5. 增大端口范围
net.ipv4.ip_local_port_range = 1024 65535

# 6. 启用 TIME_WAIT sockets 的快速回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0  # 注意:在 NAT 环境下可能有问题,建议关闭

# 7. 增大 nf_conntrack 表大小(如果使用 iptables)
net.netfilter.nf_conntrack_max = 1000000

# 应用配置
sysctl -p /etc/sysctl.d/99-network.conf

详细说明

  • somaxconn:定义了监听队列的最大长度,对于高并发服务,必须增大。
  • tcp_tw_reuse:允许重用 TIME_WAIT 状态的套接字,减少端口耗尽。
  • nf_conntrack_max:如果服务器作为防火墙或 NAT 网关,必须增大连接跟踪表,否则会丢包。

二、文件系统优化:选择与调整

文件系统的选择和挂载参数直接影响 I/O 性能。AlmaLinux 默认使用 XFS,但在特定场景下,ext4 或 Btrfs 可能更合适。

2.1 挂载参数优化

场景:数据库(如 MySQL)需要高性能的随机读写。

解决方案:调整挂载参数,禁用 atime 更新,启用 noatime 和 nodiratime。

# 编辑 /etc/fstab
# 原始行可能如下:
# /dev/mapper/vg0-lv_data /data xfs defaults 0 0

# 优化后:
/dev/mapper/vg0-lv_data /data xfs noatime,nodiratime,logbufs=8,logbsize=256k 0 0

详细说明

  • noatime:禁止更新文件访问时间,减少写操作。
  • nodiratime:禁止更新目录访问时间。
  • logbufs=8logbsize=256k:针对 XFS,增大日志缓冲区,提升元数据操作性能。

2.2 I/O 调度器选择

场景:SSD 硬盘需要低延迟的 I/O 调度。

解决方案:将 I/O 调度器改为 nonemq-deadline

# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 输出示例:[mq-deadline] kyber bfq none

# 临时修改
echo none > /sys/block/sda/queue/scheduler

# 永久修改(使用 udev 规则)
cat > /etc/udev/rules.d/60-ioscheduler.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="none"
EOF

三、资源限制与控制:cgroups 和 systemd

在企业环境中,多租户或微服务场景下,需要限制某些进程的资源使用,防止“吵闹邻居”问题。

3.1 使用 systemd 控制资源

场景:限制一个 Java 应用的内存使用,防止 OOM。

解决方案:使用 systemd 的资源限制功能。

# 创建服务文件 /etc/systemd/system/myapp.service
[Unit]
Description=My High Memory App
After=network.target

[Service]
Type=simple
User=myapp
ExecStart=/usr/bin/java -Xmx4g -jar /opt/myapp.jar
# 限制内存使用(软限制 4G,硬限制 5G)
MemoryLimit=4G
MemoryHigh=5G
# 限制 CPU 使用(最多使用 2 个 CPU 核心)
CPUQuota=200%
# 限制进程数
TasksMax=500

[Install]
WantedBy=multi-user.target

详细说明

  • MemoryLimit:绝对上限,超过会被 OOM 杀死。
  • MemoryHigh:软限制,超过后会触发内存回收,但不会杀死进程。
  • CPUQuota:百分比表示核心数,200% 表示最多使用 2 核。

3.2 使用 cgroups v2 手动限制

场景:临时限制某个脚本的资源。

# 挂载 cgroup v2(如果未挂载)
mount -t cgroup2 none /sys/fs/cgroup

# 创建子组
mkdir /sys/fs/cgroup/myapp
cd /sys/fs/cgroup/myapp

# 设置内存限制(1GB)
echo 1G > memory.max

# 将当前 shell 加入组
echo $$ > cgroup.procs

# 运行脚本(将自动受限制)
./heavy_script.sh

四、网络性能深度优化

除了 sysctl,网络设备本身的配置也至关重要。

4.1 中断亲和性(IRQ Affinity)

场景:多核 CPU 下,网络中断集中在单核,导致瓶颈。

解决方案:将网卡中断分散到多个 CPU 核心。

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

# 安装 irqbalance(自动平衡中断)
dnf install irqbalance -y
systemctl enable --now irqbalance

# 或者手动设置(以 eth0 为例)
# 假设中断号为 100-107
for i in {100..107}; do
    echo 2 > /proc/irq/$i/smp_affinity_list  # 分配到 CPU2
done

详细说明

  • 手动设置需要根据实际中断号和 CPU 核心数调整。
  • smp_affinity_list 使用 CPU 逻辑编号,例如 2 表示 CPU2。

4.2 RSS(Receive Side Scaling)配置

场景:单队列网卡无法利用多核 CPU。

解决方案:启用网卡多队列。

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

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

# 调整队列长度
ethtool -G eth0 rx 4096 tx 4096

五、监控与调优工具:数据驱动的优化

没有监控的优化是盲目的。AlmaLinux 提供了强大的工具链。

5.1 perf:性能剖析神器

场景:找出 CPU 使用率高的原因。

# 安装 perf
dnf install perf -y

# 记录 10 秒的 CPU 事件
perf record -g -p <PID> sleep 10

# 生成报告
perf report

输出示例

Overhead  Command  Shared Object      Symbol
  15.23%  java     libjvm.so          [.] Interpreter
  10.50%  nginx    nginx              [.] ngx_http_process_request

5.2 vmstat 和 iostat:快速诊断

# 每秒输出一次,重点关注 r(运行队列)、b(阻塞)、si/so(交换分区)
vmstat 1

# 查看磁盘 I/O,重点关注 %util 和 await
iostat -x 1

解读

  • vmstatr 列持续大于 CPU 核心数,说明 CPU 不足。
  • iostat%util 接近 100% 且 await 很高,说明磁盘瓶颈。

六、综合案例:优化 Nginx Web 服务器

假设我们有一台 AlmaLinux 服务器运行 Nginx,面临高并发下的性能瓶颈。

6.1 步骤 1:内核参数调整

应用上述的 99-network.conf99-memory.conf

6.2 步骤 2:Nginx 配置优化

# /etc/nginx/nginx.conf
worker_processes auto;  # 自动设置为 CPU 核心数
worker_connections 65535;  # 每个 worker 的最大连接数
worker_rlimit_nofile 65535;  # worker 进程能打开的最大文件数

events {
    use epoll;  # Linux 高性能事件模型
    multi_accept on;  # 一次接受多个连接
}

http {
    sendfile on;  # 启用 sendfile,减少内核态和用户态的拷贝
    tcp_nopush on;  # 提高发送效率
    tcp_nodelay on;  # 禁用 Nagle 算法,减少延迟
    keepalive_timeout 65;  # 保持连接时间
    keepalive_requests 10000;  # 单个连接最大请求数
}

6.3 步骤 3:系统限制调整

# 修改 limits.conf
cat >> /etc/security/limits.conf <<EOF
* soft nofile 65535
* hard nofile 65535
nginx soft nproc 65535
nginx hard nproc 65535
EOF

# 修改 systemd 服务文件(如果使用 systemd 启动)
# 在 [Service] 部分添加
LimitNOFILE=65535

6.4 步骤 4:验证与压测

使用 abwrk 进行压测:

# 安装 httpd-tools
dnf install httpd-tools -y

# 100 并发,10000 请求
ab -n 10000 -c 100 http://localhost/

预期结果:Requests per second 应显著提升,且 99% 的请求延迟在 100ms 以内。


七、总结

AlmaLinux 的性能优化是一个系统工程,涉及内核、文件系统、网络和应用层。通过本文的策略,您可以:

  1. 精准调整内核参数:解决内存和网络瓶颈。
  2. 优化资源分配:利用 systemd 和 cgroups 实现精细化控制。
  3. 科学监控:使用 perf 和 vmstat 定位问题。

记住,优化前务必备份配置,并在测试环境验证。性能优化没有银弹,只有根据实际业务场景不断调整,才能实现极速稳定的运行。