引言:为什么需要优化 AlmaLinux 系统性能

AlmaLinux 作为 CentOS 的替代品,继承了 RHEL 的稳定性和安全性,但在高负载环境下,系统默认配置往往无法满足性能需求。系统卡顿、响应缓慢、高负载等问题不仅影响用户体验,还可能导致业务中断。通过系统性的性能优化,我们可以显著提升服务器的响应速度和稳定性。

性能优化的核心目标包括:

  • 降低延迟:减少系统调用和 I/O 等待时间
  • 提高吞吐量:在单位时间内处理更多请求
  • 资源高效利用:合理分配 CPU、内存、磁盘和网络资源
  • 系统稳定性:避免 OOM(内存耗尽)和 CPU 过载

一、内核参数优化策略

1.1 内存管理优化

Linux 内核的内存管理子系统对性能有决定性影响。通过调整 /etc/sysctl.conf 中的参数,可以优化内存分配策略。

1.1.1 调整虚拟内存参数

# 编辑 sysctl 配置文件
sudo vi /etc/sysctl.conf

# 添加以下优化参数
# 1. 调整交换分区倾向(值越低越倾向于使用物理内存)
vm.swappiness = 10

# 2. 调整内存过度分配策略(0表示禁止overcommit,1表示允许)
vm.overcommit_memory = 0

# 3. 调整脏页写回策略
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# 4. 调整内存回收策略
vm.vfs_cache_pressure = 100

# 5. 调整最大映射区域数
vm.max_map_count = 262144

参数详解:

  • vm.swappiness:控制系统使用交换分区的倾向。默认值为 60,降低到 10 可以减少交换频率,提高响应速度。对于数据库服务器,建议设置为 1-10;对于普通 Web 服务器,可以设置为 10-30。

  • vm.overcommit_memory:控制内存分配策略。设置为 0 时,内核会检查是否有足够的物理内存;设置为 1 时,总是允许 overcommit。对于内存密集型应用,建议保持为 0。

  • vm.dirty_ratiovm.dirty_background_ratio:控制脏页(未写入磁盘的数据)占内存的比例。降低这些值可以使数据更频繁地写入磁盘,避免内存中积累过多脏页导致 I/O 突发。

  • vm.vfs_cache_pressure:控制内核回收用于目录项和 inode 缓存的内存倾向。默认值 100 表示平衡回收,增大值会更快回收缓存,减小值会保留更多缓存。

1.1.2 应用内存参数

# 立即应用参数(无需重启)
sudo sysctl -p

# 验证参数是否生效
sysctl vm.swappiness
# 输出:vm.swappiness = 10

1.2 网络性能优化

对于 Web 服务器和数据库服务器,网络性能至关重要。以下是关键的网络内核参数:

# 在 /etc/sysctl.conf 中添加
# 1. 增加 TCP 连接队列大小
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 2. 优化 TCP 缓冲区大小
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 3. 启用 TCP 快速打开
net.ipv4.tcp_fastopen = 3

# 4. 调整 TIME_WAIT 状态连接回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 5. 增加可用端口范围
net.ipv4.ip_local_port_range = 1024 65535

# 6. 启用 TCP 拥塞控制算法(BBR 适合高带宽延迟积网络)
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr

参数详解:

  • net.core.somaxconn:定义了每个监听端口的连接队列最大长度。在高并发场景下,如果队列溢出,会导致连接被丢弃。设置为 65535 可以处理大量并发连接。

  • TCP 缓冲区:增大 TCP 读写缓冲区可以提高网络吞吐量,但会占用更多内存。根据服务器内存大小调整,16MB 是一个合理的起点。

  • tcp_fastopen:启用 TFO 可以减少 TCP 握手延迟。值为 3 表示同时支持客户端和服务器模式。

  • tcp_tw_reuse:允许重用 TIME_WAIT 状态的套接字,可以快速释放端口资源。

  • BBR 拥塞控制:BBR(Bottleneck Bandwidth and RTT)是 Google 开发的拥塞控制算法,相比传统算法(如 Cubic)在高延迟网络中表现更好。

1.3 磁盘 I/O 优化

