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

AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,正如任何操作系统一样,默认配置往往是为了通用性而设计的,并非针对特定工作负载进行优化。在高负载的生产环境中,未经优化的系统可能会遇到性能瓶颈,如 CPU 利用率过高、内存不足、I/O 延迟大或网络吞吐量低等问题。

性能优化不仅仅是提升速度,更是为了确保系统的稳定性、可预测性和资源的高效利用。通过调整内核参数、优化文件系统、隔离关键进程和合理分配资源,我们可以显著提升 AlmaLinux 在数据库服务器、Web 服务器、虚拟化平台或高性能计算环境中的表现。

本文将深入探讨 AlmaLinux 的性能优化策略,从基础的内核参数调整到高级的资源隔离技术(如 cgroups 和 namespaces),并提供详细的实战步骤和代码示例。无论你是系统管理员还是 DevOps 工程师,这篇文章都将为你提供可操作的指导。

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

在盲目调整参数之前,了解系统的当前状态至关重要。优化是一个迭代过程:测量、调整、验证、再测量。没有基准数据,你无法知道优化是否有效。

1.1 常用监控工具

AlmaLinux 提供了一系列强大的工具来监控系统资源:

  • top/htop:实时查看进程的 CPU 和内存使用情况。
  • vmstat:报告虚拟内存统计信息,包括进程、内存、I/O、中断和 CPU 活动。
  • iostat:监控 CPU 输入/输出统计信息,特别适用于磁盘 I/O 分析。
  • sar(sysstat 包):收集、报告和保存系统活动信息,可用于长期分析。
  • netstat/ss:网络连接、路由表、接口统计等。
  • perf:Linux 内核自带的性能分析工具,可用于 CPU 性能事件采样。

1.2 基准测试工具

为了量化性能,我们可以使用以下工具进行基准测试:

  • CPUsysbenchstress-ng
  • 内存sysbenchstream
  • 磁盘 I/Ofio (Flexible I/O Tester),这是行业标准。
  • 网络iperf3

示例:使用 sysbench 进行 CPU 基准测试

首先安装 sysbench:

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

运行 CPU 基准测试(计算素数):

# --cpu-max-primes: 计算素数的最大数量
# --threads: 线程数,通常设置为 CPU 核心数
# --time: 运行时间(秒)
sysbench cpu --cpu-max-primes=20000 --threads=4 --time=10 run

输出结果将显示每秒计算的事件数(events per second),这是衡量 CPU 计算能力的关键指标。优化前后对比这个数值,可以直观地看到效果。

2. 内核参数调整:sysctl.conf 的深度优化

内核参数控制着操作系统如何管理 CPU、内存、网络和 I/O。通过调整 /etc/sysctl.conf/etc/sysctl.d/ 下的文件,我们可以改变这些行为。

注意:修改内核参数具有风险,可能导致系统不稳定。建议在测试环境中验证,并准备好回滚方案。

2.1 内存管理优化

内存是性能的关键。Linux 内核使用虚拟内存,其中涉及交换(swap)和缓存。

2.1.1 Swappiness (vm.swappiness)

Swappiness 控制内核将数据从 RAM 移动到 Swap 分区的倾向性。值范围是 0-100。对于拥有大量 RAM 的现代服务器,降低 Swappiness 可以减少磁盘 I/O,提高响应速度。

  • 默认值:通常为 60。
  • 推荐值:对于数据库服务器,建议设置为 1 或 10;对于通用服务器,可以设置为 10-30。如果内存充足,可以设置为 0(但某些内核版本可能仍会使用 Swap)。

配置示例

# 编辑 /etc/sysctl.d/99-memory.conf
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.d/99-memory.conf
sudo sysctl -p /etc/sysctl.d/99-memory.conf

2.1.2 脏页比率 (vm.dirty_ratio 和 vm.dirty_background_ratio)

