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

AlmaLinux作为一个企业级Linux发行版,继承了RHEL的稳定性和安全性,但默认配置往往偏向于通用场景而非极致性能。对于数据库服务器、高性能计算集群、Web服务器或虚拟化宿主机等特定工作负载,通过精细调优可以显著提升系统吞吐量、降低延迟并提高资源利用率。

本文将从内核参数调整、文件系统优化、I/O调度器选择、网络栈调优等多个维度,提供一份详尽的AlmaLinux性能优化指南。所有示例均基于AlmaLinux 9.x版本,但大部分内容同样适用于其他RHEL系发行版。


一、性能优化前的准备工作

1.1 建立性能基线

在开始任何优化之前,必须先了解当前系统的性能状况:

# 安装性能监控工具集
sudo dnf install -y sysstat perf htop

# 启动sysstat服务并收集数据
sudo systemctl enable --now sysstat

# 查看CPU使用率(每10秒刷新一次)
mpstat -P ALL 10

# 查看内存使用情况
free -h

# 查看I/O统计(需要安装iotop)
sudo dnf install -y iotop
iotop -o

1.2 确定工作负载特征

不同类型的负载需要不同的优化策略:

  • CPU密集型:科学计算、视频编码
  • 内存密集型:数据库、缓存服务器
  • I/O密集型:文件服务器、日志处理
  • 网络密集型:Web服务器、消息队列

二、内核参数调整

2.1 虚拟内存管理优化

2.1.1 Swappiness调整

vm.swappiness 控制内核将内存页交换到磁盘的积极程度(0-100,默认60)。对于拥有充足内存的服务器,应降低此值:

# 临时设置(重启失效)
sudo sysctl vm.swappiness=10

# 永久设置
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.conf

# 验证
sysctl vm.swappiness

原理说明:当值为10时,系统会尽可能使用物理内存,仅在必要时才使用交换空间。这减少了交换带来的I/O延迟,特别适合数据库服务器。

2.1.2 脏页比例调整

vm.dirty_ratiovm.dirty_background_ratio 控制脏页(已修改但未写入磁盘的内存页)的阈值:

# 优化设置(适用于高I/O负载)
echo "vm.dirty_background_ratio = 5" | sudo tee -a /etc/sysctl.conf
echo "vm.dirty_ratio = 10" | sudo tee -a /etc/sysctl.conf

# 应用设置
sudo sysctl -p

参数解释

  • dirty_background_ratio:当脏页占内存百分比达到此值时,后台刷线程开始写回磁盘
  • dirty_ratio:当脏页占比达到此值时,前台进程将被阻塞直到脏页写回

适用场景:对于写密集型应用(如数据库),降低这些值可以避免I/O突发,使写入更平滑。

2.2 网络栈优化

2.2.1 TCP缓冲区大小

对于高吞吐量网络应用,增大TCP缓冲区:

# 网络核心缓冲区
echo "net.core.rmem_max = 16777216" | sudo tee -a /etc/sysctl.conf
echo "net.core.wmem_max = 16777216" | sudo tee -a /etc/sysctl.conf

# TCP读写缓冲区(min/default/max)
echo "net.ipv4.tcp_rmem = 4096 87380 16777216" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_wmem = 4096 65536 16777216" | sudo tee -a /etc/sysctl.conf

# 增加连接队列
echo "net.core.somaxconn = 4096" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 4096" | sudo tee -a /etc/sysctl.conf

2.2.2 TIME_WAIT连接优化

对于高并发短连接服务(如Web API),减少TIME_WAIT状态连接占用的资源:

echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_fin_timeout = 30" | sudo tee -a /etc/sysctl.conf

2.3 CPU调度优化

2.3.1 CPU亲和性(Affinity)

对于NUMA架构服务器,绑定进程到特定CPU核心可减少缓存失效:

# 查看NUMA拓扑
numactl --hardware

# 启动进程时绑定到特定节点
numactl --cpunodebind=0 --membind=0 your_application

# 或者使用taskset绑定到特定CPU
taskset -c 0-3 your_application