1.3.1 I/O 调度器选择

AlmaLinux 支持多种 I/O 调度器,根据存储类型选择合适的调度器可以显著提升性能。

# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler
# 输出示例:noop [deadline] cfq

# 对于 SSD/NVMe,使用 none 或 noop(无调度或简单调度)
echo none > /sys/block/nvme0n1/queue/scheduler

# 对于 HDD,使用 deadline 或 mq-deadline
echo deadline > /sys/block/sda/queue/scheduler

# 永久生效(创建 udev 规则)
sudo tee /etc/udev/rules.d/60-ioscheduler.rules <<EOF
# SSD 设置为 none
ACTION=="add|change", KERNEL=="nvme*[0-9]", ATTR{queue/scheduler}="none"
# HDD 设置为 deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"
EOF

1.3.2 文件系统挂载选项优化

/etc/fstab 中优化挂载选项:

# 原始条目示例
# /dev/sda1 / ext4 defaults 1 1

# 优化后的条目(SSD)
/dev/nvme0n1p1 / ext4 defaults,noatime,nodiratime,discard 1 1

# 优化后的条目(HDD)
/dev/sda1 / ext4 defaults,noatime,barrier=0 1 1

选项说明:

  • noatime:禁止更新文件访问时间,减少元数据写入
  • nodiratime:禁止更新目录访问时间
  • discard:启用 TRIM 支持(仅 SSD)
  • barrier=0:禁用写入屏障(仅 HDD,会提高性能但降低安全性)

二、系统服务与进程管理优化

2.1 系统服务精简

AlmaLinux 默认运行许多服务,其中很多在特定场景下是不必要的。禁用不必要的服务可以释放系统资源。

# 查看所有正在运行的服务
systemctl list-units --type=service --state=running

# 查看开机自启服务
systemctl list-unit-files --type=service | grep enabled

# 禁用不必要的服务(示例)
sudo systemctl disable bluetooth
sudo systemctl disable cups
sudo systemctl disable avahi-daemon
sudo systemctl disable ModemManager

# 禁用服务并立即停止
sudo systemctl disable --now bluetooth

# 查看服务资源占用
systemd-cgtop

2.2 进程优先级调整

使用 nicerenice 调整进程优先级,确保关键业务获得更高 CPU 优先级。

# 启动高优先级进程(nice 值越小,优先级越高)
nice -n -10 /usr/bin/critical-app

# 调整运行中进程的优先级
# 查找进程 PID
ps aux | grep nginx
# 假设 PID 为 1234
renice -n -10 -p 1234

# 将进程绑定到特定 CPU 核心(CPU 亲和性)
# 安装 taskset
sudo dnf install util-linux

# 将进程绑定到 CPU 0 和 1
taskset -cp 0,1 1234

# 启动时绑定
taskset -c 0,1 /usr/bin/app

2.3 使用 systemd 资源控制

systemd 提供了强大的资源限制功能,可以防止单个服务耗尽系统资源。

# 创建 systemd 服务文件
sudo tee /etc/systemd/system/myapp.service <<EOF
[Unit]
Description=My Application
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/myapp

# CPU 限制:最多使用 2 个 CPU 核心
CPUQuota=200%

# 内存限制:最多使用 4GB 内存,超过则 OOM killer
MemoryLimit=4G

# 重启策略
Restart=always
RestartSec=5

# 进程数限制
LimitNPROC=512

[Install]
WantedBy=multi-user.target
EOF

# 重新加载并启动
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service

# 查看资源使用情况
systemctl status myapp.service

三、存储系统优化

3.1 LVM 性能优化

LVM(逻辑卷管理)在 AlmaLinux 中广泛使用,合理配置可以提升性能。

# 查看 LVM 配置
sudo lvs
sudo vgs
sudo pvs

# 优化 LVM 策略(针对 SSD)
sudo tee /etc/lvm/lvm.conf <<EOF
devices {
    # 启用 SSD 优化
    enable_devices = ["ssd"]
    # 减少 I/O 调度器切换
    obtain_device_list_from_udev = 1
    # 策略优化
    filter = [ "a/.*/" ]
    sysfs_scan = 1
}
EOF

