在当今的云计算和企业级环境中,操作系统性能的优化是确保应用高效运行、资源利用率最大化以及成本控制的关键。AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和安全性,同时提供了活跃的社区支持。本文将深入探讨 AlmaLinux 的性能优化策略,从底层的内核调优到上层的应用层加速,提供一套完整的、可操作的指南。

1. 性能优化概述与准备工作

在开始任何优化之前,必须建立一个基准(Baseline)。没有基准,就无法衡量优化的效果。优化是一个迭代过程:测量 -> 分析 -> 优化 -> 验证。

1.1 建立性能基准

使用系统工具收集当前性能数据。

# 安装 sysstat 工具包,用于收集系统活动数据
sudo dnf install -y sysstat

# 启动并启用 sysstat 服务(sadc 会定期收集数据)
sudo systemctl enable --now sysstat

# 查看当前系统负载和资源使用情况
uptime
top
htop  # 如果未安装,可 sudo dnf install -y htop

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

# 查看磁盘 I/O 统计
iostat -x 1 5  # 每秒刷新一次,共5次

1.2 确定优化目标

优化目标通常分为几类:

  • 低延迟:适用于实时应用、数据库、交易系统。
  • 高吞吐量:适用于文件服务器、Web 服务器、批处理作业。
  • 高并发:适用于 Web 服务器、API 网关。
  • 资源效率:适用于虚拟化环境、容器平台,旨在减少资源浪费。

2. 内核级优化

内核是操作系统的核心,其参数直接影响系统行为。AlmaLinux 使用与 RHEL 相同的内核,因此优化策略高度一致。

2.1 CPU 调度器优化

Linux 内核提供了多种 CPU 调度器,针对不同负载进行优化。

  • performance:将 CPU 频率锁定在最高性能状态,减少延迟,但功耗较高。适用于数据库、计算密集型任务。
  • powersave:动态调整 CPU 频率以节省能源,适用于对功耗敏感的环境。
  • ondemand:根据 CPU 负载动态调整频率,是默认设置,平衡了性能和功耗。
  • schedutil:现代内核的默认调度器,结合了 ondemandperformance 的优点,响应迅速。

检查当前调度器:

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

修改调度器(以 performance 为例):

# 临时修改(重启失效)
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance | sudo tee $cpu
done

# 永久修改(使用 tuned)
sudo dnf install -y tuned
sudo tuned-adm profile throughput-performance  # 该 profile 会设置 CPU 为 performance

2.2 内存管理优化

内存管理对性能至关重要,特别是对于内存密集型应用。

2.2.1 调整虚拟内存参数

编辑 /etc/sysctl.conf 文件,添加或修改以下参数:

# /etc/sysctl.conf

# 1. 调整 swappiness (默认值 60)
# 值越低,内核越倾向于使用物理内存,而不是交换空间。
# 对于数据库服务器,建议设置为 1 或 10。
vm.swappiness = 1

# 2. 调整脏页比例
# vm.dirty_ratio: 系统内存中脏页占总内存的百分比,超过此值,进程将开始同步写入磁盘。
# vm.dirty_background_ratio: 后台进程开始写入脏页的百分比。
# 对于高 I/O 系统,降低这些值可以减少 I/O 峰值。
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10

# 3. 调整内存过量使用策略
# 对于虚拟化环境,可以适当增加 overcommit_memory。
# 0: 启发式过量使用(默认)。1: 总是允许。2: 禁止。
vm.overcommit_memory = 1

# 4. 调整 TCP 内存
# 根据系统内存调整,单位为页(通常 4KB)。
# 例如,对于 16GB 内存的系统,可以设置为:
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456
net.core.rmem_max = 6291456
net.core.wmem_max = 6291456

# 应用更改
sudo sysctl -p

2.2.2 使用透明大页 (THP)

对于大多数现代工作负载,尤其是数据库(如 PostgreSQL, MySQL),禁用透明大页可以提高性能,因为 THP 的内存整理可能导致延迟。

# 检查 THP 状态
cat /sys/kernel/mm/transparent_hugepage/enabled

# 永久禁用 THP(推荐)
# 创建一个 systemd 服务来在启动时禁用
sudo tee /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=basic.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag'

[Install]
WantedBy=basic.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now disable-thp.service

2.3 I/O 调度器优化

I/O 调度器决定了块设备(如磁盘、SSD)的请求处理顺序。

  • none:对于 NVMe SSD,这是最佳选择,因为它几乎没有调度开销。
  • mq-deadline:适用于高速 SSD 和多队列设备,提供公平性和截止时间保证。
  • bfq:适用于机械硬盘和混合负载,提供良好的交互性。

检查当前 I/O 调度器:

cat /sys/block/sda/queue/scheduler  # 替换 sda 为你的设备名

修改 I/O 调度器(以 NVMe SSD 为例):