这两个参数控制文件系统缓存中“脏页”(已修改但未写入磁盘的数据)的数量。

  • vm.dirty_background_ratio:当脏页占内存百分比达到此值时,后台进程开始将数据写入磁盘。
  • vm.dirty_ratio:当脏页占内存百分比达到此值时,进程将被阻塞,直到数据写入磁盘。

优化策略

  • 增大 dirty_background_ratio 允许更多数据在内存中累积,减少 I/O 次数,但增加了崩溃时数据丢失的风险。
  • 降低 dirty_ratio 可以防止进程因 I/O 阻塞太久,保持系统响应性。

推荐配置(针对高吞吐量写入场景,如日志服务器)

# 增加后台写入阈值,减少 I/O 频率
echo "vm.dirty_background_ratio = 10" | sudo tee -a /etc/sysctl.d/99-memory.conf
# 限制单进程阻塞阈值,避免系统卡顿
echo "vm.dirty_ratio = 20" | sudo tee -a /etc/sysctl.d/99-memory.conf
sudo sysctl -p /etc/sysctl.d/99-memory.conf

2.2 文件系统优化

文件系统缓存和打开文件限制也会影响性能。

2.2.1 VFS Cache Pressure (fs.vfs_cache_pressure)

该参数控制系统回收用于目录项和 inode 缓存的倾向。默认值 100 表示积极回收。增加此值(如 500)会减少缓存,释放内存,但可能增加文件查找时间。减少此值(如 50)会保留更多缓存,提高文件访问速度。

配置示例

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

2.2.2 文件描述符限制 (ulimit)

每个进程能打开的文件数(包括网络套接字)有限制。默认值通常较低(1024),对于高并发 Web 服务器或数据库来说不够。

永久修改限制: 编辑 /etc/security/limits.conf

# /etc/security/limits.conf
# <domain> <type> <item> <value>
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536

验证: 重新登录后,运行 ulimit -n 应显示 65536。

2.3 网络优化

对于网络密集型应用,调整 TCP 栈参数至关重要。

2.3.1 TCP 拥塞控制算法

默认算法通常是 cubic。对于高带宽、高延迟的网络(如跨数据中心),bbr (Bottleneck Bandwidth and RTT) 往往表现更好。

配置示例

echo "net.core.default_qdisc = fq" | sudo tee -a /etc/sysctl.d/99-network.conf
echo "net.ipv4.tcp_congestion_control = bbr" | sudo tee -a /etc/sysctl.d/99-network.conf
sudo sysctl -p /etc/sysctl.d/99-network.conf

验证是否启用:

sysctl net.ipv4.tcp_congestion_control
# 输出应为 net.ipv4.tcp_congestion_control = bbr

2.3.2 端口范围和连接跟踪

对于高并发服务器,增加可用端口范围和连接跟踪表大小:

# 增加本地端口范围
echo "net.ipv4.ip_local_port_range = 1024 65535" | sudo tee -a /etc/sysctl.d/99-network.conf
# 增大连接跟踪表(如果使用 iptables/nftables)
echo "net.netfilter.nf_conntrack_max = 2000000" | sudo tee -a /etc/sysctl.d/99-network.conf
# 增大半连接队列(SYN Flood 保护)
echo "net.ipv4.tcp_max_syn_backlog = 65536" | sudo tee -a /etc/sysctl.d/99-network.conf
# 增大全连接队列
echo "net.core.somaxconn = 65536" | sudo tee -a /etc/sysctl.d/99-network.conf
sudo sysctl -p /etc/sysctl.d/99-network.conf

注意nf_conntrack_max 增大可能会增加内存消耗,需根据服务器内存调整。

3. I/O 调度器与文件系统优化

磁盘 I/O 往往是系统的瓶颈。AlmaLinux 支持多种 I/O 调度器,用于决定磁盘操作的顺序。

