引言:为什么需要对 AlmaLinux 进行性能调优?

AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,默认的内核参数和系统配置往往是为了兼容性和通用性而设计的,并非针对特定硬件或工作负载进行优化。在高并发、大数据量或低延迟要求的场景下,未调优的系统可能无法充分利用硬件资源,导致性能瓶颈。

本文将深入探讨如何通过调整内核参数、优化文件系统、管理进程和内存等方式,挖掘 AlmaLinux 的性能极限。我们将从基础概念入手,逐步深入到实战调优,并提供详细的代码示例和解释,帮助你构建一个高效、稳定的 AlmaLinux 系统环境。


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

在进行任何调优之前,了解当前系统的状态至关重要。盲目修改参数可能导致系统不稳定甚至崩溃。

1.1 系统基准测试工具

使用基准测试工具可以量化系统性能,为调优提供参考依据。

sysbench

sysbench 是一个模块化的、跨平台的基准测试工具,支持 CPU、内存、磁盘 I/O 和数据库测试。

安装 sysbench:

sudo dnf install epel-release -y
sudo dnf install sysbench -y

CPU 基准测试示例: 计算 10000 以内的质数,测试 CPU 运算能力。

sysbench cpu --cpu-max-prime=20000 run

输出解读关键点:

  • events per second: 每秒完成的事件数,数值越高越好。
  • latency (avg/stddev): 平均延迟和标准差,数值越低越好。

iostat (来自 sysstat 包)

用于监控磁盘 I/O 统计信息。

安装 sysstat:

sudo dnf install sysstat -y

实时监控磁盘 I/O (每 2 秒刷新一次):

iostat -xz 2

输出解读关键点:

  • %util: 磁盘利用率,接近 100% 表示磁盘瓶颈。
  • await: I/O 请求的平均等待时间(毫秒),过高表示磁盘响应慢。
  • r/s / w/s: 每秒读/写次数。

1.2 监控系统资源

在调优过程中,需要实时监控资源使用情况。

htop

top 更直观的进程查看器。

sudo dnf install htop -y
htop

使用技巧:

  • F6 可以按 CPU%、MEM% 等排序。
  • F9 发送信号(如 SIGTERM 或 SIGKILL)终止进程。
  • F2 进入设置,可以配置颜色方案和显示选项。

二、内核参数调优:sysctl.conf 深度解析

内核参数是操作系统的核心配置,位于 /etc/sysctl.conf/etc/sysctl.d/ 目录下。使用 sysctl -p 命令可以加载修改后的配置。

2.1 虚拟内存(VM)调优

虚拟内存管理是 Linux 性能调优中最关键的部分之一,特别是对于内存密集型应用。

参数:vm.swappiness

控制内核将数据从 RAM 移动到 Swap 分区的积极程度。

  • 取值范围: 0-100
  • 默认值: 60
  • 建议: 对于数据库服务器(如 MySQL),建议设置为 110,以避免频繁的 Swap 交换,提高 I/O 性能。对于桌面应用,保持默认即可。

修改方法:

# 临时修改(重启失效)
sudo sysctl -w vm.swappiness=10

# 永久修改
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.d/99-custom.conf
sudo sysctl -p /etc/sysctl.d/99-custom.conf

参数:vm.vfs_cache_pressure

控制内核回收用于目录项(dentry)和 inode 缓存的内存倾向。

  • 默认值: 100
  • 建议: 如果系统运行大量文件操作(如 Web 服务器),可以增加该值(如 500),让内核更积极地回收缓存。如果希望保留更多缓存以提高文件查找速度,可以降低该值(如 50)。

修改示例:

echo "vm.vfs_cache_pressure = 50" | sudo tee -a /etc/sysctl.d/99-custom.conf

参数:vm.dirty_ratio 和 vm.dirty_background_ratio

