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

AlmaLinux 作为 CentOS 的替代者,继承了 RHEL 的稳定性和安全性,广泛应用于企业级服务器环境。然而,默认配置往往无法满足特定业务场景的性能需求。通过合理的性能优化,我们可以显著提升系统响应速度、资源利用率和应用吞吐量。

本文将从内核参数调整文件系统优化容器资源限制等多个维度,为您提供一份详尽的实战指南,帮助您在 AlmaLinux 上榨干每一分性能。


第一部分:系统级优化——内核参数调整

内核参数是操作系统的核心配置,直接影响系统的网络性能、内存管理和 I/O 效率。我们主要通过修改 /etc/sysctl.conf 文件来持久化调整这些参数。

1.1 网络性能优化

对于高并发网络服务(如 Web 服务器、数据库),网络栈的调优至关重要。

核心参数详解与示例

  • TCP 连接复用与快速回收

    • net.ipv4.tcp_tw_reuse = 1:允许将 TIME_WAIT 状态的 sockets 重新用于新的 TCP 连接。这对于高并发短连接场景(如 API 网关)非常有效。
    • net.ipv4.tcp_tw_recycle = 0:在 NAT 环境下建议关闭,否则可能导致连接问题。
    • net.ipv4.tcp_fin_timeout = 30:减少 FIN_WAIT_2 状态的超时时间,释放资源。
  • SYN Flood 攻击防御与连接队列

    • net.ipv4.tcp_syncookies = 1:当 SYN 队列满时,开启 Cookie 机制防止 SYN Flood 攻击。
    • net.core.somaxconn = 65535:定义每个监听端口的最大连接队列长度。如果 Nginx 报错 “connection reset by peer” 或 “connection refused”,通常需要调大此值。
    • net.ipv4.tcp_max_syn_backlog = 65535:SYN 接收队列大小。
  • 拥塞控制算法

    • 对于高丢包或长距离传输(如跨机房),推荐使用 BBR 算法。
    • net.core.default_qdisc = fq
    • net.ipv4.tcp_congestion_control = bbr

实战操作步骤

  1. 编辑配置文件

    sudo vi /etc/sysctl.conf
    
  2. 添加优化配置(在文件末尾追加):

    # 网络优化
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_fin_timeout = 30
    net.core.somaxconn = 65535
    net.ipv4.tcp_max_syn_backlog = 65535
    net.ipv4.tcp_syncookies = 1
    
    # 开启 BBR
    net.core.default_qdisc = fq
    net.ipv4.tcp_congestion_control = bbr
    
    # 内存与缓存
    vm.swappiness = 10
    vm.vfs_cache_pressure = 50
    
  3. 生效配置

    sudo sysctl -p
    
  4. 验证 BBR 是否开启

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

1.2 内存与 I/O 优化

调整 Swappiness(交换分区倾向性)

Linux 的 swappiness 值(0-100)控制系统使用 Swap 的倾向。

  • 默认值 60:表示系统内存剩余 40% 时开始使用 Swap。
  • 优化建议:对于数据库或高性能应用,Swap 会导致严重的 I/O 抖动。建议设置为 10 甚至 0(如果物理内存充足)。
# 临时生效
sudo sysctl vm.swappiness=10

# 永久生效(已在上面的 sysctl.conf 中添加)
echo "vm.swappiness = 10" >> /etc/sysctl.conf

调整 VFS Cache Pressure

该参数控制系统回收用于目录项和 inode 缓存的倾向。默认值 100。

  • 优化建议:降低该值(如 50)可以保留更多的文件系统元数据缓存,提升大量文件读取的性能。

第二部分:文件系统与磁盘 I/O 优化

磁盘 I/O 往往是系统性能的瓶颈。在 AlmaLinux 上,我们可以从挂载选项和调度器入手。

2.1 挂载选项优化 (Mount Options)

编辑 /etc/fstab 文件来优化。

  • noatime:禁止更新文件访问时间。每次读取文件时不再写入元数据,显著减少 I/O 操作。
  • discard / nodiscard:对于 SSD,开启 discard 可以支持 TRIM,保持 SSD 长期性能;但在某些场景下可能导致延迟,建议根据业务权衡。

示例:优化 /data 分区(假设为 SSD)

原内容:

/dev/mapper/vg_data-lv_data /data ext4 defaults 0 2

优化后:

/dev/mapper/vg_data-lv_data /data ext4 defaults,noatime,nodiscard 0 2

应用更改:

sudo mount -o remount /data

2.2 I/O 调度器选择

对于不同的硬件,I/O 调度器决定了请求处理的顺序。

  • SSD/NVMe:不需要复杂的寻道,推荐使用 nonenoop(简单的 FIFO 队列)。
  • 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 设置为 noop
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
# 对于 HDD 设置为 deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"

第三部分:容器环境下的资源限制与优化 (Docker/Podman)

在 AlmaLinux 上运行容器时,如果不加限制,单个容器可能会耗尽宿主机的所有资源,导致系统崩溃。我们需要利用 Cgroups 进行精细化控制。

3.1 Docker 守护进程配置

如果通过 Docker 运行,建议修改 /etc/docker/daemon.json 来设置默认的日志驱动和大小限制,防止日志撑爆磁盘。

