引言

AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。性能优化是确保系统高效运行的关键,尤其在高负载场景下。本文将从内核调优、资源管理、文件系统优化等多个维度,提供一套完整的实战指南,帮助您系统化地提升 AlmaLinux 的性能。

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

1.1 系统监控与基准测试

在优化前,必须了解当前系统的性能瓶颈。常用的监控工具包括:

  • top/htop:实时查看进程资源占用。
  • vmstat:监控虚拟内存统计。
  • iostat:监控磁盘 I/O。
  • netstat/ss:监控网络连接。
  • sar:系统活动报告(需安装 sysstat 包)。

示例:安装并使用 sysstat

# 安装 sysstat
sudo dnf install -y sysstat

# 启用 sysstat 服务(每10分钟收集一次数据)
sudo systemctl enable --now sysstat

# 查看历史数据(例如,查看昨天的 CPU 使用率)
sar -u -f /var/log/sa/sa$(date -d "yesterday" +%d)

1.2 基准测试工具

  • CPUsysbenchstress-ng
  • 内存sysbenchmbw
  • 磁盘 I/Ofioiozone
  • 网络iperf3netperf

示例:使用 sysbench 测试 CPU

# 安装 sysbench
sudo dnf install -y sysbench

# 测试 CPU 性能(计算素数,10000 个)
sysbench cpu --cpu-max-prime=10000 run

二、内核参数调优

2.1 调整虚拟内存参数

虚拟内存参数直接影响系统内存管理效率。常用参数包括:

  • vm.swappiness:控制内核使用交换空间的倾向(0-100,默认60)。
  • vm.vfs_cache_pressure:控制内核回收 inode 和 dentry 缓存的倾向(默认100)。
  • vm.dirty_ratiovm.dirty_background_ratio:控制脏页写入磁盘的阈值。

示例:临时调整参数

# 临时设置 swappiness 为 10(减少交换)
echo 10 > /proc/sys/vm/swappiness

# 临时设置 vfs_cache_pressure 为 50(更积极地保留缓存)
echo 50 > /proc/sys/vm/vfs_cache_pressure

永久生效配置: 编辑 /etc/sysctl.conf 文件,添加以下内容:

# /etc/sysctl.conf
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

执行 sysctl -p 使配置生效。

2.2 网络参数调优

对于高并发网络服务器,调整 TCP 参数至关重要:

  • net.core.somaxconn:最大连接队列长度。
  • net.ipv4.tcp_max_syn_backlog:SYN 队列长度。
  • net.ipv4.tcp_tw_reuse:允许 TIME_WAIT 状态的套接字重用。
  • net.ipv4.tcp_fin_timeout:TIME_WAIT 状态的超时时间。

示例:优化 Web 服务器网络参数

# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15

2.3 文件系统相关参数

  • fs.file-max:系统可打开的最大文件数。
  • fs.nr_open:每个进程可打开的最大文件数。

示例:调整文件句柄限制

# /etc/sysctl.conf
fs.file-max = 2097152
fs.nr_open = 2097152

同时,需要调整用户级限制(/etc/security/limits.conf):

# /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576

三、资源管理与调度

3.1 CPU 调度器优化

AlmaLinux 默认使用 CFS(完全公平调度器)。对于特定场景,可以调整调度策略:

  • 实时任务:使用 SCHED_FIFOSCHED_RR
  • 批处理任务:调整 CFS 参数。

示例:使用 taskset 绑定 CPU 核心

# 将进程绑定到 CPU 0 和 1
taskset -cp 0,1 <PID>

# 启动时绑定
taskset -c 0,1 /path/to/program

示例:调整 CFS 参数

# /etc/sysctl.conf
kernel.sched_latency_ns = 10000000  # 调度周期(纳秒)
kernel.sched_min_granularity_ns = 1000000  # 最小调度粒度
kernel.sched_wakeup_granularity_ns = 1500000  # 唤醒粒度

3.2 内存管理

  • 透明大页(THP):对于大内存应用,启用 THP 可以减少 TLB 压力,但可能增加内存碎片。
  • NUMA 优化:对于多路服务器,NUMA 感知的内存分配可以提升性能。

示例:启用透明大页

# 查看当前状态
cat /sys/kernel/mm/transparent_hugepage/enabled

# 临时启用
echo always > /sys/kernel/mm/transparent_hugepage/enabled

# 永久生效(编辑 /etc/rc.local 或使用 systemd 服务)
# 创建服务文件 /etc/systemd/system/thp.service
[Unit]
Description=Enable Transparent Huge Pages

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

[Install]
WantedBy=multi-user.target

示例:NUMA 优化

# 安装 numactl
sudo dnf install -y numactl

# 查看 NUMA 拓扑
numactl --hardware

# 绑定进程到特定 NUMA 节点
numactl --cpunodebind=0 --membind=0 /path/to/program

3.3 I/O 调度器

对于不同类型的存储设备,选择合适的 I/O 调度器:

  • SSD:使用 nonenoop(避免不必要的调度开销)。
  • HDD:使用 deadlinecfq

示例:查看和修改 I/O 调度器

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# 临时修改(例如,将 sda 的调度器改为 none)
echo none > /sys/block/sda/queue/scheduler

# 永久生效(使用 udev 规则)
# 创建 /etc/udev/rules.d/60-ioscheduler.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="none"

四、文件系统优化

4.1 选择合适的文件系统

  • XFS:适合大文件和高并发,AlmaLinux 默认。
  • ext4:通用性好,适合大多数场景。
  • Btrfs:支持快照和压缩,但性能可能略低。