# 调整 LVM 缓存(针对 HDD)
# 创建缓存逻辑卷
sudo lvconvert --type cache --cachepool data_pool /dev/vg0/lv_data

3.2 RAID 配置优化

如果使用硬件 RAID 或软件 RAID,优化配置可以提升性能。

# 查看 RAID 状态
cat /proc/mdstat

# 调整 RAID stripe 大小(针对大文件传输)
# 停止 RAID
sudo mdadm --stop /dev/md0

# 重新创建 RAID 以调整 stripe 大小(注意:会丢失数据)
sudo mdadm --create /dev/md0 --level=5 --chunk=64 --raid-devices=3 /dev/sdb /dev/sdc /dev/sdd

# 调整 RAID 读写策略
echo 1024 > /sys/block/md0/md/stripe_cache_size
echo 1 > /sys/block/md0/md/sync_action

3.3 使用 tmpfs 优化临时文件

将频繁读写的临时目录挂载到内存中,可以极大提升 I/O 性能。

# 临时挂载(重启后失效)
sudo mount -t tmpfs -o size=2G tmpfs /tmp

# 永久挂载(/etc/fstab)
tmpfs /tmp tmpfs defaults,size=2G,nosuid,nodev,noexec 0 0

# 为特定应用创建 tmpfs 挂载点
tmpfs /var/cache/myapp tmpfs defaults,size=512M 0 0

四、网络服务优化实践

4.1 Nginx 性能优化

Nginx 是 AlmaLinux 上常用的 Web 服务器,以下是关键优化参数:

# /etc/nginx/nginx.conf
worker_processes auto;  # 自动设置为 CPU 核心数
worker_connections 65535;  # 每个 worker 的最大连接数
worker_rlimit_nofile 65535;  # worker 进程能打开的最大文件数

events {
    use epoll;  # 高性能事件模型
    multi_accept on;  # 一次接受多个连接
}

http {
    # 缓冲区设置
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 4k;
    
    # 超时设置
    client_header_timeout 30s;
    client_body_timeout 30s;
    send_timeout 30s;
    
    # 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/javascript
        application/xml+rss
        application/json;
    
    # 缓存静态文件
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    # TCP Fast Open
    listen 80 fastopen=256;
}

4.2 MySQL/MariaDB 数据库优化

数据库性能优化是服务器优化的重点:

# /etc/my.cnf.d/server.cnf
[mysqld]
# 连接设置
max_connections = 1000
max_connect_errors = 100
connect_timeout = 10

# 缓冲区设置(根据内存调整)
innodb_buffer_pool_size = 4G  # 通常设置为总内存的 50-70%
innodb_buffer_pool_instances = 8  # 与 CPU 核心数相同
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M

# I/O 优化
innodb_flush_log_at_trx_commit = 2  # 1=完全安全,2=性能优先
innodb_flush_method = O_DIRECT  # 绕过系统缓存
innodb_file_per_table = ON

# 查询缓存(MySQL 5.7 及以下)
query_cache_type = 1
query_cache_size = 128M

# 临时表设置
tmp_table_size = 256M
max_heap_table_size = 256M

# 日志设置(生产环境关闭)
slow_query_log = OFF
general_log = OFF

4.3 Redis 性能优化

Redis 作为内存数据库,优化配置至关重要:

# /etc/redis.conf
# 内存设置
maxmemory 4gb
maxmemory-policy allkeys-lru  # 内存满时的淘汰策略

# 持久化优化(根据需求选择)
save 900 1
save 300 10
save 60 10000

# RDB 和 AOF 优化
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb

# 网络优化
tcp-keepalive 300
timeout 0

# 性能调优
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

# 后台保存优化
stop-writes-on-bgsave-error no

五、监控与诊断工具

5.1 系统性能监控工具

# 1. htop - 交互式进程查看器
sudo dnf install htop
htop  # 使用 F6 排序,F9 杀死进程

# 2. iotop - I/O 监控
sudo dnf install iotop
sudo iotop -o  # 只显示 I/O 活动进程

# 3. nethogs - 按进程监控网络流量
sudo dnf install nethogs
sudo nethogs