3.1 选择合适的 I/O 调度器

  • none:适用于多队列设备(NVMe SSD),几乎没有开销。
  • mq-deadline:适用于 SSD 和高性能存储,注重吞吐量。
  • bfq:适用于桌面或混合负载,提供更好的公平性。
  • kyber:较新的调度器,旨在提供低延迟。

对于 NVMe SSD,通常使用 nonemq-deadline。对于 SATA SSD/HDD,mq-deadlinebfq 可能更合适。

查看当前调度器

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

临时更改

echo none > /sys/block/nvme0n1/queue/scheduler

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

# 对于 NVMe 设备使用 none
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
# 对于 SSD 设备使用 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# 对于 HDD 设备使用 bfq
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"

应用规则:

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

3.2 文件系统挂载选项

/etc/fstab 中调整挂载选项可以显著提升性能。

推荐的 ext4 挂载选项

  • noatime:不更新文件访问时间,减少写操作(除非需要访问时间审计)。
  • data=writeback:对于 ext4,这可以提高元数据性能,但崩溃时可能丢失数据(适合日志分区,不适合关键数据)。
  • barrier=0:禁用写屏障,提高性能,但断电时有数据损坏风险(仅限带电池 RAID 卡的环境)。

示例 /etc/fstab 条目

UUID=xxxx-xxxx-xxxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2

4. 资源隔离:cgroups 与 Namespaces

资源隔离是确保关键服务获得所需资源,并防止“吵闹邻居”问题的关键技术。Linux 通过 cgroups (Control Groups) 和 Namespaces 实现这一点。

4.1 使用 cgroups v1/v2 进行资源限制

cgroups 允许你限制、记录和隔离进程组的资源使用(CPU、内存、I/O、网络)。

AlmaLinux 89 默认启用了 cgroups v2,但也兼容 v1。

4.1.1 使用 systemd 进行简单的资源控制(推荐)

Systemd 是 AlmaLinux 的 init 系统,它原生集成了 cgroups。你可以通过创建 service 文件来限制资源。

场景:限制一个非关键后台脚本的 CPU 使用率,防止它耗尽所有 CPU。

  1. 创建一个 systemd service 文件:

    sudo nano /etc/systemd/system/limited-script.service
    
  2. 内容如下: “`ini [Unit] Description=Limited Background Script After=network.target

[Service] ExecStart=/usr/bin/python3 /opt/scripts/heavy_task.py # CPU 限制:将 CPU 使用率限制在单个核心的 50% # CPUQuota=50% 表示使用 0.5 个 CPU 核心 CPUQuota=50% # 内存限制:最大 512MB MemoryMax=512M # 如果内存不足,允许使用少量 swap,但不超过 1G MemorySwapMax=1G Restart=on-failure User=appuser

[Install] WantedBy=multi-user.target


3. 启动并启用服务:
   ```bash
   sudo systemctl daemon-reload
   sudo systemctl start limited-script.service
   sudo systemctl status limited-script.service
  1. 验证限制: 使用 topsystemd-cgtop 查看进程的资源使用情况。即使脚本试图占满 CPU,它也会被限制在 50% 左右。

4.1.2 手动使用 cgroups (cgroups v2)

如果你需要更精细的控制,或者控制非 systemd 管理的进程,可以手动挂载 cgroup2 并创建组。

  1. 挂载 cgroup2(如果尚未挂载):

    sudo mount -t cgroup2 none /sys/fs/cgroup
    
  2. 创建一个控制组:

    sudo mkdir /sys/fs/cgroup/mygroup
    cd /sys/fs/cgroup/mygroup
    
  3. 设置限制(例如,CPU 权重):

    • cpu.weight:相对权重,默认 100。值越高,获得的 CPU 时间越多。
    • memory.max:硬内存限制。
   # 设置内存限制为 2GB
   echo 2G > memory.max
   # 设置 CPU 权重为 50 (相对较低)
   echo 50 > cpu.weight
  1. 将进程添加到控制组: 假设我们要限制 PID 为 12345 的进程。
    
    echo 12345 > cgroup.procs
    
    现在,该进程及其子进程将受到上述限制。

