AlmaLinux 作为 CentOS 的直接替代品,继承了 RHEL 的稳定性和企业级特性。对于追求极致性能的服务器环境,系统层面的优化至关重要。本文将从内核参数调整、文件系统优化、资源调度策略等多个维度,提供一套完整的实战指南。

一、 性能优化前的准备工作:基准测试与监控

在开始任何优化之前,建立性能基线是至关重要的。没有测量,就无法改进。

1.1 安装必要的监控工具

# 安装 sysstat (包含 sar, iostat, mpstat 等)
sudo dnf install sysstat -y

# 安装性能分析工具
sudo dnf install perf -y

# 安装网络监控工具
sudo dnf install nload iftop -y

# 启用 sysstat 服务并启动
sudo systemctl enable sysstat
sudo systemctl start sysstat

1.2 建立性能基线

在优化前,运行以下命令收集系统状态:

# 查看系统整体负载
uptime

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

# 查看磁盘 I/O 统计
iostat -x 1 5

# 查看 CPU 详细信息
lscpu

# 查看网络接口统计
sar -n DEV 1 5

示例: 假设你的应用是数据库服务器,记录优化前的 iostat 输出:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           5.21    0.00    2.15    8.45    0.00   84.19

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz  %util
sda             12.34   45.67    123.45   567.89     0.00     0.00   0.00   0.00    0.45    0.78   0.23   5.67

这里可以看到 iowait 较高(8.45%),%util 为 5.67%,表明磁盘 I/O 可能是瓶颈。

二、 内核参数深度优化

AlmaLinux 使用 Linux 内核,其参数通过 sysctl 进行动态调整。优化前请务必备份 /etc/sysctl.conf

2.1 内存管理优化

问题场景: 应用频繁申请和释放内存,导致系统频繁进行内存回收,产生大量 CPU 开销。

优化参数:

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

# 添加以下内容
# 1. 调整虚拟内存参数,减少不必要的交换
vm.swappiness = 10  # 默认值60,降低对交换分区的依赖

# 2. 优化内存回收策略
vm.vfs_cache_pressure = 50  # 默认值100,降低文件系统缓存回收压力

# 3. 调整脏页写回策略
vm.dirty_ratio = 15        # 系统内存中脏页占比超过15%时,开始同步写回
vm.dirty_background_ratio = 5 # 后台进程开始写回脏页的阈值

# 4. 调整内存过量使用策略
vm.overcommit_memory = 2   # 严格模式,禁止过度分配内存
vm.overcommit_ratio = 80   # 允许分配的内存占物理内存的比例

应用配置:

# 立即生效(无需重启)
sudo sysctl -p

# 验证设置
sysctl vm.swappiness

原理说明:

  • vm.swappiness=10:降低系统使用交换分区的倾向,优先使用物理内存,减少磁盘 I/O。
  • vm.vfs_cache_pressure=50:保留更多文件系统缓存,提升文件读取性能。
  • vm.dirty_ratiovm.dirty_background_ratio:平衡内存使用和磁盘 I/O,避免突发性大量写操作导致系统卡顿。

2.2 网络性能优化

问题场景: 高并发网络服务(如 Web 服务器、负载均衡器)遇到连接数限制或丢包。

优化参数:

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

# 添加以下内容
# 1. 增加 TCP 连接队列大小
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 2. 优化 TCP 缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 3. 启用 TCP 快速回收和重用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0  # 在 NAT 环境下需谨慎,通常设为0

# 4. 增加文件描述符限制
fs.file-max = 2097152

# 5. 调整 TIME_WAIT 状态超时时间(秒)
net.ipv4.tcp_fin_timeout = 30

应用配置:

sudo sysctl -p

示例验证:

# 查看当前 TCP 连接状态
ss -s

# 查看当前连接队列
ss -lnt | grep LISTEN

# 测试网络吞吐量(使用 iperf3)
# 服务端
iperf3 -s
# 客户端
iperf3 -c <server_ip> -t 10 -P 10

2.3 磁盘 I/O 优化

问题场景: 数据库或文件服务器磁盘读写延迟高。

优化参数:

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

# 添加以下内容
# 1. 调整 I/O 调度器(需在启动参数中设置,见下文)
# 2. 调整内核 I/O 队列深度
fs.aio-max-nr = 1048576
fs.aio-nr = 0

# 3. 调整文件系统缓存相关参数
vm.dirty_expire_centisecs = 3000  # 脏页过期时间(30秒)
vm.dirty_writeback_centisecs = 500 # 后台写回间隔(5秒)

I/O 调度器选择:

  • none/noop:适用于 NVMe SSD,无调度,直接提交。
  • deadline:适用于混合读写,保证读写延迟。
  • cfq:适用于多进程公平调度(默认)。
  • kyber:适用于高速存储,提供低延迟。

查看和设置 I/O 调度器:

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

# 临时修改(重启失效)
echo noop > /sys/block/sda/queue/scheduler

# 永久修改(通过内核启动参数)
# 编辑 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="... elevator=noop"

# 更新 GRUB
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

三、 文件系统优化

3.1 XFS 文件系统优化(推荐用于 AlmaLinux)

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

创建优化后的 XFS 文件系统:

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

# 重新挂载并优化(临时)
mount -o remount,noatime,nodiratime,logbufs=8,logbsize=256k /data

# 永久修改 /etc/fstab
# 原行:/dev/sdb1 /data xfs defaults 0 0
# 修改为:
/dev/sdb1 /data xfs noatime,nodiratime,logbufs=8,logbsize=256k 0 0

参数说明:

  • noatime:不更新文件访问时间,减少写操作。
  • nodiratime:不更新目录访问时间。
  • logbufs=8:增加日志缓冲区数量(默认2)。
  • logbsize=256k:增加日志缓冲区大小(默认256k)。

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

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

