引言:为什么需要优化 AlmaLinux?
AlmaLinux 作为 CentOS 的稳定替代品,继承了 RHEL 的稳定性和安全性,广泛应用于企业级服务器环境。然而,随着业务规模的扩大,系统默认配置往往无法满足高并发、高吞吐量的需求。性能优化不是一蹴而就的,而是需要从内核参数、文件系统、资源调度等多个维度进行精细化调整。
本文将深入探讨 AlmaLinux 的性能优化策略,涵盖以下核心内容:
- 内核参数调整:通过 sysctl 优化网络、内存和进程调度。
- 文件系统优化:选择合适的文件系统并调整挂载参数。
- 资源限制与控制:使用 cgroups 和 systemd 资源控制。
- 网络性能优化:调整 TCP 栈参数和网络设备配置。
- 监控与调优工具:使用 perf、vmstat 等工具定位瓶颈。
一、内核参数调整:sysctl 的魔力
内核参数是系统性能的基石。通过调整 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的配置文件,我们可以优化内存管理、网络性能和进程调度。
1.1 内存管理优化
问题场景:系统频繁发生 OOM(Out of Memory),导致进程被杀死。
解决方案:调整内存回收策略和虚拟内存参数。
# 编辑 /etc/sysctl.conf 或创建新文件 /etc/sysctl.d/99-memory.conf
# 1. 调整内存过度分配策略(默认值 50,表示允许分配超过物理内存 50% 的内存)
vm.overcommit_memory = 1
# 2. 设置 OOM 杀死进程的优先级(-100 到 1000,值越大越容易被杀死)
vm.oom_kill_allocating_task = 1
# 3. 调整交换分区的使用倾向(值越大,越倾向于使用交换分区)
vm.swappiness = 10
# 4. 调整脏页写回策略(默认值 30,表示内存中脏页占比超过 30% 时开始写回)
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
# 应用配置
sysctl -p /etc/sysctl.d/99-memory.conf
详细说明:
vm.overcommit_memory = 1:允许超量分配内存,适用于需要大量内存的应用(如数据库)。但需配合vm.overcommit_ratio使用。vm.swappiness = 10:降低交换分区的使用频率,优先使用物理内存,提升响应速度。vm.dirty_ratio和vm.dirty_background_ratio:减少脏页堆积,避免 I/O 阻塞。
1.2 网络性能优化
问题场景:高并发网络服务(如 Nginx、Redis)出现连接超时或丢包。
解决方案:优化 TCP 栈参数。
# 编辑 /etc/sysctl.d/99-network.conf
# 1. 增大 TCP 最大连接数
net.core.somaxconn = 65535
# 2. 增大 TCP 接收和发送缓冲区
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
# 3. 启用 TCP 时间戳(用于 RTT 估算和防止序列号回绕)
net.ipv4.tcp_timestamps = 1
# 4. 启用 TCP SACK(Selective Acknowledgment)和 DSACK
net.ipv4.tcp_sack = 1
net.ipv4.tcp_dsack = 1
# 5. 增大端口范围
net.ipv4.ip_local_port_range = 1024 65535
# 6. 启用 TIME_WAIT sockets 的快速回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # 注意:在 NAT 环境下可能有问题,建议关闭
# 7. 增大 nf_conntrack 表大小(如果使用 iptables)
net.netfilter.nf_conntrack_max = 1000000
# 应用配置
sysctl -p /etc/sysctl.d/99-network.conf
详细说明:
somaxconn:定义了监听队列的最大长度,对于高并发服务,必须增大。tcp_tw_reuse:允许重用 TIME_WAIT 状态的套接字,减少端口耗尽。nf_conntrack_max:如果服务器作为防火墙或 NAT 网关,必须增大连接跟踪表,否则会丢包。
二、文件系统优化:选择与调整
文件系统的选择和挂载参数直接影响 I/O 性能。AlmaLinux 默认使用 XFS,但在特定场景下,ext4 或 Btrfs 可能更合适。
2.1 挂载参数优化
场景:数据库(如 MySQL)需要高性能的随机读写。
解决方案:调整挂载参数,禁用 atime 更新,启用 noatime 和 nodiratime。
# 编辑 /etc/fstab
# 原始行可能如下:
# /dev/mapper/vg0-lv_data /data xfs defaults 0 0
# 优化后:
/dev/mapper/vg0-lv_data /data xfs noatime,nodiratime,logbufs=8,logbsize=256k 0 0
详细说明:
noatime:禁止更新文件访问时间,减少写操作。nodiratime:禁止更新目录访问时间。logbufs=8和logbsize=256k:针对 XFS,增大日志缓冲区,提升元数据操作性能。
2.2 I/O 调度器选择
场景:SSD 硬盘需要低延迟的 I/O 调度。
解决方案:将 I/O 调度器改为 none 或 mq-deadline。
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 输出示例:[mq-deadline] kyber bfq none
# 临时修改
echo none > /sys/block/sda/queue/scheduler
# 永久修改(使用 udev 规则)
cat > /etc/udev/rules.d/60-ioscheduler.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="none"
EOF
三、资源限制与控制:cgroups 和 systemd
在企业环境中,多租户或微服务场景下,需要限制某些进程的资源使用,防止“吵闹邻居”问题。
3.1 使用 systemd 控制资源
场景:限制一个 Java 应用的内存使用,防止 OOM。
解决方案:使用 systemd 的资源限制功能。
# 创建服务文件 /etc/systemd/system/myapp.service
[Unit]
Description=My High Memory App
After=network.target
[Service]
Type=simple
User=myapp
ExecStart=/usr/bin/java -Xmx4g -jar /opt/myapp.jar
# 限制内存使用(软限制 4G,硬限制 5G)
MemoryLimit=4G
MemoryHigh=5G
# 限制 CPU 使用(最多使用 2 个 CPU 核心)
CPUQuota=200%
# 限制进程数
TasksMax=500
[Install]
WantedBy=multi-user.target
详细说明:
MemoryLimit:绝对上限,超过会被 OOM 杀死。MemoryHigh:软限制,超过后会触发内存回收,但不会杀死进程。CPUQuota:百分比表示核心数,200% 表示最多使用 2 核。
3.2 使用 cgroups v2 手动限制
场景:临时限制某个脚本的资源。
# 挂载 cgroup v2(如果未挂载)
mount -t cgroup2 none /sys/fs/cgroup
# 创建子组
mkdir /sys/fs/cgroup/myapp
cd /sys/fs/cgroup/myapp
# 设置内存限制(1GB)
echo 1G > memory.max
# 将当前 shell 加入组
echo $$ > cgroup.procs
# 运行脚本(将自动受限制)
./heavy_script.sh
四、网络性能深度优化
除了 sysctl,网络设备本身的配置也至关重要。
4.1 中断亲和性(IRQ Affinity)
场景:多核 CPU 下,网络中断集中在单核,导致瓶颈。
解决方案:将网卡中断分散到多个 CPU 核心。
# 查看网卡中断
cat /proc/interrupts | grep eth0
# 安装 irqbalance(自动平衡中断)
dnf install irqbalance -y
systemctl enable --now irqbalance
# 或者手动设置(以 eth0 为例)
# 假设中断号为 100-107
for i in {100..107}; do
echo 2 > /proc/irq/$i/smp_affinity_list # 分配到 CPU2
done
详细说明:
- 手动设置需要根据实际中断号和 CPU 核心数调整。
smp_affinity_list使用 CPU 逻辑编号,例如2表示 CPU2。
4.2 RSS(Receive Side Scaling)配置
场景:单队列网卡无法利用多核 CPU。
解决方案:启用网卡多队列。
# 查看当前队列数
ethtool -l eth0
# 设置队列数(假设最大支持 8)
ethtool -L eth0 combined 8
# 调整队列长度
ethtool -G eth0 rx 4096 tx 4096
五、监控与调优工具:数据驱动的优化
没有监控的优化是盲目的。AlmaLinux 提供了强大的工具链。
5.1 perf:性能剖析神器
场景:找出 CPU 使用率高的原因。
# 安装 perf
dnf install perf -y
# 记录 10 秒的 CPU 事件
perf record -g -p <PID> sleep 10
# 生成报告
perf report
输出示例:
Overhead Command Shared Object Symbol
15.23% java libjvm.so [.] Interpreter
10.50% nginx nginx [.] ngx_http_process_request
5.2 vmstat 和 iostat:快速诊断
# 每秒输出一次,重点关注 r(运行队列)、b(阻塞)、si/so(交换分区)
vmstat 1
# 查看磁盘 I/O,重点关注 %util 和 await
iostat -x 1
解读:
vmstat中r列持续大于 CPU 核心数,说明 CPU 不足。iostat中%util接近 100% 且await很高,说明磁盘瓶颈。
六、综合案例:优化 Nginx Web 服务器
假设我们有一台 AlmaLinux 服务器运行 Nginx,面临高并发下的性能瓶颈。
6.1 步骤 1:内核参数调整
应用上述的 99-network.conf 和 99-memory.conf。
6.2 步骤 2:Nginx 配置优化
# /etc/nginx/nginx.conf
worker_processes auto; # 自动设置为 CPU 核心数
worker_connections 65535; # 每个 worker 的最大连接数
worker_rlimit_nofile 65535; # worker 进程能打开的最大文件数
events {
use epoll; # Linux 高性能事件模型
multi_accept on; # 一次接受多个连接
}
http {
sendfile on; # 启用 sendfile,减少内核态和用户态的拷贝
tcp_nopush on; # 提高发送效率
tcp_nodelay on; # 禁用 Nagle 算法,减少延迟
keepalive_timeout 65; # 保持连接时间
keepalive_requests 10000; # 单个连接最大请求数
}
6.3 步骤 3:系统限制调整
# 修改 limits.conf
cat >> /etc/security/limits.conf <<EOF
* soft nofile 65535
* hard nofile 65535
nginx soft nproc 65535
nginx hard nproc 65535
EOF
# 修改 systemd 服务文件(如果使用 systemd 启动)
# 在 [Service] 部分添加
LimitNOFILE=65535
6.4 步骤 4:验证与压测
使用 ab 或 wrk 进行压测:
# 安装 httpd-tools
dnf install httpd-tools -y
# 100 并发,10000 请求
ab -n 10000 -c 100 http://localhost/
预期结果:Requests per second 应显著提升,且 99% 的请求延迟在 100ms 以内。
七、总结
AlmaLinux 的性能优化是一个系统工程,涉及内核、文件系统、网络和应用层。通过本文的策略,您可以:
- 精准调整内核参数:解决内存和网络瓶颈。
- 优化资源分配:利用 systemd 和 cgroups 实现精细化控制。
- 科学监控:使用 perf 和 vmstat 定位问题。
记住,优化前务必备份配置,并在测试环境验证。性能优化没有银弹,只有根据实际业务场景不断调整,才能实现极速稳定的运行。
