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

AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,随着业务负载的增加,服务器的默认配置往往无法满足高性能需求。性能调优是一个系统性的工程,它涉及内核参数、文件系统、存储 I/O、网络栈等多个层面。通过合理的优化,我们可以显著提升服务器的响应速度、并发处理能力和长期运行的稳定性。

本指南将从实战角度出发,详细解析如何在 AlmaLinux 上进行全方位的性能调优。


第一部分:内核参数调整 (Kernel Parameter Tuning)

内核参数是操作系统性能的基石。通过调整 /etc/sysctl.conf 文件,我们可以改变内核处理内存、网络和进程调度的方式。

1.1 内存管理优化

服务器的内存管理直接影响应用程序的性能。Linux 内核使用“虚拟内存”机制,但在高负载下,默认设置可能导致性能抖动。

关键参数:vm.swappiness

  • 含义:控制系统使用 Swap 分区(磁盘交换)的积极程度。值范围 0-100。
  • 默认值:通常为 60。
  • 优化建议:对于数据库服务器或物理内存充足的服务器,应降低该值,避免频繁的磁盘 I/O 影响性能。通常设置为 1 或 10。

关键参数:vm.vfs_cache_pressure

  • 含义:控制内核回收用于目录项和 inode 缓存的内存的倾向。默认值 100。
  • 优化建议:增加该值(例如设置为 500 或更高)可以让内核更积极地回收缓存,对于运行大量静态文件服务的服务器,降低该值可以提高文件访问速度。

关键参数:vm.dirty_ratiovm.dirty_background_ratio

  • 含义:控制脏页(未写入磁盘的数据)占内存的百分比。
  • 优化建议
    • dirty_background_ratio:设置为较小的值(如 5),确保后台刷写线程尽早启动,避免 I/O 突发。
    • dirty_ratio:设置为稍大的值(如 10-15),防止进程因等待 I/O 而阻塞。

配置示例:/etc/sysctl.conf 中添加或修改:

# 减少 Swap 使用,优先使用物理内存 vm.swappiness = 10 # 增加 VFS 缓存压力,释放更多内存给应用程序 vm.vfs_cache_pressure = 500 # 优化脏页写入,避免 I/O 阻塞 vm.dirty_background_ratio = 5 vm.dirty_ratio = 10 # 增加网络连接队列大小(针对高并发 Web 服务器) net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 

应用配置:

sudo sysctl -p 

第二部分:文件系统与 I/O 调度优化

文件系统的选择和挂载选项对磁盘读写速度有决定性影响。AlmaLinux 默认使用 XFS 或 ext4。

2.1 挂载选项优化 (Mount Options)

/etc/fstab 中调整挂载参数可以显著提升 I/O 性能。

推荐针对 SSD/NVMe 的优化选项:

  • noatime:禁止更新文件访问时间。这是最通用的性能提升选项,减少了不必要的元数据写入。
  • discard / fstrim:启用 TRIM 功能(针对 SSD),帮助主控回收无效数据块。

针对数据库(如 MySQL/MariaDB)的优化:

  • barrier=0:禁用写入屏障(注意:仅在拥有 UPS 电源保障且数据安全性要求稍低的环境下使用),可以减少同步写入的开销。
  • data=writeback:对于 ext4 文件系统,使用回写模式可以提高并发性能,但增加了崩溃时数据丢失的风险。

配置示例: 编辑 /etc/fstab,找到对应的数据盘挂载行:

# 原始行可能如下: # UUID=xxxx-xxxx /data ext4 defaults 0 2 # 优化后的行(针对 SSD 数据盘): UUID=xxxx-xxxx /data ext4 noatime,discard,errors=remount-ro 0 2 # 针对 NVMe 或高性能存储: UUID=xxxx-xxxx /data xfs noatime,nodiratime 0 2 

2.2 I/O 调度器选择 (I/O Scheduler)

I/O 调度器决定了内核如何处理磁盘请求。

  • NVMe SSD:通常使用 none (或 noop),因为 NVMe 控制器本身已经做了很好的队列管理,内核层面的调度反而增加开销。
  • SATA SSD:推荐使用 mq-deadlinebfq
  • SAS/SATA HDD:推荐使用 bfqdeadline

查看当前调度器:

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

修改调度器(临时):

echo bfq > /sys/block/sda/queue/scheduler 

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