4.2 使用 Namespaces 进行隔离

Namespaces 提供进程级别的隔离,如 PID、网络、挂载、UTS(主机名)等。这通常是容器技术(如 Docker/Podman)的基础。

虽然手动使用 namespaces 比较复杂(通常通过 unshare 命令),但理解其概念很重要。

示例:使用 unshare 创建一个独立的网络命名空间

这在测试网络配置或构建虚拟网络环境时非常有用。

# 创建一个新的网络命名空间并启动一个 shell
sudo unshare --net /bin/bash

在这个新 shell 中,你将看到一个干净的网络环境(只有 lo 接口,且未启动)。你可以在这里配置虚拟网卡、iptables 规则,而不会影响主机网络。

退出命名空间:只需输入 exit

4.3 使用 cgroups 进行 I/O 隔离 (blkio)

对于数据库和 Web 服务器,磁盘 I/O 隔离至关重要。你可以限制特定进程组的磁盘读写带宽。

场景:限制备份进程的 I/O,以免影响数据库性能。

假设使用 cgroups v1(因为 v2 的 I/O 控制有时在默认内核配置中未启用):

  1. 挂载 blkio 子系统:

    sudo mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
    
  2. 创建组:

    sudo mkdir /sys/fs/cgroup/blkio/backup_group
    
  3. 设置限制(假设设备是 /dev/sda,需要获取其主次设备号): “`bash

    获取设备号

    ls -l /dev/sda

    输出示例: brw-rw—- 1 root disk 8, 0 Nov 20 10:00 /dev/sda

    主设备号 8,次设备号 0

# 限制写入速度为 10MB/s (单位是字节/秒) echo “8:0 10485760” > /sys/fs/cgroup/blkio/backup_group/blkio.throttle.write_bps_device


4. 将备份进程 PID 加入该组:
   ```bash
   echo <PID> > /sys/fs/cgroup/blkio/backup_group/cgroup.procs

注意:在 AlmaLinux 9 中,推荐使用 cgroups v2。在 v2 中,I/O 控制通过 io.max 文件实现,语法略有不同。

5. 高级优化:Tuned 和 Performance Profiles

手动调整参数虽然灵活,但容易出错。tuned 是一个动态自适应系统调优守护进程,它提供了针对不同场景预设的优化配置文件。

5.1 安装和使用 Tuned

AlmaLinux 默认可能已安装。如果没有:

sudo dnf install -y tuned

启动并启用服务:

sudo systemctl enable --now tuned

5.2 查看和应用配置文件

列出可用配置文件:

tuned-adm list

常见配置文件:

  • virtual-guest:适用于虚拟机,平衡性能和功耗。
  • throughput-performance:最大化吞吐量,适合文件服务器。
  • latency-performance:最小化延迟,适合数据库。
  • powersave:节能。

应用配置文件:

sudo tuned-adm profile latency-performance

检查当前状态:

tuned-adm active

5.3 自定义 Tuned 配置文件

如果预设配置文件不满足需求,可以创建自定义配置文件。

  1. 复制现有配置文件:

    sudo cp -r /usr/lib/tuned/latency-performance /etc/tuned/my-custom-profile
    
  2. 编辑 tuned.conf

    sudo nano /etc/tuned/my-custom-profile/tuned.conf
    

示例:增加 TCP 缓冲区大小。

   [main]
   summary=Custom profile for high network load

   [sysctl]
   net.core.rmem_max = 134217728
   net.core.wmem_max = 134217728
   net.ipv4.tcp_rmem = 4096 87380 134217728
   net.ipv4.tcp_wmem = 4096 65536 134217728
  1. 应用自定义配置:
    
    sudo tuned-adm profile my-custom-profile
    

6. 实战案例:优化一个高流量 Nginx Web 服务器

