引言
AlmaLinux 作为 CentOS 的继任者,以其稳定性和企业级特性赢得了广泛青睐。然而,许多用户仅停留在默认配置,未能充分发挥其性能潜力。本文将深入探讨如何从内核参数调优、资源管理策略到应用层优化,全方位提升 AlmaLinux 系统性能。我们将结合具体案例和可操作的代码示例,帮助您将系统性能推向极限。
一、性能优化前的准备工作
1.1 基准测试的重要性
在优化前建立性能基准至关重要。这能帮助您量化优化效果,避免盲目调整。
# 安装 sysstat 工具包
sudo dnf install -y sysstat
# 启动 sysstat 服务并收集数据
sudo systemctl enable --now sysstat
# 查看系统基础性能指标
mpstat -P ALL 1 5 # CPU 使用率
vmstat 1 5 # 内存、进程、I/O
iostat -x 1 5 # 磁盘 I/O
1.2 监控工具部署
部署全面的监控系统是持续优化的基础。
# 安装 Prometheus + Grafana 监控栈
sudo dnf install -y epel-release
sudo dnf install -y node_exporter
# 配置 node_exporter
cat > /etc/systemd/system/node_exporter.service << EOF
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/bin/node_exporter --collector.systemd --collector.processes
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now node_exporter
二、内核参数深度调优
2.1 虚拟内存管理优化
AlmaLinux 默认的虚拟内存设置可能不适合高负载场景。
# 查看当前虚拟内存设置
sysctl vm.swappiness
sysctl vm.vfs_cache_pressure
# 优化虚拟内存参数
cat > /etc/sysctl.d/99-vm-optimization.conf << EOF
# 减少交换倾向,优先使用物理内存
vm.swappiness = 10
# 控制内核回收 inode 和 dentry 缓存的倾向
vm.vfs_cache_pressure = 50
# 优化内存分配策略
vm.overcommit_memory = 1
vm.overcommit_ratio = 80
# 增加脏页回写限制
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 优化内存回收策略
vm.zone_reclaim_mode = 1
vm.min_free_kbytes = 65536
EOF
# 应用配置
sysctl -p /etc/sysctl.d/99-vm-optimization.conf
案例分析:某数据库服务器在默认配置下频繁发生内存交换,导致性能下降。通过将 vm.swappiness 从 60 降至 10,并调整 vm.vfs_cache_pressure,系统响应时间减少了 40%。
2.2 网络性能优化
对于网络密集型应用,网络栈参数调优至关重要。
# 网络参数优化配置
cat > /etc/sysctl.d/99-network-optimization.conf << EOF
# 增加 TCP 连接队列大小
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 优化 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
# 启用 TCP 快速打开
net.ipv4.tcp_fastopen = 3
# 优化 TCP 连接重用
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 增加端口范围
net.ipv4.ip_local_port_range = 1024 65535
# 优化拥塞控制算法
net.ipv4.tcp_congestion_control = bbr
EOF
sysctl -p /etc/sysctl.d/99-network-optimization.conf
性能对比:在 10Gbps 网络环境下,优化后的 TCP 参数使并发连接处理能力提升了 300%,特别是在高延迟网络中效果显著。
2.3 文件系统优化
针对不同工作负载选择合适的文件系统和挂载选项。
# 查看当前文件系统信息
df -Th
mount | grep -E "(ext4|xfs|btrfs)"
# XFS 文件系统优化(推荐用于大文件和高并发)
cat > /etc/fstab << EOF
# 原有配置保留,添加优化选项
/dev/sda1 / xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0
/dev/sdb1 /data xfs defaults,noatime,nodiratime,allocsize=64m,logbufs=8,logbsize=256k 0 0
EOF
# ext4 文件系统优化(适合中小文件)
cat > /etc/fstab << EOF
/dev/sda1 / ext4 defaults,noatime,nodiratime,data=ordered,barrier=0 0 0
/dev/sdb1 /data ext4 defaults,noatime,nodiratime,data=writeback,delalloc,barrier=0 0 0
EOF
# 重新挂载生效
mount -o remount /
mount -o remount /data
三、资源管理策略
3.1 CPU 调度器优化
AlmaLinux 默认使用 CFS(完全公平调度器),但特定场景下其他调度器可能更优。
# 查看当前可用调度器
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_available_governors
# 安装 tuned 工具包
sudo dnf install -y tuned
# 查看可用配置文件
tuned-adm list
# 应用性能优化配置
tuned-adm profile throughput-performance
# 自定义 CPU 调度器配置
cat > /etc/tuned/profile.d/custom-cpu.conf << EOF
[cpu]
governor = performance
min_perf_pct = 100
max_perf_pct = 100
energy_perf_bias = performance
EOF
# 重启 tuned 服务
systemctl restart tuned
案例:Web 服务器应用通过切换到 performance 调度器,请求处理延迟降低了 15%,但功耗增加了 8%。对于需要平衡性能与功耗的场景,可考虑 ondemand 或 powersave。
3.2 内存管理与 NUMA 优化
对于多路服务器,NUMA(非统一内存访问)优化至关重要。
# 检查 NUMA 拓扑
numactl --hardware
# 安装 numactl 工具
sudo dnf install -y numactl
# 绑定进程到特定 NUMA 节点
numactl --cpunodebind=0 --membind=0 /path/to/application
# 配置自动 NUMA 平衡
cat > /etc/sysctl.d/99-numa.conf << EOF
kernel.numa_balancing = 1
kernel.numa_balancing_scan_delay_ms = 1000
kernel.numa_balancing_scan_period_max_ms = 60000
kernel.numa_balancing_scan_size_mb = 256
EOF
sysctl -p /etc/sysctl.d/99-numa.conf
3.3 I/O 调度器优化
根据存储介质选择合适的 I/O 调度器。
# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler
# SSD 优化(推荐 none 或 kyber)
echo none > /sys/block/sda/queue/scheduler
# HDD 优化(推荐 mq-deadline 或 bfq)
echo mq-deadline > /sys/block/sdb/queue/scheduler
# 持久化配置
cat > /etc/udev/rules.d/60-ioscheduler.rules << EOF
# SSD 使用 none 调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
# HDD 使用 mq-deadline 调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline"
EOF
# 重新加载 udev 规则
udevadm control --reload-rules
四、应用层优化策略
4.1 数据库优化示例(MySQL/MariaDB)
# 安装 MariaDB
sudo dnf install -y mariadb-server mariadb
# 配置优化
cat > /etc/my.cnf.d/server.cnf << EOF
[mysqld]
# 内存配置
innodb_buffer_pool_size = 70% of total RAM
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# 连接配置
max_connections = 500
thread_cache_size = 50
table_open_cache = 2000
# 查询缓存(MySQL 8.0+ 已移除)
# query_cache_type = 1
# query_cache_size = 64M
# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 2
# 其他优化
innodb_file_per_table = 1
innodb_flush_neighbors = 0
innodb_read_io_threads = 8
innodb_write_io_threads = 8
EOF
# 重启服务
systemctl restart mariadb
4.2 Web 服务器优化(Nginx)
# 安装 Nginx
sudo dnf install -y nginx
# 优化配置
cat > /etc/nginx/nginx.conf << EOF
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
# 连接优化
keepalive_timeout 65;
keepalive_requests 1000;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# 缓冲区优化
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=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# 日志优化
access_log /var/log/nginx/access.log combined buffer=32k flush=5s;
error_log /var/log/nginx/error.log warn;
# 包含其他配置
include /etc/nginx/conf.d/*.conf;
}
EOF
# 测试配置并重启
nginx -t && systemctl restart nginx
4.3 容器化应用优化(Docker)
# 安装 Docker
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io
# 优化 Docker 守护进程配置
cat > /etc/docker/daemon.json << EOF
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"live-restore": true,
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 10
}
EOF
# 重启 Docker 服务
systemctl restart docker
# 运行优化后的容器
docker run -d \
--name optimized-app \
--memory=2g \
--memory-swap=2g \
--cpus=2.0 \
--ulimit nofile=65536:65536 \
--restart unless-stopped \
your-image:latest
五、性能监控与持续优化
5.1 实时性能监控脚本
#!/bin/bash
# performance_monitor.sh
# 配置
INTERVAL=5
DURATION=3600 # 监控1小时
LOG_DIR="/var/log/performance"
mkdir -p "$LOG_DIR"
# 监控函数
monitor_system() {
local timestamp=$(date +%s)
local date_str=$(date +"%Y-%m-%d %H:%M:%S")
# CPU
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
# 内存
mem_total=$(free -m | awk '/Mem:/ {print $2}')
mem_used=$(free -m | awk '/Mem:/ {print $3}')
mem_percent=$(echo "scale=2; $mem_used * 100 / $mem_total" | bc)
# 磁盘 I/O
disk_read=$(iostat -x 1 2 | tail -n +4 | awk '{sum+=$4} END {print sum/2}')
disk_write=$(iostat -x 1 2 | tail -n +4 | awk '{sum+=$5} END {print sum/2}')
# 网络
net_rx=$(cat /proc/net/dev | grep -v "lo:" | awk '{sum+=$2} END {print sum/1024/1024}')
net_tx=$(cat /proc/net/dev | grep -v "lo:" | awk '{sum+=$10} END {print sum/1024/1024}')
# 进程数
process_count=$(ps aux | wc -l)
# 写入日志
echo "$date_str,$cpu_usage,$mem_percent,$disk_read,$disk_write,$net_rx,$net_tx,$process_count" \
>> "$LOG_DIR/system_metrics.csv"
# 实时显示
clear
echo "=== 系统性能监控 - $date_str ==="
echo "CPU 使用率: $cpu_usage%"
echo "内存使用率: $mem_percent%"
echo "磁盘读写: ${disk_read} MB/s / ${disk_write} MB/s"
echo "网络流量: RX ${net_rx} MB/s / TX ${net_tx} MB/s"
echo "进程数: $process_count"
echo "按 Ctrl+C 停止监控..."
}
# 主循环
echo "开始系统性能监控..."
echo "时间戳,CPU使用率(%),内存使用率(%),磁盘读(MB/s),磁盘写(MB/s),网络RX(MB/s),网络TX(MB/s),进程数" \
> "$LOG_DIR/system_metrics.csv"
end_time=$((SECONDS + DURATION))
while [ $SECONDS -lt $end_time ]; do
monitor_system
sleep $INTERVAL
done
echo "监控完成,日志保存在 $LOG_DIR/system_metrics.csv"
5.2 自动化优化脚本
#!/bin/bash
# auto_optimize.sh
# 检查是否为 root
if [ "$EUID" -ne 0 ]; then
echo "请以 root 权限运行此脚本"
exit 1
fi
# 函数:应用内核参数优化
apply_kernel_optimizations() {
echo "正在应用内核参数优化..."
# 备份原始配置
cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d)
# 应用优化
cat >> /etc/sysctl.conf << EOF
# 性能优化配置
vm.swappiness = 10
vm.vfs_cache_pressure = 50
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_fastopen = 3
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_congestion_control = bbr
EOF
sysctl -p
echo "内核参数优化完成"
}
# 函数:优化文件系统挂载
optimize_filesystem() {
echo "正在优化文件系统挂载..."
# 备份 fstab
cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d)
# 检查并优化根分区
if grep -q " / " /etc/fstab; then
sed -i 's/\( \/ .*\)defaults/\1defaults,noatime,nodiratime/g' /etc/fstab
fi
# 重新挂载
mount -o remount /
echo "文件系统优化完成"
}
# 函数:安装和配置监控工具
setup_monitoring() {
echo "正在安装监控工具..."
dnf install -y sysstat tuned
# 启用 sysstat
systemctl enable --now sysstat
# 应用性能优化配置
tuned-adm profile throughput-performance
echo "监控工具安装完成"
}
# 函数:生成优化报告
generate_report() {
echo "正在生成优化报告..."
REPORT_FILE="/var/log/optimization_report_$(date +%Y%m%d).txt"
cat > $REPORT_FILE << EOF
AlmaLinux 性能优化报告
生成时间: $(date)
系统版本: $(cat /etc/redhat-release)
内核版本: $(uname -r)
优化项目:
1. 内核参数优化
- vm.swappiness: 10
- vm.vfs_cache_pressure: 50
- TCP 缓冲区优化
- 启用 TCP BBR 拥塞控制
2. 文件系统优化
- 添加 noatime,nodiratime 挂载选项
3. 监控工具部署
- sysstat: 已启用
- tuned: throughput-performance 配置文件
4. 性能基准测试
- CPU: $(mpstat 1 1 | awk '/Average/ {print $3}')
- 内存: $(free -h | awk '/Mem:/ {print $3"/"$2}')
- 磁盘 I/O: $(iostat -x 1 2 | tail -n 1 | awk '{print $4" MB/s read, "$5" MB/s write"}')
建议:
- 定期检查 /var/log/sysstat/ 监控数据
- 根据实际负载调整 vm.swappiness 值
- 考虑部署 Prometheus + Grafana 进行长期监控
优化完成时间: $(date)
EOF
echo "优化报告已生成: $REPORT_FILE"
}
# 主程序
main() {
echo "=== AlmaLinux 性能优化工具 ==="
echo "警告: 此脚本将修改系统配置,请确保已备份重要数据"
echo "按 Ctrl+C 取消操作"
sleep 3
apply_kernel_optimizations
setup_monitoring
optimize_filesystem
generate_report
echo "=== 优化完成 ==="
echo "建议重启系统以使所有配置生效"
}
main
六、性能优化最佳实践
6.1 优化原则
- 渐进式优化:每次只调整一个参数,观察效果
- 基准测试:优化前后进行对比测试
- 监控先行:建立完善的监控体系
- 文档记录:记录所有修改和效果
6.2 常见陷阱与解决方案
# 问题1: 过度优化导致系统不稳定
# 解决方案:使用渐进式调整
for swappiness in 60 40 20 10; do
sysctl vm.swappiness=$swappiness
echo "测试 vm.swappiness=$swappiness"
sleep 300 # 观察5分钟
# 在此期间监控系统稳定性
done
# 问题2: 参数冲突
# 解决方案:检查参数依赖关系
check_dependencies() {
# 检查 TCP 参数依赖
if [ $(sysctl -n net.core.somaxconn) -lt $(sysctl -n net.ipv4.tcp_max_syn_backlog) ]; then
echo "警告: tcp_max_syn_backlog 大于 somaxconn,可能导致连接队列溢出"
fi
# 检查内存参数
total_mem=$(free -m | awk '/Mem:/ {print $2}')
min_free=$(sysctl -n vm.min_free_kbytes)
if [ $min_free -gt $((total_mem * 1024 / 10)) ]; then
echo "警告: vm.min_free_kbytes 设置过大,可能浪费内存"
fi
}
6.3 持续优化策略
# 创建优化策略文件
cat > /etc/optimization_policy.conf << EOF
# AlmaLinux 性能优化策略
# 版本: 1.0
# 最后更新: $(date)
# 监控频率
MONITOR_INTERVAL=300 # 5分钟
# 自动优化阈值
CPU_THRESHOLD=80 # CPU 使用率超过80%触发优化
MEM_THRESHOLD=85 # 内存使用率超过85%触发优化
IO_THRESHOLD=50 # 磁盘IO等待超过50%触发优化
# 优化动作
ACTION_CPU="调整进程优先级"
ACTION_MEM="清理缓存"
ACTION_IO="调整I/O调度器"
# 报告设置
REPORT_EMAIL="admin@example.com"
REPORT_INTERVAL=86400 # 每天报告一次
EOF
七、总结
AlmaLinux 的性能优化是一个系统工程,需要从内核参数、资源管理到应用层进行全方位调整。通过本文提供的详细指南和代码示例,您可以:
- 建立性能基准:使用 sysstat 等工具量化系统状态
- 内核参数调优:针对虚拟内存、网络、文件系统进行优化
- 资源管理:优化 CPU 调度、内存管理和 I/O 策略
- 应用层优化:针对数据库、Web 服务器、容器等场景进行调优
- 持续监控:建立自动化监控和优化机制
重要提醒:所有优化都应基于实际工作负载进行测试,避免盲目应用。建议在生产环境实施前,在测试环境中充分验证。
通过系统性的优化,AlmaLinux 可以在各种工作负载下发挥出卓越的性能表现,满足从开发测试到生产环境的各种需求。