# 设置 NVMe 设备为 none ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none" # 设置 SATA SSD 为 mq-deadline ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline" # 设置机械硬盘为 bfq ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq" 

第三部分:网络性能优化

对于 Web 服务器或 API 服务,网络栈的调优至关重要。

3.1 TCP/IP 栈调优

高并发场景下,TIME_WAIT 连接过多会耗尽源端口,导致无法建立新连接。

关键参数:net.ipv4.tcp_tw_reuse

  • 作用:允许将 TIME_WAIT 状态的 socket 重新用于新的 TCP 连接。
  • 建议:设置为 1。

关键参数:net.ipv4.tcp_fin_timeout

  • 作用:控制 FIN_WAIT_2 状态的超时时间。
  • 建议:默认 60 秒,建议修改为 15-30 秒,加快资源回收。

关键参数:net.ipv4.tcp_max_tw_buckets

  • 作用:系统同时保持 TIME_WAIT 状态的最大数量。
  • 建议:如果并发很高,适当调大,但过多会占用内存。

配置示例:/etc/sysctl.conf 中:

# 开启 TIME_WAIT socket 重用 net.ipv4.tcp_tw_reuse = 1 # 减少 FIN_WAIT_2 时间 net.ipv4.tcp_fin_timeout = 20 # 增大端口范围 net.ipv4.ip_local_port_range = 1024 65535 # 增大 TCP 连接跟踪表大小(针对防火墙/NAT 服务器) net.netfilter.nf_conntrack_max = 2000000 

第四部分:系统资源限制 (Limits)

当服务器运行高并发应用(如 Nginx、Java 应用)时,系统默认的文件句柄(File Descriptor)限制可能会被触发,导致 “Too many open files” 错误。

4.1 修改文件句柄限制

编辑 /etc/security/limits.conf

# 格式: <domain> <type> <item> <value> # 针对所有用户(除了 root)设置软限制和硬限制 * soft nofile 65535 * hard nofile 65535 # 针对 root 用户(某些系统守护进程以 root 运行) root soft nofile 65535 root hard nofile 65535 # 增加进程数限制(针对 Java 应用) * soft nproc 65535 * hard nproc 65535 

4.2 Systemd 服务的独立限制

如果应用通过 Systemd 管理(如 Nginx、MySQL),limits.conf 可能不生效,需要在服务文件中单独设置。

示例:优化 Nginx 服务 编辑 /usr/lib/systemd/system/nginx.service (或 /etc/systemd/system/ 下的覆盖文件):

[Service] ... # 在 ExecStart 前设置限制 LimitNOFILE=65535 LimitNPROC=65535 ... 

修改后重载配置:

sudo systemctl daemon-reload sudo systemctl restart nginx 

第五部分:监控与持续调优

性能调优不是一次性的工作,需要持续监控以验证效果。

5.1 常用监控工具

  1. iostat (来自 sysstat 包):监控磁盘 I/O。

    iostat -xz 1 
    • 关注 %util(利用率):如果接近 100%,说明磁盘是瓶颈。
    • 关注 await:平均 I/O 等待时间,过高说明磁盘响应慢。
  2. vmstat:监控内存、进程、CPU、I/O。

    vmstat 1 
    • 关注 si (swap in) 和 so (swap out):如果非零,说明内存不足。
  3. netstat / ss:监控网络连接。

    ss -s 

    查看当前连接数统计。

5.2 压力测试工具

在生产环境实施变更前,务必在测试环境进行压力测试。

  • CPU/Memory: stress-ng
     stress-ng --cpu 4 --io 2 --vm 2 --vm-bytes 1G --timeout 60s 
  • Web 压测: ab (Apache Bench) 或 wrk
     ab -n 10000 -c 200 http://your-server-ip/ 

总结

AlmaLinux 的性能调优是一个涉及多维度的系统工程。本文从内核参数(内存与交换)、文件系统(挂载与调度)、网络栈(TCP 优化)以及系统资源限制四个方面进行了详细解析。

最佳实践建议:

  1. 备份先行:修改任何系统配置前,请备份原文件。
  2. 循序渐进:不要一次性应用所有优化,每次修改一项,观察效果。
  3. 理解业务:数据库服务器和 Web 服务器的优化侧重点不同,请根据实际业务负载调整参数。

通过以上步骤,您可以显著提升 AlmaLinux 服务器的响应速度与稳定性,确保业务在高负载下依然流畅运行。