# 临时修改
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler

# 永久修改(使用 udev 规则)
sudo tee /etc/udev/rules.d/60-ioscheduler.rules <<EOF
# 对于 NVMe 设备,使用 none 调度器
ACTION=="add|change", KERNEL=="nvme*", 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"
EOF

# 重新加载 udev 规则
sudo udevadm control --reload-rules && sudo udevadm trigger

2.4 网络栈优化

对于网络密集型应用(如 Web 服务器、API 服务),网络栈优化至关重要。

# /etc/sysctl.conf

# 1. 增加端口范围,避免端口耗尽
net.ipv4.ip_local_port_range = 1024 65535

# 2. 增加 TCP 连接队列大小
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 4096

# 3. 启用 TCP 快速打开 (TFO)
net.ipv4.tcp_fastopen = 3  # 1: 客户端, 2: 服务端, 3: 两者

# 4. 启用 TCP 时间戳(用于 RTT 计算和 PAWS)
net.ipv4.tcp_timestamps = 1

# 5. 启用 TCP 窗口缩放
net.ipv4.tcp_window_scaling = 1

# 6. 增加最大连接数
net.core.netdev_max_backlog = 5000

# 7. 调整 TCP keepalive 设置,减少空闲连接资源占用
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10

# 应用更改
sudo sysctl -p

3. 文件系统优化

文件系统的选择和挂载选项对 I/O 性能有显著影响。

3.1 选择合适的文件系统

  • XFS:AlmaLinux 的默认文件系统,性能优秀,尤其适合大文件和高并发 I/O。
  • ext4:稳定可靠,适用于通用场景。
  • Btrfs:提供高级功能(如快照、压缩),但性能可能略逊于 XFS。

3.2 挂载选项优化

/etc/fstab 中为关键分区添加优化选项。

# 示例:优化 /var/log 分区(假设为 /dev/sdb1)
# 原始行可能为:
# /dev/sdb1 /var/log ext4 defaults 0 2

# 优化后:
/dev/sdb1 /var/log xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 2

# 解释:
# noatime: 不更新文件访问时间,减少写操作。
# nodiratime: 不更新目录访问时间。
# logbufs=8, logbsize=256k: 增加 XFS 日志缓冲区大小,提高写入性能(适用于高写入负载)。

3.3 使用 fstrim 进行 SSD 维护

对于 SSD,定期运行 fstrim 可以帮助维护性能。

# 手动运行 fstrim
sudo fstrim -v /

# 设置定时任务(每周一次)
sudo tee /etc/cron.weekly/fstrim <<EOF
#!/bin/bash
/usr/sbin/fstrim -v /
EOF
sudo chmod +x /etc/cron.weekly/fstrim

4. 应用层优化

应用层优化是直接针对运行在 AlmaLinux 上的应用程序进行的优化。

4.1 数据库优化(以 PostgreSQL 为例)

PostgreSQL 是常见的企业级数据库,其性能优化涉及多个层面。

4.1.1 内存配置

编辑 PostgreSQL 配置文件 postgresql.conf(通常位于 /var/lib/pgsql/data/)。

# postgresql.conf

# 1. 共享缓冲区:设置为系统内存的 25% 左右(但不超过 8GB,除非有特殊需求)
shared_buffers = 4GB  # 假设系统有 16GB 内存

# 2. 工作内存:每个数据库连接可以使用的内存,根据并发连接数调整
# 公式:total_work_mem = work_mem * max_connections
# 例如,如果 max_connections=100,work_mem=16MB,则总工作内存为 1.6GB
work_mem = 16MB

# 3. 维护工作内存:用于 VACUUM, CREATE INDEX 等操作
maintenance_work_mem = 512MB

# 4. 有效缓存大小:告诉优化器系统中有多少内存可用于缓存数据
# 设置为系统总内存的 50%-75%
effective_cache_size = 12GB

# 5. 检查点相关参数,减少 I/O 压力
checkpoint_completion_target = 0.9
max_wal_size = 2GB
min_wal_size = 1GB

# 6. 启用并行查询(根据 CPU 核心数)
max_parallel_workers_per_gather = 4
max_parallel_workers = 8

4.1.2 查询优化

使用 EXPLAIN ANALYZE 分析慢查询。

-- 示例:分析一个查询的执行计划
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 12345;

-- 创建合适的索引
CREATE INDEX idx_orders_customer_id ON orders(customer_id);

-- 使用部分索引(如果查询条件固定)
CREATE INDEX idx_orders_status_active ON orders(order_id) WHERE status = 'active';

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

Nginx 是高性能的 Web 服务器和反向代理。

4.2.1 配置优化

编辑 /etc/nginx/nginx.conf 或站点配置文件。

# nginx.conf

# 1. 工作进程数:通常设置为 CPU 核心数
worker_processes auto;  # 或者具体数字,如 4

