AlmaLinux 作为 CentOS 的直接替代品,继承了 RHEL 的稳定性和企业级特性。对于追求极致性能的服务器环境,系统层面的优化至关重要。本文将从内核参数调整、文件系统优化、资源调度策略等多个维度,提供一套完整的实战指南。
一、 性能优化前的准备工作:基准测试与监控
在开始任何优化之前,建立性能基线是至关重要的。没有测量,就无法改进。
1.1 安装必要的监控工具
# 安装 sysstat (包含 sar, iostat, mpstat 等)
sudo dnf install sysstat -y
# 安装性能分析工具
sudo dnf install perf -y
# 安装网络监控工具
sudo dnf install nload iftop -y
# 启用 sysstat 服务并启动
sudo systemctl enable sysstat
sudo systemctl start sysstat
1.2 建立性能基线
在优化前,运行以下命令收集系统状态:
# 查看系统整体负载
uptime
# 查看内存使用情况
free -h
# 查看磁盘 I/O 统计
iostat -x 1 5
# 查看 CPU 详细信息
lscpu
# 查看网络接口统计
sar -n DEV 1 5
示例: 假设你的应用是数据库服务器,记录优化前的 iostat 输出:
avg-cpu: %user %nice %system %iowait %steal %idle
5.21 0.00 2.15 8.45 0.00 84.19
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz %util
sda 12.34 45.67 123.45 567.89 0.00 0.00 0.00 0.00 0.45 0.78 0.23 5.67
这里可以看到 iowait 较高(8.45%),%util 为 5.67%,表明磁盘 I/O 可能是瓶颈。
二、 内核参数深度优化
AlmaLinux 使用 Linux 内核,其参数通过 sysctl 进行动态调整。优化前请务必备份 /etc/sysctl.conf。
2.1 内存管理优化
问题场景: 应用频繁申请和释放内存,导致系统频繁进行内存回收,产生大量 CPU 开销。
优化参数:
# 编辑 sysctl 配置文件
sudo vi /etc/sysctl.conf
# 添加以下内容
# 1. 调整虚拟内存参数,减少不必要的交换
vm.swappiness = 10 # 默认值60,降低对交换分区的依赖
# 2. 优化内存回收策略
vm.vfs_cache_pressure = 50 # 默认值100,降低文件系统缓存回收压力
# 3. 调整脏页写回策略
vm.dirty_ratio = 15 # 系统内存中脏页占比超过15%时,开始同步写回
vm.dirty_background_ratio = 5 # 后台进程开始写回脏页的阈值
# 4. 调整内存过量使用策略
vm.overcommit_memory = 2 # 严格模式,禁止过度分配内存
vm.overcommit_ratio = 80 # 允许分配的内存占物理内存的比例
应用配置:
# 立即生效(无需重启)
sudo sysctl -p
# 验证设置
sysctl vm.swappiness
原理说明:
vm.swappiness=10:降低系统使用交换分区的倾向,优先使用物理内存,减少磁盘 I/O。vm.vfs_cache_pressure=50:保留更多文件系统缓存,提升文件读取性能。vm.dirty_ratio和vm.dirty_background_ratio:平衡内存使用和磁盘 I/O,避免突发性大量写操作导致系统卡顿。
2.2 网络性能优化
问题场景: 高并发网络服务(如 Web 服务器、负载均衡器)遇到连接数限制或丢包。
优化参数:
# 编辑 sysctl 配置文件
sudo vi /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_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # 在 NAT 环境下需谨慎,通常设为0
# 4. 增加文件描述符限制
fs.file-max = 2097152
# 5. 调整 TIME_WAIT 状态超时时间(秒)
net.ipv4.tcp_fin_timeout = 30
应用配置:
sudo sysctl -p
示例验证:
# 查看当前 TCP 连接状态
ss -s
# 查看当前连接队列
ss -lnt | grep LISTEN
# 测试网络吞吐量(使用 iperf3)
# 服务端
iperf3 -s
# 客户端
iperf3 -c <server_ip> -t 10 -P 10
2.3 磁盘 I/O 优化
问题场景: 数据库或文件服务器磁盘读写延迟高。
优化参数:
# 编辑 sysctl 配置文件
sudo vi /etc/sysctl.conf
# 添加以下内容
# 1. 调整 I/O 调度器(需在启动参数中设置,见下文)
# 2. 调整内核 I/O 队列深度
fs.aio-max-nr = 1048576
fs.aio-nr = 0
# 3. 调整文件系统缓存相关参数
vm.dirty_expire_centisecs = 3000 # 脏页过期时间(30秒)
vm.dirty_writeback_centisecs = 500 # 后台写回间隔(5秒)
I/O 调度器选择:
- none/noop:适用于 NVMe SSD,无调度,直接提交。
- deadline:适用于混合读写,保证读写延迟。
- cfq:适用于多进程公平调度(默认)。
- kyber:适用于高速存储,提供低延迟。
查看和设置 I/O 调度器:
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 临时修改(重启失效)
echo noop > /sys/block/sda/queue/scheduler
# 永久修改(通过内核启动参数)
# 编辑 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="... elevator=noop"
# 更新 GRUB
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
三、 文件系统优化
3.1 XFS 文件系统优化(推荐用于 AlmaLinux)
XFS 是 AlmaLinux 的默认文件系统,特别适合大文件和高并发场景。
创建优化后的 XFS 文件系统:
# 查看当前挂载选项
mount | grep xfs
# 重新挂载并优化(临时)
mount -o remount,noatime,nodiratime,logbufs=8,logbsize=256k /data
# 永久修改 /etc/fstab
# 原行:/dev/sdb1 /data xfs defaults 0 0
# 修改为:
/dev/sdb1 /data xfs noatime,nodiratime,logbufs=8,logbsize=256k 0 0
参数说明:
noatime:不更新文件访问时间,减少写操作。nodiratime:不更新目录访问时间。logbufs=8:增加日志缓冲区数量(默认2)。logbsize=256k:增加日志缓冲区大小(默认256k)。
3.2 EXT4 文件系统优化(如果使用)
# 查看当前挂载选项
mount | grep ext4
# 优化挂载选项(临时)
mount -o remount,noatime,data=writeback,barrier=0 /data
# 永久修改 /etc/fstab
/dev/sdb1 /data ext4 noatime,data=writeback,barrier=0 0 0
参数说明:
data=writeback:写回模式,提升写性能(牺牲一点数据安全性)。barrier=0:禁用写屏障(仅在 UPS 保护下使用)。
四、 资源调度策略优化
4.1 CPU 调度器优化
AlmaLinux 默认使用 CFS(完全公平调度器),适用于大多数场景。但对于特定负载,可以调整。
查看当前调度器:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
常见调度器:
performance:始终运行在最高频率,适合计算密集型任务。powersave:始终运行在最低频率,适合节能。ondemand:根据负载动态调整频率(默认)。userspace:允许用户空间程序控制频率。
设置为性能模式(针对计算密集型服务器):
# 安装 cpupower 工具
sudo dnf install cpupower-utils -y
# 设置所有 CPU 为 performance 模式
sudo cpupower frequency-set -g performance
# 永久设置(创建 systemd 服务)
sudo vi /etc/systemd/system/cpupower.service
[Unit]
Description=CPU Power Management
[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set -g performance
[Install]
WantedBy=multi-user.target
sudo systemctl enable cpupower.service
sudo systemctl start cpupower.service
4.2 使用 cgroups 进行资源隔离
对于运行多个服务的服务器,使用 cgroups 可以防止一个服务耗尽所有资源。
安装 cgroup 工具:
sudo dnf install libcgroup-tools -y
示例:限制 Nginx 进程的 CPU 和内存使用
- 创建 cgroup:
# 创建 CPU 和内存子系统的 cgroup
sudo cgcreate -g cpu,memory:/nginx_limit
# 设置 CPU 使用上限(50% 单核)
sudo cgset -r cpu.cfs_quota_us=50000 nginx_limit
sudo cgset -r cpu.cfs_period_us=100000 nginx_limit
# 设置内存上限(2GB)
sudo cgset -r memory.limit_in_bytes=2G nginx_limit
sudo cgset -r memory.memsw.limit_in_bytes=2G nginx_limit
- 将 Nginx 进程加入 cgroup:
# 启动 Nginx 并加入 cgroup
sudo cgexec -g cpu,memory:nginx_limit /usr/sbin/nginx
# 或者将现有进程加入
sudo cgclassify -g cpu,memory:nginx_limit <nginx_pid>
- 验证限制:
# 查看 cgroup 统计
sudo cgget -g cpu,memory:nginx_limit cpu.stat
sudo cgget -g cpu,memory:nginx_limit memory.stat
# 使用 top 查看进程的 CPU 使用率
top -p <nginx_pid>
五、 应用层优化建议
5.1 数据库优化(以 MySQL 为例)
配置文件优化 (/etc/my.cnf):
[mysqld]
# 内存相关
innodb_buffer_pool_size = 70% of total RAM # 例如 16GB RAM 设置为 11G
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 2 # 平衡性能和数据安全
# 连接相关
max_connections = 500
thread_cache_size = 50
# 查询缓存(MySQL 8.0 已移除,5.7 可用)
# query_cache_type = 1
# query_cache_size = 64M
5.2 Web 服务器优化(以 Nginx 为例)
配置文件优化 (/etc/nginx/nginx.conf):
worker_processes auto; # 自动设置为 CPU 核心数
worker_connections 1024; # 每个 worker 的最大连接数
# 事件模型
events {
use epoll; # 高效的 I/O 模型
worker_connections 1024;
}
http {
# 缓冲区优化
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
# 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;
}
六、 持续监控与调优
性能优化是一个持续的过程,需要定期监控和调整。
6.1 使用 Prometheus + Grafana 监控
# 安装 Prometheus (以 Docker 为例)
docker run -d \
--name prometheus \
-p 9090:9090 \
-v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
# 安装 Grafana
docker run -d \
--name grafana \
-p 3000:3000 \
grafana/grafana
Prometheus 配置示例 (prometheus.yml):
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100'] # Node Exporter
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104'] # MySQL Exporter
6.2 自动化调优脚本示例
#!/bin/bash
# performance_tuner.sh - 自动性能调优脚本
# 备份原始配置
cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d)
# 应用优化参数
cat >> /etc/sysctl.conf << EOF
# Performance Tuning
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
fs.file-max = 2097152
EOF
# 应用配置
sysctl -p
# 设置 CPU 为性能模式
if command -v cpupower &> /dev/null; then
cpupower frequency-set -g performance
fi
# 设置 I/O 调度器为 noop (针对 SSD)
for disk in $(lsblk -d -o NAME | grep -v NAME); do
if [ -e "/sys/block/$disk/queue/scheduler" ]; then
echo noop > "/sys/block/$disk/queue/scheduler"
fi
done
echo "Performance tuning completed. Please monitor system performance."
七、 总结
AlmaLinux 的性能优化是一个系统工程,需要从内核参数、文件系统、资源调度到应用配置进行全方位调整。关键要点:
- 测量先行:始终在优化前建立性能基线。
- 逐步调整:一次只调整一个参数,观察效果。
- 监控持续:使用工具持续监控系统状态。
- 安全平衡:性能优化不能以牺牲数据安全为代价。
通过本文提供的实战指南,你可以系统地优化 AlmaLinux 服务器,使其在特定工作负载下发挥最佳性能。记住,没有“一刀切”的优化方案,最佳配置取决于你的具体应用场景和硬件环境。