4.2 挂载选项优化

示例:优化 XFS 挂载选项

# /etc/fstab
/dev/sda1 /data xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0
  • noatime:不更新访问时间,减少写操作。
  • nodiratime:不更新目录访问时间。
  • logbufslogbsize:调整日志缓冲区大小,提升写入性能。

4.3 定期维护

  • 文件系统检查:定期使用 fsck 检查文件系统。
  • 碎片整理:XFS 不需要碎片整理,但 ext4 可以使用 e4defrag

示例:定期检查文件系统

# 创建 systemd 定时任务
# /etc/systemd/system/fsck.service
[Unit]
Description=Filesystem Check

[Service]
Type=oneshot
ExecStart=/usr/sbin/fsck -y /dev/sda1

[Install]
WantedBy=multi-user.target

# /etc/systemd/system/fsck.timer
[Unit]
Description=Run fsck monthly

[Timer]
OnCalendar=monthly
Persistent=true

[Install]
WantedBy=timers.target

五、网络优化

5.1 网络接口优化

  • 多队列网卡(RSS):启用多队列可以提升多核 CPU 的网络处理能力。
  • 中断亲和性:将网卡中断绑定到特定 CPU 核心。

示例:启用多队列

# 查看网卡支持的队列数
ethtool -l eth0

# 设置队列数(例如,设置为 8)
ethtool -L eth0 combined 8

示例:设置中断亲和性

# 查看中断号
cat /proc/interrupts | grep eth0

# 绑定中断到 CPU 0-3
echo 0-3 > /proc/irq/<IRQ_NUMBER>/smp_affinity_list

5.2 TCP 优化

除了内核参数,还可以调整 TCP 拥塞控制算法:

  • cubic:默认算法,适合大多数场景。
  • bbr:Google 开发的算法,适合高延迟网络。

示例:切换到 BBR

# 临时切换
sysctl -w net.ipv4.tcp_congestion_control=bbr

# 永久生效
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

六、应用层优化

6.1 数据库优化(以 MySQL 为例)

  • 缓冲池大小:调整 innodb_buffer_pool_size(通常为总内存的 70-80%)。
  • 连接数:调整 max_connectionsthread_cache_size

示例:MySQL 配置文件优化

[mysqld]
# 内存相关
innodb_buffer_pool_size = 16G  # 根据总内存调整
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 2  # 平衡性能与数据安全

# 连接相关
max_connections = 1000
thread_cache_size = 100

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

  • worker_processes:通常设置为 CPU 核心数。
  • worker_connections:每个 worker 的最大连接数。
  • keepalive_timeout:保持连接时间。

示例:Nginx 配置优化

# /etc/nginx/nginx.conf
worker_processes auto;  # 自动检测 CPU 核心数
worker_rlimit_nofile 1048576;  # 文件描述符限制

events {
    worker_connections 10240;  # 每个 worker 的连接数
    use epoll;  # 使用 epoll 模型
    multi_accept on;  # 允许一次接受多个连接
}

http {
    keepalive_timeout 65;  # 保持连接时间
    keepalive_requests 100;  # 每个连接的最大请求数
    sendfile on;  # 启用 sendfile
    tcp_nopush on;  # 优化 TCP 包发送
    tcp_nodelay on;  # 禁用 Nagle 算法
}

七、监控与持续优化

7.1 实时监控工具

  • Prometheus + Grafana:开源监控方案,可自定义指标。
  • Netdata:实时性能监控,开箱即用。
  • Zabbix:企业级监控,支持告警。

示例:安装 Netdata

# 一键安装
bash <(curl -Ss https://my-netdata.io/kickstart.sh)

# 访问 http://<server-ip>:19999

7.2 日志分析

  • ELK Stack(Elasticsearch, Logstash, Kibana):日志收集与分析。
  • rsyslog:系统日志管理。

示例:配置 rsyslog 发送日志到远程服务器

# /etc/rsyslog.conf
*.* @remote-server:514

7.3 自动化优化脚本

编写脚本定期检查并调整系统参数。

示例:自动调整 swappiness 的脚本

#!/bin/bash
# /usr/local/bin/adjust_swappiness.sh

# 获取当前内存使用率
MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')

# 如果内存使用率超过 80%,降低 swappiness
if (( $(echo "$MEM_USAGE > 80" | bc -l) )); then
    echo 5 > /proc/sys/vm/swappiness
else
    echo 10 > /proc/sys/vm/swappiness
fi

八、总结

AlmaLinux 的性能优化是一个系统工程,需要从内核参数、资源管理、文件系统、网络和应用层多个维度入手。通过合理的监控和持续的调整,可以显著提升系统性能。记住,优化前务必进行基准测试,优化后也要持续监控,确保调整带来的是正向收益。

关键点回顾

  1. 监控先行:了解瓶颈是优化的第一步。
  2. 内核调优:虚拟内存、网络参数是基础。
  3. 资源管理:CPU、内存、I/O 调度器的选择至关重要。
  4. 文件系统优化:挂载选项和定期维护。
  5. 网络优化:多队列、中断亲和性、TCP 算法。
  6. 应用层优化:针对具体应用(如数据库、Web 服务器)进行配置。
  7. 持续监控:使用工具如 Netdata、Prometheus 进行实时监控。

通过本文的实战指南,您应该能够系统地优化 AlmaLinux 系统,满足不同业务场景的性能需求。