# 4. vmstat - 虚拟内存统计
vmstat 1 10  # 每秒输出,共 10 次

# 5. sar - 系统活动报告
sudo dnf install sysstat
sudo sar -u 1 10  # CPU 使用率
sudo sar -r 1 10  # 内存使用率
sudo sar -b 1 10  # I/O 统计

5.2 性能分析工具

# 1. perf - Linux 性能分析工具
sudo dnf install perf
sudo perf top  # 实时性能分析

# 2. strace - 系统调用跟踪
sudo strace -p <PID> -c  # 统计系统调用

# 3. lsof - 查看打开的文件
lsof -p <PID>  # 查看进程打开的文件
lsof -i :80    # 查看 80 端口占用

# 4. ss - socket 统计
ss -tunap  # 查看所有 TCP/UDP 连接

# 5. atop - 高级系统和进程监控
sudo dnf install atop
sudo atop  # 交互式界面

5.3 自动化监控脚本

#!/bin/bash
# /usr/local/bin/performance-monitor.sh

# 配置
LOG_FILE="/var/log/performance.log"
CPU_THRESHOLD=80
MEM_THRESHOLD=80
DISK_THRESHOLD=85

# 获取当前时间
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# CPU 使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)

# 内存使用率
MEM_USAGE=$(free | grep Mem | awk '{printf("%.1f", $3/$2 * 100.0)}')

# 磁盘使用率(根分区)
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | cut -d'%' -f1)

# 记录日志
echo "$TIMESTAMP - CPU: ${CPU_USAGE}% Memory: ${MEM_USAGE}% Disk: ${DISK_USAGE}%" >> $LOG_FILE

# 超过阈值报警
if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
    echo "ALERT: High CPU usage: ${CPU_USAGE}%" | logger -t performance-monitor
fi

if (( $(echo "$MEM_USAGE > $MEM_THRESHOLD" | bc -l) )); then
    echo "ALERT: High Memory usage: ${MEM_USAGE}%" | logger -t performance-monitor
fi

if [ $DISK_USAGE -gt $DISK_THRESHOLD ]; then
    echo "ALERT: High Disk usage: ${DISK_USAGE}%" | logger -t performance-monitor
fi

六、高级优化技巧

6.1 使用 tuned 动态调优

tuned 是 RHEL/CentOS/AlmaLinux 的官方性能调优工具,提供多种预设配置。

# 安装 tuned
sudo dnf install tuned

# 启动并启用
sudo systemctl enable --now tuned

# 查看可用配置
tuned-adm list

# 推荐配置
tuned-adm recommend

# 应用配置(示例)
sudo tuned-adm profile throughput-performance  # 高吞吐量
sudo tuned-adm profile latency-performance    # 低延迟
sudo tuned-adm profile virtual-guest         # 虚拟机
sudo tuned-adm profile desktop               # 桌面

# 查看当前配置
tuned-adm active

# 创建自定义配置
sudo mkdir -p /etc/tuned/custom-profile
sudo tee /etc/tuned/custom-profile/tuned.conf <<EOF
[main]
include=throughput-performance

[cpu]
governor=performance
min_perf_pct=100

[vm]
swappiness=10
EOF

# 应用自定义配置
sudo tuned-adm profile custom-profile

6.2 使用 eBPF 进行深度监控

eBPF 是现代 Linux 内核的强大工具,可以用于深度性能分析。

# 安装 bpftrace
sudo dnf install bpftrace

# 示例:跟踪进程的系统调用延迟
sudo bpftrace -e 'tracepoint:raw_syscalls:sys_enter { @start[tid] = nsecs; }
tracepoint:raw_syscalls:sys_exit /@start[tid]/ { @latency = hist(nsecs - @start[tid]); delete(@start[tid]); }'

# 示例:监控文件 I/O
sudo bpftrace -e 'tracepoint:block:block_rq_complete { printf("I/O latency: %d ms\n", args->duration / 1000000); }'

6.3 内核热补丁与实时内核

对于极端性能要求的场景,可以考虑使用实时内核或热补丁。

# 安装实时内核(仅对性能要求极高的场景)
sudo dnf install kernel-rt