# 优化挂载选项(临时)
mount -o remount,noatime,data=writeback,barrier=0 /data

# 永久修改 /etc/fstab
/dev/sdb1 /data ext4 noatime,data=writeback,barrier=0 0 0

参数说明:

  • data=writeback:写回模式,提升写性能(牺牲一点数据安全性)。
  • barrier=0:禁用写屏障(仅在 UPS 保护下使用)。

四、 资源调度策略优化

4.1 CPU 调度器优化

AlmaLinux 默认使用 CFS(完全公平调度器),适用于大多数场景。但对于特定负载,可以调整。

查看当前调度器:

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

常见调度器:

  • performance:始终运行在最高频率,适合计算密集型任务。
  • powersave:始终运行在最低频率,适合节能。
  • ondemand:根据负载动态调整频率(默认)。
  • userspace:允许用户空间程序控制频率。

设置为性能模式(针对计算密集型服务器):

# 安装 cpupower 工具
sudo dnf install cpupower-utils -y

# 设置所有 CPU 为 performance 模式
sudo cpupower frequency-set -g performance

# 永久设置(创建 systemd 服务)
sudo vi /etc/systemd/system/cpupower.service
[Unit]
Description=CPU Power Management

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

[Install]
WantedBy=multi-user.target
sudo systemctl enable cpupower.service
sudo systemctl start cpupower.service

4.2 使用 cgroups 进行资源隔离

对于运行多个服务的服务器,使用 cgroups 可以防止一个服务耗尽所有资源。

安装 cgroup 工具:

sudo dnf install libcgroup-tools -y

示例:限制 Nginx 进程的 CPU 和内存使用

  1. 创建 cgroup:
# 创建 CPU 和内存子系统的 cgroup
sudo cgcreate -g cpu,memory:/nginx_limit

# 设置 CPU 使用上限(50% 单核)
sudo cgset -r cpu.cfs_quota_us=50000 nginx_limit
sudo cgset -r cpu.cfs_period_us=100000 nginx_limit

# 设置内存上限(2GB)
sudo cgset -r memory.limit_in_bytes=2G nginx_limit
sudo cgset -r memory.memsw.limit_in_bytes=2G nginx_limit
  1. 将 Nginx 进程加入 cgroup:
# 启动 Nginx 并加入 cgroup
sudo cgexec -g cpu,memory:nginx_limit /usr/sbin/nginx

# 或者将现有进程加入
sudo cgclassify -g cpu,memory:nginx_limit <nginx_pid>
  1. 验证限制:
# 查看 cgroup 统计
sudo cgget -g cpu,memory:nginx_limit cpu.stat
sudo cgget -g cpu,memory:nginx_limit memory.stat

# 使用 top 查看进程的 CPU 使用率
top -p <nginx_pid>

五、 应用层优化建议

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

配置文件优化 (/etc/my.cnf):

[mysqld]
# 内存相关
innodb_buffer_pool_size = 70% of total RAM  # 例如 16GB RAM 设置为 11G
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 2  # 平衡性能和数据安全

# 连接相关
max_connections = 500
thread_cache_size = 50

# 查询缓存(MySQL 8.0 已移除,5.7 可用)
# query_cache_type = 1
# query_cache_size = 64M

5.2 Web 服务器优化(以 Nginx 为例)

配置文件优化 (/etc/nginx/nginx.conf):

worker_processes auto;  # 自动设置为 CPU 核心数
worker_connections 1024; # 每个 worker 的最大连接数

# 事件模型
events {
    use epoll;  # 高效的 I/O 模型
    worker_connections 1024;
}

http {
    # 缓冲区优化
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;

    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types
        text/plain
        text/css
        text/xml
        text/javascript
        application/javascript
        application/xml+rss
        application/json;

    # 缓存静态文件
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
}

六、 持续监控与调优

性能优化是一个持续的过程,需要定期监控和调整。

6.1 使用 Prometheus + Grafana 监控

# 安装 Prometheus (以 Docker 为例)
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

# 安装 Grafana
docker run -d \
  --name grafana \
  -p 3000:3000 \
  grafana/grafana

Prometheus 配置示例 (prometheus.yml):

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']  # Node Exporter
  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:9104']  # MySQL Exporter

6.2 自动化调优脚本示例

#!/bin/bash
# performance_tuner.sh - 自动性能调优脚本

# 备份原始配置
cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d)

# 应用优化参数
cat >> /etc/sysctl.conf << EOF

# Performance Tuning
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
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.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
fs.file-max = 2097152
EOF

# 应用配置
sysctl -p

# 设置 CPU 为性能模式
if command -v cpupower &> /dev/null; then
    cpupower frequency-set -g performance
fi

# 设置 I/O 调度器为 noop (针对 SSD)
for disk in $(lsblk -d -o NAME | grep -v NAME); do
    if [ -e "/sys/block/$disk/queue/scheduler" ]; then
        echo noop > "/sys/block/$disk/queue/scheduler"
    fi
done

echo "Performance tuning completed. Please monitor system performance."

七、 总结

AlmaLinux 的性能优化是一个系统工程,需要从内核参数、文件系统、资源调度到应用配置进行全方位调整。关键要点:

  1. 测量先行:始终在优化前建立性能基线。
  2. 逐步调整:一次只调整一个参数,观察效果。
  3. 监控持续:使用工具持续监控系统状态。
  4. 安全平衡:性能优化不能以牺牲数据安全为代价。

通过本文提供的实战指南,你可以系统地优化 AlmaLinux 服务器,使其在特定工作负载下发挥最佳性能。记住,没有“一刀切”的优化方案,最佳配置取决于你的具体应用场景和硬件环境。