这两个参数控制脏页(已修改但未写入磁盘的数据)的写入策略。

  • vm.dirty_background_ratio: 达到此百分比时,后台刷写进程开始将脏页写入磁盘。
  • vm.dirty_ratio: 达到此百分比时,所有进程将被阻塞,直到脏页被写入磁盘。

场景分析:

  • 默认值: dirty_background_ratio=10, dirty_ratio=20
  • 高吞吐数据库/日志服务器: 适当增加这两个值(例如 dirty_background_ratio=5, dirty_ratio=10),可以让系统在内存中积攒更多数据,合并 I/O 请求,减少磁盘寻道次数,提高吞吐量。但风险是系统崩溃时丢失的数据更多。

修改示例:

echo "vm.dirty_background_ratio = 5" | sudo tee -a /etc/sysctl.d/99-custom.conf
echo "vm.dirty_ratio = 10" | sudo tee -a /etc/sysctl.d/99-custom.conf

2.2 网络性能调优

对于高并发的网络服务(如 Nginx、Redis),网络栈的调优至关重要。

参数:net.core.somaxconn

定义了系统中每一个端口最大的 TCP listen 队列长度。

  • 默认值: 128 (通常太小)
  • 建议: 对于高并发服务器,建议设置为 4096 或更高。

修改示例:

echo "net.core.somaxconn = 4096" | sudo tee -a /etc/sysctl.d/99-custom.conf

参数:net.ipv4.tcp_max_syn_backlog

定义了 SYN 包(连接请求包)的队列长度。如果系统受到 SYN Flood 攻击或在高并发连接建立期间,增加此值可以防止连接丢失。

  • 建议: 设置为 8192

修改示例:

echo "net.ipv4.tcp_max_syn_backlog = 8192" | sudo tee -a /etc/sysctl.d/99-custom.conf

参数:net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_tw_recycle

允许将处于 TIME_WAIT 状态的 socket 重用于新的 TCP 连接。

  • 注意: 在 Linux 4.12+ 内核中,tcp_tw_recycle 已被移除,因为它会导致 NAT 环境下的连接问题。现在主要依赖 tcp_tw_reuse
  • 建议: 开启 net.ipv4.tcp_tw_reuse = 1

修改示例:

echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.d/99-custom.conf

参数:net.ipv4.tcp_fin_timeout

控制 TCP FIN_WAIT_2 状态的超时时间。

  • 默认值: 60秒
  • 建议: 减少到 15-30秒 可以更快释放资源。

修改示例:

echo "net.ipv4.tcp_fin_timeout = 15" | sudo tee -a /etc/sysctl.d/99-custom.conf

三、文件系统与磁盘 I/O 优化

磁盘通常是系统中最慢的组件,优化磁盘 I/O 可以显著提升整体性能。

3.1 I/O 调度器选择

I/O 调度器决定了内核如何处理磁盘 I/O 请求。AlmaLinux 支持多种调度器,包括 mq-deadline (默认), bfq, kyber 等。

  • bfq (Budget Fair Queueing): 适合桌面和交互式系统,提供公平的 I/O 分配。
  • mq-deadline: 适合服务器,特别是数据库,强调吞吐量和截止时间。
  • kyber: 较新的调度器,旨在为高速存储(如 NVMe SSD)提供低延迟。

查看当前调度器:

cat /sys/block/sda/queue/scheduler
# 输出示例: noop [deadline] cfq bfq

修改调度器 (临时):

# 假设设备是 sda
echo "mq-deadline" > /sys/block/sda/queue/scheduler

永久修改 (使用 udev 规则): 创建文件 /etc/udev/rules.d/60-ioscheduler.rules:

# 为所有 NVMe SSD 设置 kyber
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="kyber"

# 为所有 HDD 设置 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="mq-deadline"

应用规则:

sudo udevadm control --reload-rules && sudo udevadm trigger

3.2 文件系统挂载选项

/etc/fstab 中调整挂载选项可以提升文件系统性能。

