引言:为什么需要优化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_ratio 和 vm.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 验证优化效果
使用 perf 和 sysstat 对比优化前后的性能指标:
# 优化前记录
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的性能优化是一个持续的过程,需要根据具体工作负载特征进行调整。本文提供的优化策略涵盖了从内核参数到文件系统的全方位调优,但最重要的是:
- 始终先建立性能基线
- 每次只调整一个参数
- 充分测试后再应用到生产环境
- 保留完整的回滚方案
通过系统化的优化,您可以在保持AlmaLinux稳定性的前提下,显著提升系统性能,满足苛刻的企业级应用需求。记住,没有”一刀切”的优化方案,持续监控和调整才是最佳实践。