2.3.2 CPU节能模式调整

对于性能敏感场景,禁用CPU节能模式:

# 安装cpupower工具
sudo dnf install -y kernel-tools

# 查看当前模式
cpupower frequency-info

# 设置为性能模式(所有核心)
sudo cpupower frequency-set -g performance

# 永久设置(创建systemd服务)
sudo tee /etc/systemd/system/cpu-performance.service <<EOF
[Unit]
Description=CPU Performance Governor

[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set -g performance

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now cpu-performance.service

2.4 完整的sysctl.conf优化配置

以下是一个适用于通用服务器的完整配置示例:

sudo tee /etc/sysctl.d/99-performance.conf <<EOF
# 虚拟内存优化
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.vfs_cache_pressure = 50

# 网络优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_slow_start_after_idle = 0

# 安全增强(可选)
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
EOF

sudo sysctl -p /etc/sysctl.d/99-performance.conf

三、文件系统优化

3.1 XFS文件系统优化(AlmaLinux默认)

XFS是AlmaLinux的默认文件系统,特别适合大文件和高并发场景。

3.1.1 挂载选项优化

编辑 /etc/fstab 文件:

# 查看当前挂载选项
mount | grep xfs

# 备份fstab
sudo cp /etc/fstab /etc/fstab.backup

# 编辑fstab,添加优化选项
sudo vi /etc/fstab

优化后的挂载选项示例:

/dev/mapper/vg0-lv_root / xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0
/dev/mapper/vg0-lv_data /data xfs defaults,noatime,nodiratime,allocsize=64k,logbufs=8,logbsize=256k 0 0

选项说明

  • noatime:禁止更新访问时间戳,减少写操作
  • nodiratime:禁止更新目录访问时间戳
  • logbufs=8:增加日志缓冲区数量(默认2)
  • logbsize=256k:增大日志缓冲区大小
  • allocsize=64k:预分配大小优化(适合数据库)

3.1.2 XFS性能调优参数

使用 xfs_io 工具调整文件系统参数:

# 查看当前XFS参数
xfs_info /dev/mapper/vg0-lv_data

# 调整分配组(AG)数量(对于大文件系统)
# 注意:需要重新格式化,谨慎操作
mkfs.xfs -f -d agcount=16 /dev/mapper/vg0-lv_data

# 调整日志大小(对于写密集型)
xfs_admin -l /dev/mapper/vg0-lv_data  # 查看日志
# 调整日志大小需要重新格式化或使用xfs_repair

3.2 EXT4文件系统优化(如果使用)

如果系统使用EXT4,优化方式略有不同:

# 挂载选项优化
/dev/sdb1 /data ext4 defaults,noatime,nodiratime,data=writeback,barrier=0 0 0

# 调整日志大小(需要卸载)
sudo umount /data
sudo tune2fs -J size=512 /dev/sdb1
sudo mount /data

3.3 NOOP调度器优化

对于SSD/NVMe设备,使用NOOP调度器:

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

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

# 永久设置(创建udev规则)
sudo tee /etc/udev/rules.d/60-ioscheduler.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
EOF

sudo udevadm control --reload-rules

3.4 文件系统检查与维护

定期维护保持性能:

# 查看文件系统碎片(XFS)
xfs_fsr -v /dev/mapper/vg0-lv_data

# 检查XFS分配效率
xfs_db -c "sb 0" -c "p" /dev/mapper/vg0-lv_data

# 定期fstrim(SSD)
sudo fstrim -v /

# 创建每周fstrim定时任务
sudo crontab -e
# 添加:
0 2 * * 0 /usr/sbin/fstrim -v /

四、I/O调度器与块设备优化

4.1 选择正确的I/O调度器

4.1.1 调度器类型

  • none:NVMe设备推荐,无调度
  • noop:SSD推荐,简单FIFO
  • bfq:桌面系统,公平性好
  • mq-deadline:服务器推荐,低延迟

4.1.2 动态调整与验证

# 查看所有块设备调度器
for dev in /sys/block/*/queue/scheduler; do echo "$dev: $(cat $dev)"; done

# 批量设置为适合SSD的noop
for dev in /sys/block/sd*/queue/scheduler; do
    echo noop > $dev
done

# 验证设置
cat /sys/block/sda/queue/scheduler
# 输出应显示:[noop] deadline cfq

4.2 队列深度优化

对于高IOPS场景,增加队列深度:

# 查看当前队列深度
cat /sys/block/sda/queue/nr_requests

# 增加队列深度(默认128)
echo 512 > /sys/block/sda/queue/nr_requests

# 永久设置(udev规则)
sudo tee /etc/udev/rules.d/61-block-queue.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/nr_requests}="512"
EOF

