引言:为什么需要优化 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_ratio 和 vm.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 进程优先级调整
使用 nice 和 renice 调整进程优先级,确保关键业务获得更高 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 性能优化原则
- 测量优先:在优化前先测量当前性能,建立基准
- 小步快跑:每次只调整一个参数,观察效果
- 理解原理:不要盲目复制参数,要理解其作用
- 平衡安全与性能:某些优化可能降低安全性
- 持续监控:优化不是一次性工作,需要持续监控和调整
通过系统性地应用这些优化策略,AlmaLinux 服务器的性能可以得到显著提升。记住,优化是一个持续的过程,需要根据实际负载和业务需求不断调整。建议建立性能基线,定期进行基准测试,并根据监控数据进行针对性优化。