针对 ext4 文件系统的优化:

  • noatime: 禁止更新文件访问时间。这可以显著减少写操作,特别是对于 Web 服务器或邮件服务器。
  • data=writeback: 仅对 ext4 有效。启用写回模式可以提高性能,但可能会增加系统崩溃时数据损坏的风险(通常与数据库的日志机制配合使用是安全的)。

修改 /etc/fstab 示例:

# 原始行
UUID=xxxx-xxxx-xxxx / ext4 defaults 1 1

# 优化后
UUID=xxxx-xxxx-xxxx / ext4 defaults,noatime,data=writeback 1 1

注意:修改后需要重新挂载文件系统 mount -o remount /

3.3 预读 (Read-ahead) 调整

预读决定了文件系统在顺序读取文件时预先读取多少数据块。

  • 默认值: 256 (KB)
  • 建议: 对于大文件顺序读取(如视频流、大数据分析),增加预读值可以提高吞吐量。

查看和设置:

# 查看 sda 的预读值 (单位: 512字节扇区)
blockdev --getra /dev/sda

# 设置为 8192 (即 4MB)
sudo blockdev --setra 8192 /dev/sda

注意:此设置重启失效,需写入 udev 规则或 rc.local。


四、进程与 CPU 调度优化

4.1 CPU 亲和性 (Affinity) 与隔离

在多核系统中,将特定进程绑定到特定 CPU 核心(CPU Pinning)可以减少缓存失效(Cache Miss)和上下文切换,提高性能。

工具: taskset

查看进程当前的 CPU 亲和性:

# 查找 nginx worker 进程 PID
PID=$(pgrep -f nginx | head -1)
taskset -p $PID
# 输出: pid 1234's current affinity mask: f (表示使用 0-3 核)

设置进程的 CPU 亲和性: 将进程绑定到第 2 和第 3 个核心(核心编号从 0 开始)。

# 1100 二进制是 10001000000,对应第 2 和第 3 核 (从右往左数)
# 或者使用十六进制 0x6 (二进制 0110,对应第 1 和第 2 核)
# 这里使用十六进制更简单: 0x3 (二进制 0011,绑定核心 0 和 1)
taskset -p 0x3 $PID

4.2 调整进程优先级 (Nice 值)

Nice 值范围从 -20 到 19,数值越小优先级越高。

  • nice: 启动时设置优先级。
  • renice: 修改运行中进程的优先级。

场景: 数据库服务需要高优先级,后台备份任务需要低优先级。

启动高优先级服务:

# -n -10 表示设置 Nice 值为 -10 (高优先级)
nice -n -10 /usr/sbin/mysqld_safe

调整运行中任务的优先级:

# 假设备份脚本 PID 为 5678,将其优先级调低
renice +10 5678

五、系统服务与资源限制优化

5.1 Systemd 服务资源控制

Systemd 不仅管理服务启动,还可以限制服务使用的系统资源(CPU、内存、IO)。

编辑服务单元文件: 通常在 /etc/systemd/system/ 下创建覆盖文件。 例如,限制 Nginx 服务最多使用 50% 的 CPU 时间。

sudo systemctl edit nginx

这将打开一个文本编辑器,输入以下内容:

[Service]
# 限制 CPU 使用率:1000ms/1000ms = 100%,500ms/1000ms = 50%
CPUQuota=50%

# 限制内存使用:绝对值或百分比
# MemoryLimit=2G  或者 MemoryLimit=50%

# 限制 IO 权重 (10-1000,默认 100,越高优先级越高)
# IOWeight=200

保存并退出后,重新加载配置并重启服务:

sudo systemctl daemon-reload
sudo systemctl restart nginx

5.2 调整文件描述符限制 (ulimit)

Linux 系统对每个进程打开的文件描述符(File Descriptors)数量有限制。高并发服务器(如 Nginx、Redis)经常遇到 “Too many open files” 错误。

查看当前限制:

ulimit -n