4.3 预读优化

调整预读大小以适应工作负载:

# 查看当前预读值(单位:扇区)
cat /sys/block/sda/queue/read_ahead_kb

# 对于数据库,通常设置为较小值(如128KB)
echo 128 > /sys/block/sda/queue/read_ahead_kb

# 永久设置
sudo tee /etc/udev/rules.d/62-readahead.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/read_ahead_kb}="128"
EOF

五、网络性能深度优化

5.1 NIC(网卡)优化

5.1.1 多队列与RSS

现代网卡支持多队列,可以并行处理网络流量:

# 查看网卡队列数
ethtool -l eth0

# 设置队列数(如果支持)
sudo ethtool -L eth0 combined 8

# 查看/设置接收端缩放(RSS)
ethtool -x eth0
sudo ethtool -X eth0 equal 8

5.1.2 中断亲和性

将网卡中断绑定到特定CPU核心,避免跨NUMA节点访问:

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

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

# 手动设置中断亲和性(示例:将中断绑定到CPU0-3)
# 首先找到中断号
IRQ=$(grep eth0 /proc/interrupts | awk '{print $1}' | sed 's/://')
# 设置亲和性掩码(0xF表示CPU0-3)
echo 0xF > /proc/irq/$IRQ/smp_affinity

5.2 TCP协议栈高级调优

5.2.1 BBR拥塞控制算法

BBR(Bottleneck Bandwidth and RTT)是Google开发的拥塞控制算法,适合高带宽高延迟网络:

# 检查当前可用算法
sysctl net.ipv4.tcp_available_congestion_control

# 启用BBR
echo "net.ipv4.tcp_congestion_control = bbr" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 验证
sysctl net.ipv4.tcp_congestion_control

5.2.2 TCP Fast Open

减少TCP握手延迟:

# 启用TFO(值为1表示客户端启用,2表示服务端启用,3表示都启用)
echo "net.ipv4.tcp_fastopen = 3" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

5.3 网络性能测试工具

# 安装网络测试工具
sudo dnf install -y iperf3 nmap

# 服务端启动iperf3
iperf3 -s

# 客户端测试(10线程,持续10秒)
iperf3 -c server_ip -P 10 -t 10

# 测试TCP延迟
ping -c 10 server_ip

# 测试路径MTU
tracepath server_ip

六、内存管理优化

6.1 Transparent Huge Pages (THP) 调整

THP在某些工作负载(如数据库)中可能导致性能下降:

# 查看当前THP状态
cat /sys/kernel/mm/transparent_hugepage/enabled

# 临时禁用THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 永久禁用(创建systemd服务)
sudo tee /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now disable-thp.service

6.2 内存过量使用策略

调整内存过量使用策略:

# 查看当前策略
cat /proc/sys/vm/overcommit_memory

# 0:启发式过量使用(默认)
# 1:总是允许(适合内存数据库)
# 2:严格限制(不允许超过物理内存+swap)

# 设置为1(适合内存密集型应用)
echo "vm.overcommit_memory = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 调整过量使用百分比
echo "vm.overcommit_ratio = 80" | sudo tee -a /etc/sysctl.conf

6.3 NUMA优化

对于NUMA架构,确保内存分配在本地节点:

# 查看NUMA拓扑
numactl --hardware

# 启动应用时指定NUMA策略
numactl --cpunodebind=0 --membind=0 your_application

