引言
AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。性能优化是确保系统高效运行的关键,尤其在高负载场景下。本文将从内核调优、资源管理、文件系统优化等多个维度,提供一套完整的实战指南,帮助您系统化地提升 AlmaLinux 的性能。
一、性能优化前的准备工作
1.1 系统监控与基准测试
在优化前,必须了解当前系统的性能瓶颈。常用的监控工具包括:
- top/htop:实时查看进程资源占用。
- vmstat:监控虚拟内存统计。
- iostat:监控磁盘 I/O。
- netstat/ss:监控网络连接。
- sar:系统活动报告(需安装 sysstat 包)。
示例:安装并使用 sysstat
# 安装 sysstat
sudo dnf install -y sysstat
# 启用 sysstat 服务(每10分钟收集一次数据)
sudo systemctl enable --now sysstat
# 查看历史数据(例如,查看昨天的 CPU 使用率)
sar -u -f /var/log/sa/sa$(date -d "yesterday" +%d)
1.2 基准测试工具
- CPU:
sysbench、stress-ng - 内存:
sysbench、mbw - 磁盘 I/O:
fio、iozone - 网络:
iperf3、netperf
示例:使用 sysbench 测试 CPU
# 安装 sysbench
sudo dnf install -y sysbench
# 测试 CPU 性能(计算素数,10000 个)
sysbench cpu --cpu-max-prime=10000 run
二、内核参数调优
2.1 调整虚拟内存参数
虚拟内存参数直接影响系统内存管理效率。常用参数包括:
vm.swappiness:控制内核使用交换空间的倾向(0-100,默认60)。vm.vfs_cache_pressure:控制内核回收 inode 和 dentry 缓存的倾向(默认100)。vm.dirty_ratio和vm.dirty_background_ratio:控制脏页写入磁盘的阈值。
示例:临时调整参数
# 临时设置 swappiness 为 10(减少交换)
echo 10 > /proc/sys/vm/swappiness
# 临时设置 vfs_cache_pressure 为 50(更积极地保留缓存)
echo 50 > /proc/sys/vm/vfs_cache_pressure
永久生效配置:
编辑 /etc/sysctl.conf 文件,添加以下内容:
# /etc/sysctl.conf
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
执行 sysctl -p 使配置生效。
2.2 网络参数调优
对于高并发网络服务器,调整 TCP 参数至关重要:
net.core.somaxconn:最大连接队列长度。net.ipv4.tcp_max_syn_backlog:SYN 队列长度。net.ipv4.tcp_tw_reuse:允许 TIME_WAIT 状态的套接字重用。net.ipv4.tcp_fin_timeout:TIME_WAIT 状态的超时时间。
示例:优化 Web 服务器网络参数
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
2.3 文件系统相关参数
fs.file-max:系统可打开的最大文件数。fs.nr_open:每个进程可打开的最大文件数。
示例:调整文件句柄限制
# /etc/sysctl.conf
fs.file-max = 2097152
fs.nr_open = 2097152
同时,需要调整用户级限制(/etc/security/limits.conf):
# /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
root soft nofile 1048576
root hard nofile 1048576
三、资源管理与调度
3.1 CPU 调度器优化
AlmaLinux 默认使用 CFS(完全公平调度器)。对于特定场景,可以调整调度策略:
- 实时任务:使用
SCHED_FIFO或SCHED_RR。 - 批处理任务:调整 CFS 参数。
示例:使用 taskset 绑定 CPU 核心
# 将进程绑定到 CPU 0 和 1
taskset -cp 0,1 <PID>
# 启动时绑定
taskset -c 0,1 /path/to/program
示例:调整 CFS 参数
# /etc/sysctl.conf
kernel.sched_latency_ns = 10000000 # 调度周期(纳秒)
kernel.sched_min_granularity_ns = 1000000 # 最小调度粒度
kernel.sched_wakeup_granularity_ns = 1500000 # 唤醒粒度
3.2 内存管理
- 透明大页(THP):对于大内存应用,启用 THP 可以减少 TLB 压力,但可能增加内存碎片。
- NUMA 优化:对于多路服务器,NUMA 感知的内存分配可以提升性能。
示例:启用透明大页
# 查看当前状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 临时启用
echo always > /sys/kernel/mm/transparent_hugepage/enabled
# 永久生效(编辑 /etc/rc.local 或使用 systemd 服务)
# 创建服务文件 /etc/systemd/system/thp.service
[Unit]
Description=Enable Transparent Huge Pages
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo always > /sys/kernel/mm/transparent_hugepage/enabled'
[Install]
WantedBy=multi-user.target
示例:NUMA 优化
# 安装 numactl
sudo dnf install -y numactl
# 查看 NUMA 拓扑
numactl --hardware
# 绑定进程到特定 NUMA 节点
numactl --cpunodebind=0 --membind=0 /path/to/program
3.3 I/O 调度器
对于不同类型的存储设备,选择合适的 I/O 调度器:
- SSD:使用
none或noop(避免不必要的调度开销)。 - HDD:使用
deadline或cfq。
示例:查看和修改 I/O 调度器
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 临时修改(例如,将 sda 的调度器改为 none)
echo none > /sys/block/sda/queue/scheduler
# 永久生效(使用 udev 规则)
# 创建 /etc/udev/rules.d/60-ioscheduler.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="none"
四、文件系统优化
4.1 选择合适的文件系统
- XFS:适合大文件和高并发,AlmaLinux 默认。
- ext4:通用性好,适合大多数场景。
- Btrfs:支持快照和压缩,但性能可能略低。
4.2 挂载选项优化
示例:优化 XFS 挂载选项
# /etc/fstab
/dev/sda1 /data xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0
noatime:不更新访问时间,减少写操作。nodiratime:不更新目录访问时间。logbufs和logbsize:调整日志缓冲区大小,提升写入性能。
4.3 定期维护
- 文件系统检查:定期使用
fsck检查文件系统。 - 碎片整理:XFS 不需要碎片整理,但 ext4 可以使用
e4defrag。
示例:定期检查文件系统
# 创建 systemd 定时任务
# /etc/systemd/system/fsck.service
[Unit]
Description=Filesystem Check
[Service]
Type=oneshot
ExecStart=/usr/sbin/fsck -y /dev/sda1
[Install]
WantedBy=multi-user.target
# /etc/systemd/system/fsck.timer
[Unit]
Description=Run fsck monthly
[Timer]
OnCalendar=monthly
Persistent=true
[Install]
WantedBy=timers.target
五、网络优化
5.1 网络接口优化
- 多队列网卡(RSS):启用多队列可以提升多核 CPU 的网络处理能力。
- 中断亲和性:将网卡中断绑定到特定 CPU 核心。
示例:启用多队列
# 查看网卡支持的队列数
ethtool -l eth0
# 设置队列数(例如,设置为 8)
ethtool -L eth0 combined 8
示例:设置中断亲和性
# 查看中断号
cat /proc/interrupts | grep eth0
# 绑定中断到 CPU 0-3
echo 0-3 > /proc/irq/<IRQ_NUMBER>/smp_affinity_list
5.2 TCP 优化
除了内核参数,还可以调整 TCP 拥塞控制算法:
- cubic:默认算法,适合大多数场景。
- bbr:Google 开发的算法,适合高延迟网络。
示例:切换到 BBR
# 临时切换
sysctl -w net.ipv4.tcp_congestion_control=bbr
# 永久生效
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
六、应用层优化
6.1 数据库优化(以 MySQL 为例)
- 缓冲池大小:调整
innodb_buffer_pool_size(通常为总内存的 70-80%)。 - 连接数:调整
max_connections和thread_cache_size。
示例:MySQL 配置文件优化
[mysqld]
# 内存相关
innodb_buffer_pool_size = 16G # 根据总内存调整
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 2 # 平衡性能与数据安全
# 连接相关
max_connections = 1000
thread_cache_size = 100
6.2 Web 服务器优化(以 Nginx 为例)
- worker_processes:通常设置为 CPU 核心数。
- worker_connections:每个 worker 的最大连接数。
- keepalive_timeout:保持连接时间。
示例:Nginx 配置优化
# /etc/nginx/nginx.conf
worker_processes auto; # 自动检测 CPU 核心数
worker_rlimit_nofile 1048576; # 文件描述符限制
events {
worker_connections 10240; # 每个 worker 的连接数
use epoll; # 使用 epoll 模型
multi_accept on; # 允许一次接受多个连接
}
http {
keepalive_timeout 65; # 保持连接时间
keepalive_requests 100; # 每个连接的最大请求数
sendfile on; # 启用 sendfile
tcp_nopush on; # 优化 TCP 包发送
tcp_nodelay on; # 禁用 Nagle 算法
}
七、监控与持续优化
7.1 实时监控工具
- Prometheus + Grafana:开源监控方案,可自定义指标。
- Netdata:实时性能监控,开箱即用。
- Zabbix:企业级监控,支持告警。
示例:安装 Netdata
# 一键安装
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
# 访问 http://<server-ip>:19999
7.2 日志分析
- ELK Stack(Elasticsearch, Logstash, Kibana):日志收集与分析。
- rsyslog:系统日志管理。
示例:配置 rsyslog 发送日志到远程服务器
# /etc/rsyslog.conf
*.* @remote-server:514
7.3 自动化优化脚本
编写脚本定期检查并调整系统参数。
示例:自动调整 swappiness 的脚本
#!/bin/bash
# /usr/local/bin/adjust_swappiness.sh
# 获取当前内存使用率
MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}')
# 如果内存使用率超过 80%,降低 swappiness
if (( $(echo "$MEM_USAGE > 80" | bc -l) )); then
echo 5 > /proc/sys/vm/swappiness
else
echo 10 > /proc/sys/vm/swappiness
fi
八、总结
AlmaLinux 的性能优化是一个系统工程,需要从内核参数、资源管理、文件系统、网络和应用层多个维度入手。通过合理的监控和持续的调整,可以显著提升系统性能。记住,优化前务必进行基准测试,优化后也要持续监控,确保调整带来的是正向收益。
关键点回顾:
- 监控先行:了解瓶颈是优化的第一步。
- 内核调优:虚拟内存、网络参数是基础。
- 资源管理:CPU、内存、I/O 调度器的选择至关重要。
- 文件系统优化:挂载选项和定期维护。
- 网络优化:多队列、中断亲和性、TCP 算法。
- 应用层优化:针对具体应用(如数据库、Web 服务器)进行配置。
- 持续监控:使用工具如 Netdata、Prometheus 进行实时监控。
通过本文的实战指南,您应该能够系统地优化 AlmaLinux 系统,满足不同业务场景的性能需求。