永久修改限制:

  1. 编辑 /etc/security/limits.conf:

    sudo vim /etc/security/limits.conf
    

    添加以下行: “`conf

    • soft nofile 65535
    • hard nofile 65535 root soft nofile 65535 root hard nofile 65535

    ”`

  2. 对于 Systemd 服务: 由于 Systemd 默认会覆盖 limits.conf 的设置,对于 Systemd 管理的服务,需要在服务文件中指定:

    [Service]
    LimitNOFILE=65535
    

六、实战案例:优化高并发 Web 服务器

假设我们有一台运行 AlmaLinux 的服务器,部署了 Nginx 和 PHP-FPM,用于处理高并发 Web 请求。以下是综合上述知识点的调优步骤。

6.1 调优清单

  1. 网络栈调优 (sysctl): 增加连接队列,减少 TIME_WAIT。
  2. 文件描述符: 提高 Nginx 和 PHP-FPM 的打开文件数限制。
  3. 内核参数: 降低 swappiness,优化脏页比率。
  4. 进程管理: 调整 PHP-FPM 进程管理模式和数量。

6.2 具体实施步骤

步骤 1: 修改 sysctl.conf

创建 /etc/sysctl.d/99-web-optimize.conf:

# 网络优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.ip_local_port_range = 1024 65535

# 内存优化
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.vfs_cache_pressure = 50

加载配置: sudo sysctl -p /etc/sysctl.d/99-web-optimize.conf

步骤 2: 修改 PHP-FPM 配置

编辑 /etc/php-fpm.d/www.conf:

; 进程管理模式:static 或 dynamic
; dynamic: 动态调整进程数
; static: 固定进程数(推荐高负载使用,避免频繁 fork)
pm = static

; 如果是 static,该值即为进程总数。
; 根据 CPU 核心数 * 2 或 * 4 设置,避免过多上下文切换。
; 假设服务器有 4 核,设置为 16。
pm.max_children = 16

; 每个子进程能打开的文件数
; 必须小于系统的 ulimit -n
rlimit_files = 65535

步骤 3: 修改 Nginx 配置

编辑 /etc/nginx/nginx.conf:

user nginx;
worker_processes auto; # 自动根据 CPU 核心数设置

# 每个 worker 进程能打开的文件数
worker_rlimit_nofile 65535;

events {
    worker_connections 4096; # 每个 worker 的最大连接数
    use epoll; # 高效的事件模型
    multi_accept on; # 尽可能多地接受连接
}

http {
    # 开启 Gzip 压缩,减少传输体积
    gzip on;
    gzip_vary on;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # 隐藏 Nginx 版本号,提高安全性
    server_tokens off;

    # 保持连接时间
    keepalive_timeout 65;
    keepalive_requests 10000;
}

步骤 4: 修改系统 Limits

编辑 /etc/security/limits.conf,添加:

nginx       soft    nofile  65535
nginx       hard    nofile  65535

重启服务:

sudo systemctl restart nginx php-fpm

七、总结与注意事项

性能调优是一个持续的过程,没有“银弹”。以下是一些关键的总结和警告:

  1. 测量,不要猜测: 在修改任何参数之前和之后,都要使用基准测试工具(如 sysbench, ab)进行测量,对比数据变化。
  2. 一次只改一个变量: 不要一次性修改 sysctl 中的所有参数。如果出现问题,很难定位是哪个参数导致的。
  3. 理解参数含义: 每个参数都有其特定的适用场景。例如,增加 dirty_ratio 可以提高吞吐量,但会增加数据丢失的风险。
  4. 文档化: 记录你所做的所有更改。这不仅是为了排查问题,也是为了在系统迁移或重建时能够复现高性能配置。
  5. 监控: 使用 Prometheus + Grafana 或 Zabbix 等工具长期监控系统指标,及时发现性能退化。

通过本文的指南,你应该能够系统地分析 AlmaLinux 的性能瓶颈,并应用针对性的优化策略,从而将硬件性能发挥到极致。