# 查看可用内核版本
sudo dnf list available kernel-rt

# 安装特定版本
sudo dnf install kernel-rt-3.10.0-1160.el7.x86_64

# 更新 grub 并重启
sudo grub2-set-default 0
sudo reboot

七、优化效果验证与持续改进

7.1 基准测试工具

# CPU 基准测试
sudo dnf install sysbench
sysbench cpu --cpu-max-prime=20000 run

# 内存基准测试
sysbench memory --memory-block-size=1M --memory-total-size=10G run

# 磁盘 I/O 基准测试
sysbench fileio --file-total-size=5G prepare
sysbench fileio --file-total-size=5G --file-test-mode=rndrw run
sysbench fileio --file-total-size=5G cleanup

# 数据库基准测试(MySQL)
sysbench oltp_read_write --table-size=100000 --mysql-user=root --mysql-password=pass prepare
sysbench oltp_read_write --table-size=100000 --mysql-user=root --mysql-password=pass run

7.2 A/B 测试方法

# 创建测试脚本框架
#!/bin/bash
# performance-test.sh

# 配置
TEST_NAME=$1
DURATION=300  # 5分钟

# 开始测试
echo "Starting test: $TEST_NAME"
START_TIME=$(date +%s)

# 运行基准测试(示例)
sysbench cpu --cpu-max-prime=20000 run > /tmp/before.txt

# 应用优化配置
# ... 应用优化 ...

# 再次运行测试
sysbench cpu --cpu-max-prime=20000 run > /tmp/after.txt

# 对比结果
echo "Before:"
cat /tmp/before.txt | grep "events per second"
echo "After:"
cat /tmp/after.txt | grep "events per second"

7.3 持续监控与调优

# 设置系统性能数据收集
sudo dnf install sysstat
sudo systemctl enable --now sysstat

# 配置 sysstat 收集频率(/etc/sysconfig/sysstat)
INTERVAL=10  # 每 10 秒收集一次

# 查看历史数据
sar -f /var/log/sa/sa$(date +%d -d yesterday) -u  # 昨天的 CPU 数据

八、总结与最佳实践

8.1 优化检查清单

系统层面:

  • [ ] 已调整 vm.swappiness 和 vm.dirty_ratio
  • [ ] 已优化 TCP 网络参数
  • [ ] 已禁用不必要的系统服务
  • [ ] 已配置合适的 I/O 调度器

应用层面:

  • [ ] Nginx 已配置合适的 worker 进程数和连接数
  • [ ] MySQL 已调整缓冲池大小和 I/O 设置
  • [ ] Redis 已配置合适的内存策略
  • [ ] 已使用 systemd 资源限制

监控层面:

  • [ ] 已安装并配置 tuned
  • [ ] 已设置性能监控脚本
  • [ ] 已配置日志轮转和存储
  • [ ] 已建立基准测试流程

8.2 常见问题排查

问题 1:系统响应缓慢但 CPU 使用率不高

# 检查 I/O 等待
iostat -x 1
# 检查内存交换
vmstat 1
# 检查软中断
cat /proc/softirqs

问题 2:网络连接数过高

# 查看连接状态
ss -s
# 查看 TIME_WAIT 数量
ss -tan | grep TIME-WAIT | wc -l
# 调整内核参数
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_fin_timeout=30

问题 3:内存泄漏

# 监控内存使用趋势
watch -n 1 'free -m'
# 查看内存分配
cat /proc/meminfo
# 使用 smem 查看进程内存
smem -s rss

8.3 性能优化原则

  1. 测量优先:在优化前先测量当前性能,建立基准
  2. 小步快跑:每次只调整一个参数,观察效果
  3. 理解原理:不要盲目复制参数,要理解其作用
  4. 平衡安全与性能:某些优化可能降低安全性
  5. 持续监控:优化不是一次性工作,需要持续监控和调整

通过系统性地应用这些优化策略,AlmaLinux 服务器的性能可以得到显著提升。记住,优化是一个持续的过程,需要根据实际负载和业务需求不断调整。建议建立性能基线,定期进行基准测试,并根据监控数据进行针对性优化。