# 2. 每个工作进程的最大连接数
events {
    worker_connections 1024;
    use epoll;  # Linux 2.6+ 的高效事件模型
    multi_accept on;  # 一次性接受多个连接
}

# 3. HTTP 配置块
http {
    # 4. 启用 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/json
        application/javascript
        application/xml+rss
        application/atom+xml
        image/svg+xml;

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

    # 6. 调整 TCP 缓冲区
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 100;

    # 7. 调整客户端请求体大小
    client_max_body_size 10m;
    client_body_buffer_size 128k;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;

    # 8. 启用 HTTP/2
    server {
        listen 443 ssl http2;
        # ... 其他配置
    }
}

4.2.2 使用缓存

对于动态内容,可以使用 Nginx 的缓存模块。

# 在 http 块中定义缓存路径
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

# 在 server 块中启用缓存
location /api/ {
    proxy_pass http://backend;
    proxy_cache my_cache;
    proxy_cache_key "$scheme$request_method$host$request_uri";
    proxy_cache_valid 200 302 10m;
    proxy_cache_valid 404 1m;
    proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
}

4.3 应用程序运行时优化

对于 Java、Python、Go 等应用程序,运行时参数调整至关重要。

4.3.1 Java 应用(JVM 调优)

# 示例:启动 Java 应用的 JVM 参数
java -Xms4g -Xmx4g \  # 初始和最大堆内存,设置为相同值避免动态调整
     -XX:+UseG1GC \    # 使用 G1 垃圾收集器,适合大堆内存
     -XX:MaxGCPauseMillis=200 \  # 目标最大 GC 暂停时间
     -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap \  # 在容器中自动检测内存限制
     -jar myapp.jar

4.3.2 Python 应用(使用 uWSGI 和 Gunicorn)

对于 Django/Flask 应用,使用 uWSGI 或 Gunicorn 作为应用服务器。

# uWSGI 配置示例 (uwsgi.ini)
[uwsgi]
# 进程和线程配置
master = true
processes = 4          # 根据 CPU 核心数调整
threads = 2            # 每个进程的线程数
enable-threads = true  # 启用线程支持

# 内存管理
harakiri = 30          # 请求超时时间(秒)
max-requests = 1000    # 每个进程处理 1000 个请求后重启,防止内存泄漏
reload-on-rss = 200    # 当进程内存超过 200MB 时重启

# 与 Nginx 通信
socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true

# 日志
logto = /var/log/uwsgi/app.log

5. 监控与持续优化

性能优化不是一次性的工作,需要持续的监控和调整。

5.1 使用 sar 进行历史分析

sarsysstat 包的一部分,可以收集和报告系统活动信息。

# 查看过去 1 小时的 CPU 使用率
sar -u 1 3600

# 查看过去 1 小时的内存使用情况
sar -r 1 3600

# 查看过去 1 小时的 I/O 统计
sar -b 1 3600

5.2 使用 perf 进行性能剖析

perf 是 Linux 内核自带的强大性能分析工具。

# 安装 perf
sudo dnf install -y perf

# 记录 CPU 事件 10 秒
sudo perf record -g -p <PID> sleep 10

# 生成报告
sudo perf report

# 分析系统调用开销
sudo perf stat -e syscalls:sys_enter_* -p <PID> sleep 10

5.3 使用 bpftrace 进行动态追踪

bpftrace 是基于 eBPF 的高级追踪工具,可以深入分析内核和用户空间行为。

# 安装 bpftrace
sudo dnf install -y bpftrace

# 示例:追踪所有文件系统操作
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'

# 示例:追踪特定进程的系统调用延迟
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* /pid == 1234/ { @start[tid] = nsecs; }
                  tracepoint:syscalls:sys_exit_* /pid == 1234/ {
                      $end = nsecs;
                      $lat = $end - @start[tid];
                      @latency = hist($lat);
                      delete(@start[tid]);
                  }'

6. 总结

AlmaLinux 的性能优化是一个多层次、系统性的工程。从内核参数的精细调整,到文件系统的合理配置,再到应用层的针对性优化,每一步都需要基于实际的负载和基准测试结果。

关键要点回顾:

  1. 基准先行:优化前必须建立性能基准。
  2. 内核调优:针对 CPU、内存、I/O 和网络进行参数调整。
  3. 文件系统:选择合适的文件系统并优化挂载选项。
  4. 应用层:针对具体应用(如数据库、Web 服务器)进行配置优化。
  5. 持续监控:使用 sarperfbpftrace 等工具持续监控,形成优化闭环。

记住,没有“一刀切”的优化方案。最佳实践是结合你的具体工作负载,通过科学的测量和分析,逐步迭代,找到最适合你环境的配置。AlmaLinux 的稳定性和丰富的工具链为这一过程提供了坚实的基础。