配置示例

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65536,
      "Soft": 65536
    }
  }
}

解释:限制单个容器日志最大 100MB,保留 3 个文件;默认打开文件数限制为 65536。

3.2 运行时资源限制实战 (Run-time Limits)

在启动容器时,必须显式指定 CPU 和内存限制。

场景:运行一个高负载的 Java 应用容器

假设宿主机为 4 核 16GB 内存,我们需要限制该应用最多使用 2 核 CPU 和 8GB 内存,并预留 1GB 内存给系统。

命令示例

docker run -d \
  --name java-app \
  --restart unless-stopped \
  --cpus="2.0" \
  --memory="8g" \
  --memory-reservation="7g" \
  --memory-swap="8g" \
  --ulimit nofile=65536:65536 \
  -p 8080:8080 \
  my-java-app:latest

参数详解

  • --cpus="2.0":限制容器使用的 CPU 核心数为 2。相当于设置 CPU 配额。
  • --memory="8g":硬限制,容器内存不能超过 8GB,超出会被 OOM Kill。
  • --memory-reservation="7g":软限制,当内存达到 7GB 时,系统会发出警告并尝试回收内存。
  • --memory-swap="8g":内存 + Swap 的总限制。这里设置为 8g,意味着 Swap 可用空间为 0(8g - 8g)。对于数据库容器,通常建议禁用 Swap。
  • --ulimit:设置容器内部的 ulimit,防止 “Too many open files” 错误。

3.3 使用 Podman 的 Systemd 集成 (推荐在 AlmaLinux 使用)

AlmaLinux 默认包含 Podman,且推荐使用 Systemd 管理容器以实现开机自启和更好的资源控制。

创建 systemd 服务文件/etc/systemd/system/myapp.service

[Unit]
Description=My High Performance App
After=network-online.target
Wants=network-online.target

[Service]
Restart=always
ExecStartPre=/usr/bin/rm -f /%t/%n-pid /%t/%n-cid
ExecStart=/usr/bin/podman run --name myapp \
  --cpus=2 \
  --memory=8g \
  --log-opt max-size=10m \
  -p 8080:8080 \
  registry.example.com/myapp:latest

ExecStop=/usr/bin/podman stop -t 10 myapp
ExecStopPost=/usr/bin/podman rm -f myapp

# 资源限制:通过 systemd 的 Resource Control
# 这里的限制是针对整个 service 单元的(包括 podman 进程及其子进程)
CPUQuota=200%      # 限制 2 个 CPU 核心
MemoryLimit=9G     # 稍微大于容器限制,防止 systemd 层面被杀

[Install]
WantedBy=multi-user.target

启动并启用

sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service

第四部分:系统监控与性能分析工具

优化不是一劳永逸的,需要持续监控。以下是在 AlmaLinux 上常用的工具。

4.1 综合性能分析:htop 与 glances

  • htop:比 top 更直观,支持树状视图和鼠标操作。
    
    sudo dnf install htop -y
    htop
    
  • glances:提供系统概览,包括容器资源占用。
    
    sudo dnf install glances -y
    glances
    

4.2 I/O 分析:iotop

找出是哪个进程在疯狂读写磁盘。

sudo dnf install iotop -y
sudo iotop -o
  • -o:只显示正在进行 I/O 操作的进程。

4.3 网络分析:ss 与 nethogs

  • ss:比 netstat 更快,用于查看网络连接状态。
    
    ss -antp | grep ESTAB
    
  • nethogs:按进程实时统计流量。
    
    sudo dnf install nethogs -y
    sudo nethogs
    

第五部分:进阶优化——透明大页与 NUMA

5.1 禁用透明大页 (Transparent Huge Pages - THP)

对于大多数数据库负载(如 MongoDB, PostgreSQL, Redis),THP 会导致内存分配延迟增加和 CPU 使用率上升。建议禁用

检查状态

cat /sys/kernel/mm/transparent_hugepage/enabled
# 输出通常为 [always] madvise never

永久禁用: 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 行添加:

transparent_hugepage=never

更新 GRUB 并重启

sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

5.2 NUMA (Non-Uniform Memory Access) 优化

在多路服务器上,CPU 访问本地内存比访问远端内存快。如果应用绑定了特定 CPU 核心,但内存分配在远端,性能会下降。

使用 numactl 控制

假设我们要在 CPU 节点 0 上运行一个容器:

# 安装 numactl
sudo dnf install numactl -y

# 运行命令,绑定到 node 0
numactl --cpunodebind=0 --membind=0 docker run ...

总结

AlmaLinux 的性能优化是一个系统工程,涉及内核、文件系统、容器和应用层。

核心优化清单回顾

  1. 网络:开启 BBR,增大连接队列 (somaxconn)。
  2. 内存:降低 swappiness,调整 vfs_cache_pressure
  3. 磁盘:SSD 使用 noatime,调整 I/O 调度器。
  4. 容器:严格限制 CPU 和内存,配置日志轮转,使用 Systemd 管理。
  5. 监控:善用 iotop, ss, htop 定位瓶颈。

通过以上步骤,您可以构建一个高性能、高稳定性的 AlmaLinux 运行环境。请根据实际业务负载逐步调整参数,并务必在生产环境变更前进行充分测试。