让我们将上述理论应用到一个具体的场景中。

目标:优化运行在 AlmaLinux 上的 Nginx,以处理高并发静态文件请求。

6.1 步骤 1:系统级调整

  1. 文件描述符限制: 在 /etc/security/limits.conf 中为 nginx 用户设置:

    nginx soft nofile 65536
    nginx hard nofile 65536
    
  2. 内核参数 (/etc/sysctl.d/99-nginx.conf):

    # 网络优化
    net.core.somaxconn = 65536
    net.ipv4.tcp_max_syn_backlog = 65536
    net.ipv4.ip_local_port_range = 1024 65535
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 15
    
    # 内存优化
    vm.swappiness = 10
    vm.vfs_cache_pressure = 50
    
  3. 应用 sysctl

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

6.2 步骤 2:Nginx 配置优化

编辑 /etc/nginx/nginx.conf

user nginx;
# 设置工作进程数,通常等于 CPU 核心数或 2 倍
worker_processes auto; 

# 每个进程允许的最大连接数
events {
    worker_connections 4096;
    # 使用 epoll 事件模型(Linux 2.6+)
    use epoll;
    # 优化 accept 锁机制
    multi_accept on;
}

http {
    # 开启 sendfile,直接在内核空间拷贝文件,减少用户空间切换
    sendfile on;
    # 开启 tcp_nopush,优化 sendfile,将响应头和文件内容在一个包里发送
    tcp_nopush on;
    # 开启 tcp_nodelay,禁用 Nagle 算法,减少小包延迟
    tcp_nodelay on;

    # 保持连接超时时间
    keepalive_timeout 65;
    keepalive_requests 1000;

    # 缓存打开的文件描述符
    open_file_cache max=200000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

    # 包含其他配置文件
    include /etc/nginx/conf.d/*.conf;
}

6.3 步骤 3:使用 systemd 进行资源隔离

如果服务器上还运行着其他服务(如数据库),我们不希望 Nginx 吃掉所有 CPU。

创建 /etc/systemd/system/nginx.service.d/override.conf

[Service]
# 限制 CPU 使用率为 80% (假设是 4 核 CPU,这限制了 3.2 核的使用)
CPUQuota=80%
# 限制内存使用,假设分配 4GB 给 Nginx
MemoryMax=4G

然后重载 systemd:

sudo systemctl daemon-reload
sudo systemctl restart nginx

6.4 步骤 4:验证

  1. 检查 Nginx 状态

    sudo systemctl status nginx
    
  2. 压力测试: 使用 ab (Apache Bench) 或 wrk 进行测试。

    # 安装 httpd-tools 获取 ab
    sudo dnf install -y httpd-tools
    # 模拟 100 个并发用户,总共发送 10000 个请求
    ab -n 10000 -c 100 http://your_server_ip/
    
  3. 监控资源: 在另一个终端运行 tophtop,观察 Nginx 进程的 CPU 和内存使用是否在限制范围内,以及系统负载是否保持在合理水平。

7. 总结与最佳实践

AlmaLinux 的性能优化是一个持续的过程,涉及多个层面:

  1. 监控先行:始终从基准测试和监控开始,了解瓶颈所在。
  2. 渐进式调整:每次只调整少量参数,观察效果,避免一次性修改导致系统不可用。
  3. 利用工具:善用 tuned 简化工作,使用 sysctlulimit 和 systemd 进行精细控制。
  4. 资源隔离:利用 cgroups 和 systemd 保护关键服务,确保资源公平分配。
  5. 文档化:记录所有的修改,以便在系统迁移或故障排查时参考。

通过遵循本指南中的步骤,你可以将 AlmaLinux 打造成一个高性能、稳定且资源高效的操作系统环境,满足各种严苛的生产需求。记住,没有“一刀切”的配置,最佳设置取决于你的具体硬件和工作负载特性。不断测试和迭代,你将找到最适合你的系统的优化方案。