# 使用numactl运行整个服务
sudo numactl --cpunodebind=0 --membind=0 /usr/sbin/mysqld

七、进程与资源限制优化

7.1 调整ulimit限制

增加文件描述符和进程数限制:

# 查看当前限制
ulimit -a

# 临时设置(当前会话)
ulimit -n 65535  # 文件描述符
ulimit -u 4096   # 进程数

# 永久设置(/etc/security/limits.conf)
sudo tee -a /etc/security/limits.conf <<EOF
* soft nofile 65535
* hard nofile 65535
* soft nproc 4096
* hard nproc 4096
EOF

# 对于systemd服务,需要单独设置
sudo tee /etc/systemd/system.conf.d/limits.conf <<EOF
[Manager]
DefaultLimitNOFILE=65535
DefaultLimitNPROC=4096
EOF

sudo systemctl daemon-reload

7.2 使用cgroups进行资源隔离

对于运行多个服务的服务器,使用cgroups限制资源:

# 安装cgroup工具
sudo dnf install -y libcgroup-tools

# 创建cgroup
sudo cgcreate -g cpu,memory:/limited

# 设置CPU限制(50% CPU)
sudo cgset -r cpu.cfs_period_us=100000 limited
sudo cgset -r cpu.cfs_quota_us=50000 limited

# 设置内存限制(4GB)
sudo cgset -r memory.limit_in_bytes=4G limited

# 在cgroup中运行进程
sudo cgexec -g cpu,memory:limited your_application

八、特定场景优化建议

8.1 数据库服务器(MySQL/MariaDB)

8.1.1 内核参数

# 在/etc/sysctl.d/99-mysql.conf中添加
vm.swappiness = 1
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

8.1.2 文件系统

# 数据库目录使用noatime和allocsize
/dev/mapper/vg0-lv_mysql /var/lib/mysql xfs defaults,noatime,nodiratime,allocsize=64k 0 0

8.1.3 I/O调度器

# 对于MySQL,使用mq-deadline或bfq
echo mq-deadline > /sys/block/sdb/queue/scheduler

8.2 Web服务器(Nginx/Apache)

8.2.1 网络优化

# 增加端口范围
echo "net.ipv4.ip_local_port_range = 1024 65535" | sudo tee -a /etc/sysctl.conf

# TIME_WAIT优化
echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_max_tw_buckets = 2000000" | sudo tee -a /etc/sysctl.conf

8.2.2 文件系统

# 静态文件目录使用noatime
/dev/mapper/vg0-lv_www /var/www/html xfs defaults,noatime 0 0

8.3 虚拟化宿主机(KVM)

8.3.1 CPU优化

# 启用内核相同页合并(KSM)以节省内存
echo 1 > /sys/kernel/mm/ksm/run

# 调整KSM扫描速率(根据内存大小)
echo 1000 > /sys/kernel/mm/ksm/pages_to_scan

# 永久设置
sudo tee /etc/systemd/system/ksm.service <<EOF
[Unit]
Description=Kernel Samepage Merging

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo 1 > /sys/kernel/mm/ksm/run'
ExecStart=/bin/sh -c 'echo 1000 > /sys/kernel/mm/ksm/pages_to_scan'

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now ksm.service

8.3.2 内存优化

# 调整虚拟内存参数以适应虚拟机
echo "vm.swappiness = 5" | sudo tee -a /etc/sysctl.conf
echo "vm.dirty_background_ratio = 3" | sudo tee -a /etc/sysctl.conf
echo "vm.dirty_ratio = 8" | sudo tee -a /etc/sysctl.conf

九、监控与持续优化

9.1 性能监控工具

# 安装高级监控工具
sudo dnf install -y perf sysstat htop iotop

# 启动sysstat(每10分钟收集一次)
sudo systemctl enable --now sysstat

# 查看历史CPU数据
sar -u 1 10

# 查看历史内存数据
sar -r 1 10

# 查看历史I/O数据
sar -d 1 10

# 使用perf进行CPU性能分析
sudo perf top

# 记录性能数据(持续60秒)
sudo perf record -a -g -F 997 -- sleep 60
sudo perf report

9.2 建立性能基线

创建一个脚本来定期收集性能数据:

sudo tee /usr/local/bin/perf-baseline.sh <<'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
LOGDIR="/var/log/perf-baseline"
mkdir -p $LOGDIR

# 系统信息
echo "=== System Info ===" > $LOGDIR/baseline_$DATE.txt
uname -a >> $LOGDIR/baseline_$DATE.txt
lscpu >> $LOGDIR/baseline_$DATE.txt
free -h >> $LOGDIR/baseline_$DATE.txt
df -h >> $LOGDIR/baseline_$DATE.txt

# 性能快照
echo "=== Performance Snapshot ===" >> $LOGDIR/baseline_$DATE.txt
mpstat -P ALL 1 1 >> $LOGDIR/baseline_$DATE.txt
vmstat 1 5 >> $LOGDIR/baseline_$DATE.txt
iostat -x 1 5 >> $LOGDIR/baseline_$DATE.txt

# 网络统计
echo "=== Network Stats ===" >> $LOGDIR/baseline_$DATE.txt
ss -s >> $LOGDIR/baseline_$DATE.txt

echo "Baseline saved to $LOGDIR/baseline_$DATE.txt"
EOF

sudo chmod +x /usr/local/bin/perf-baseline.sh

# 每周自动运行
sudo crontab -e
# 添加:
0 2 * * 0 /usr/local/bin/perf-baseline.sh

9.3 使用tuned进行动态调优

AlmaLinux自带tuned工具,可根据场景动态调整:

# 查看可用配置
tuned-adm list

# 推荐配置
tuned-adm recommend

# 应用配置(例如虚拟机主机)
tuned-adm profile virtual-host

# 自定义配置
sudo mkdir -p /etc/tuned/custom-profile
sudo tee /etc/tuned/custom-profile/tuned.conf <<EOF
[main]
include=virtual-host

[cpu]
governor=performance
force_latency=1

[vm]
swappiness=10
dirty_background_ratio=5
dirty_ratio=10

[net]
# 网络优化参数
EOF

tuned-adm profile custom-profile

十、优化效果验证与回滚

10.1 验证优化效果

使用 perfsysstat 对比优化前后的性能指标:

# 优化前记录
perf-baseline.sh
mv /var/log/perf-baseline/baseline_*.txt /var/log/perf-baseline/before_optimization.txt

# 应用优化后
# ... 执行优化步骤 ...

# 优化后记录
perf-baseline.sh
mv /var/log/perf-baseline/baseline_*.txt /var/log/perf-baseline/after_optimization.txt

# 对比
diff /var/log/perf-baseline/before_optimization.txt /var/log/perf-baseline/after_optimization.txt

10.2 回滚机制

所有优化都应支持快速回滚:

# 创建回滚脚本
sudo tee /usr/local/bin/rollback-performance.sh <<'EOF'
#!/bin/bash
echo "Rolling back performance optimizations..."

# 恢复sysctl
sudo cp /etc/sysctl.conf.backup /etc/sysctl.conf
sudo sysctl -p

# 恢复fstab
sudo cp /etc/fstab.backup /etc/fstab
mount -a

# 恢复调度器
for dev in /sys/block/sd*/queue/scheduler; do
    echo "mq-deadline" > $dev
done

# 恢复CPU governor
sudo cpupower frequency-set -g ondemand

echo "Rollback complete. Reboot recommended."
EOF

sudo chmod +x /usr/local/bin/rollback-performance.sh

结论

AlmaLinux的性能优化是一个持续的过程,需要根据具体工作负载特征进行调整。本文提供的优化策略涵盖了从内核参数到文件系统的全方位调优,但最重要的是:

  1. 始终先建立性能基线
  2. 每次只调整一个参数
  3. 充分测试后再应用到生产环境
  4. 保留完整的回滚方案

通过系统化的优化,您可以在保持AlmaLinux稳定性的前提下,显著提升系统性能,满足苛刻的企业级应用需求。记住,没有”一刀切”的优化方案,持续监控和调整才是最佳实践。