引言
AlmaLinux 作为 CentOS 的继任者,凭借其与 RHEL 的二进制兼容性、社区驱动的开发模式以及企业级的稳定性,迅速成为服务器操作系统的热门选择。然而,仅仅安装系统并不能充分发挥其潜力。本文将从基础配置入手,逐步深入到高级调优,通过详尽的实战步骤和代码示例,帮助你将 AlmaLinux 的性能推向极限。
第一部分:基础配置与系统优化
1.1 系统安装与初始设置
在开始性能调优之前,确保系统安装正确且基础配置合理至关重要。
最小化安装:建议选择“Minimal Install”或“Server with GUI”中的最小化选项,减少不必要的服务和软件包,降低系统开销。
更新系统:安装完成后,立即更新所有软件包以确保安全性和性能修复。
# 更新所有软件包
sudo dnf update -y
# 安装常用工具
sudo dnf install -y vim wget curl net-tools htop iotop
1.2 内核参数调优
内核参数直接影响系统性能,尤其是对于高并发或高负载场景。
编辑 sysctl 配置文件:/etc/sysctl.conf 是系统级内核参数配置文件。
# 备份原始配置文件
sudo cp /etc/sysctl.conf /etc/sysctl.conf.bak
# 编辑配置文件
sudo vim /etc/sysctl.conf
添加以下优化参数:
# 网络性能优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # 在NAT环境下可能导致问题,建议关闭
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
# 内存管理优化
vm.swappiness = 10 # 减少交换分区使用,优先使用物理内存
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
# 文件系统优化
fs.file-max = 2097152
fs.nr_open = 2097152
fs.inotify.max_user_watches = 524288
# 网络连接跟踪优化
net.netfilter.nf_conntrack_max = 2000000
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
应用配置:
# 立即应用配置
sudo sysctl -p
# 验证参数是否生效
sysctl net.core.somaxconn
1.3 文件系统优化
选择合适的文件系统并进行优化可以显著提升 I/O 性能。
ext4 文件系统优化:
# 创建文件系统时指定参数
mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 -O ^has_journal /dev/sdX
# 挂载参数优化(编辑 /etc/fstab)
# 示例:/dev/sdb1 /data ext4 defaults,noatime,nodiratime,data=writeback,barrier=0 0 2
XFS 文件系统优化:
# 创建文件系统
mkfs.xfs -f -i size=512 -l size=128m,lazy-count=1 /dev/sdX
# 挂载参数优化
# 示例:/dev/sdb1 /data xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 2
使用 fstrim 优化 SSD:
# 启用定期 trim(对于 SSD)
sudo systemctl enable fstrim.timer
sudo systemctl start fstrim.timer
# 手动执行 trim
sudo fstrim -v /
1.4 资源限制与用户管理
合理配置资源限制可以防止单个进程耗尽系统资源。
编辑 limits.conf:
sudo vim /etc/security/limits.conf
添加以下配置:
# 为所有用户设置默认限制
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
# 为特定用户设置限制(例如 web 用户)
web soft nofile 100000
web hard nofile 100000
使用 systemd 服务资源限制:
# 创建 systemd 服务文件
sudo vim /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=myapp
ExecStart=/usr/local/bin/myapp
# 资源限制
LimitNOFILE=100000
LimitNPROC=100000
MemoryLimit=2G
CPUQuota=80%
[Install]
WantedBy=multi-user.target
第二部分:性能监控与分析
2.1 系统监控工具
综合监控工具:
# 安装 sysstat(包含 sar、iostat 等)
sudo dnf install -y sysstat
# 启用 sysstat 收集
sudo systemctl enable sysstat
sudo systemctl start sysstat
# 查看 CPU 使用情况
sar -u 1 10
# 查看内存使用情况
sar -r 1 10
# 查看 I/O 情况
sar -d 1 10
实时监控工具:
# htop - 交互式进程查看器
htop
# iotop - I/O 监控
sudo iotop
# nmon - 综合性能监控
sudo dnf install -y nmon
nmon
2.2 专业性能分析工具
perf - Linux 性能计数器:
# 安装 perf
sudo dnf install -y perf
# 记录性能数据
sudo perf record -g -p <PID> sleep 30
# 分析报告
sudo perf report
# 实时监控 CPU 使用率
sudo perf top
bpftrace - 高级动态追踪:
# 安装 bpftrace
sudo dnf install -y bpftrace
# 示例:追踪系统调用
sudo bpftrace -e 'tracepoint:syscalls:sys_enter_* { @[probe] = count(); }'
# 示例:追踪进程创建
sudo bpftrace -e 'tracepoint:sched:sched_process_fork { printf("Fork: %s -> %s\n", args->parent_comm, args->child_comm); }'
2.3 网络性能分析
网络吞吐量测试:
# 安装 iperf3
sudo dnf install -y iperf3
# 服务器端
iperf3 -s
# 客户端(测试)
iperf3 -c <server_ip> -t 30 -P 10
网络延迟测试:
# 使用 ping 和 mtr
ping -c 100 <target_ip>
mtr -r -c 100 <target_ip>
# 使用 tcptraceroute
sudo dnf install -y tcptraceroute
tcptraceroute <target_ip> 80
第三部分:高级调优实战
3.1 CPU 性能调优
CPU 频率与 governor 调整:
# 安装 cpupower 工具
sudo dnf install -y cpupower
# 查看当前 governor
cpupower frequency-info
# 设置性能模式(最大化性能)
sudo cpupower frequency-set -g performance
# 设置节能模式(最大化能效)
sudo cpupower frequency-set -g powersave
# 持久化配置
sudo vim /etc/sysconfig/cpupower
# /etc/sysconfig/cpupower
governor="performance"
CPU 亲和性设置:
# 查看 CPU 信息
lscpu
# 设置进程亲和性(例如,将进程绑定到 CPU 0-3)
taskset -cp 0-3 <PID>
# 在 systemd 服务中设置 CPU 亲和性
sudo vim /etc/systemd/system/myapp.service
[Service]
# CPU 亲和性:绑定到 CPU 0-3
CPUAffinity=0-3
# CPU 集合:使用 CPU 0,2,4,6
CPUAffinity=0,2,4,6
NUMA 调优:
# 查看 NUMA 拓扑
numactl --hardware
# 使用 numactl 运行程序
numactl --cpunodebind=0 --membind=0 /path/to/program
# 在 systemd 服务中设置 NUMA 策略
sudo vim /etc/systemd/system/myapp.service
[Service]
# NUMA 策略:优先使用节点 0
NUMAPolicy=preferred
NUMANode=0
3.2 内存调优
透明大页(THP)优化:
# 查看 THP 状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 临时禁用 THP(对于某些数据库应用可能更优)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 永久禁用(编辑 /etc/default/grub)
GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never"
# 更新 GRUB 并重启
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
内存压缩(zswap):
# 启用 zswap(需要内核支持)
sudo dnf install -y kernel-modules-extra
# 编辑 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20"
# 更新 GRUB 并重启
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
内存限制与 cgroups:
# 使用 systemd 限制内存
sudo vim /etc/systemd/system/myapp.service
[Service]
# 内存限制:最大 2GB,软限制 1.5GB
MemoryLimit=2G
MemorySoftLimit=1.5G
# 交换分区限制
MemorySwapMax=1G
3.3 I/O 调优
I/O 调度器选择:
# 查看可用调度器
cat /sys/block/sda/queue/scheduler
# 设置调度器(对于 SSD 推荐 none 或 noop)
echo none > /sys/block/sda/queue/scheduler
# 永久化配置(创建 udev 规则)
sudo vim /etc/udev/rules.d/60-ioscheduler.rules
# /etc/udev/rules.d/60-ioscheduler.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
I/O 队列深度调整:
# 查看当前队列深度
cat /sys/block/sda/queue/nr_requests
# 增加队列深度(对于高并发应用)
echo 1024 > /sys/block/sda/queue/nr_requests
# 永久化配置(创建 udev 规则)
sudo vim /etc/udev/rules.d/60-queue-depth.rules
# /etc/udev/rules.d/60-queue-depth.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/nr_requests}="1024"
RAID 配置优化:
# 查看 RAID 状态
cat /proc/mdstat
# 调整 RAID 读写策略
sudo mdadm --manage /dev/md0 --set-bitmap=1024
# 调整 RAID 重建速度
sudo mdadm --manage /dev/md0 --set-rebuild-speed=100000
3.4 网络调优
TCP 协议栈优化:
# 编辑 /etc/sysctl.conf 添加以下参数
sudo vim /etc/sysctl.conf
# 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_congestion_control = bbr
# TCP Fast Open
net.ipv4.tcp_fastopen = 3
# TCP 重传优化
net.ipv4.tcp_retries2 = 8
net.ipv4.tcp_slow_start_after_idle = 0
网卡多队列与 RSS:
# 查看网卡队列数
ethtool -l eth0
# 启用多队列(如果支持)
sudo ethtool -L eth0 combined 8
# 配置 RSS(Receive Side Scaling)
sudo ethtool -K eth0 rxhash on
# 绑定中断到 CPU
sudo vim /etc/systemd/system/irqbalance.service
[Service]
# 禁用 irqbalance(手动绑定中断)
ExecStart=/bin/true
手动绑定中断:
# 查看中断分布
cat /proc/interrupts | grep eth0
# 绑定中断到特定 CPU
echo 1 > /proc/irq/123/smp_affinity # 绑定到 CPU 0
echo 2 > /proc/irq/124/smp_affinity # 绑定到 CPU 1
echo 4 > /proc/irq/125/smp_affinity # 绑定到 CPU 2
echo 8 > /proc/irq/126/smp_affinity # 绑定到 CPU 3
3.5 应用层调优
数据库调优示例(MySQL/MariaDB):
# 安装 MariaDB
sudo dnf install -y mariadb-server mariadb
# 配置 my.cnf
sudo vim /etc/my.cnf.d/server.cnf
[mysqld]
# 基础配置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 内存配置(根据系统内存调整)
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
# 连接配置
max_connections = 1000
thread_cache_size = 100
# 查询缓存(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_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
Web 服务器调优示例(Nginx):
# 安装 Nginx
sudo dnf install -y nginx
# 配置 Nginx
sudo vim /etc/nginx/nginx.conf
user nginx;
worker_processes auto; # 自动设置为 CPU 核心数
worker_rlimit_nofile 100000; # 进程文件描述符限制
events {
worker_connections 4096; # 每个 worker 的连接数
use epoll; # 使用 epoll 事件模型
multi_accept on; # 一次接受多个连接
}
http {
# 基础配置
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 100;
# 缓冲区配置
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/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
# 缓存配置
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 main buffer=128k flush=5s;
error_log /var/log/nginx/error.log warn;
# 虚拟主机配置
include /etc/nginx/conf.d/*.conf;
}
应用服务器调优示例(Java JVM):
# Java 应用启动参数优化
java -Xms4G -Xmx4G \ # 初始和最大堆内存
-XX:+UseG1GC \ # 使用 G1 垃圾收集器
-XX:MaxGCPauseMillis=200 \ # 最大 GC 暂停时间
-XX:InitiatingHeapOccupancyPercent=45 \ # 老年代占用比例触发并发标记
-XX:+UseStringDeduplication \ # 字符串去重
-XX:+UseCompressedOops \ # 压缩指针
-XX:+UseCompressedClassPointers \ # 压缩类指针
-XX:MaxDirectMemorySize=1G \ # 直接内存大小
-XX:+HeapDumpOnOutOfMemoryError \ # OOM 时生成堆转储
-XX:HeapDumpPath=/var/log/java/heapdump.hprof \
-XX:+PrintGCDetails \ # 打印 GC 详情
-XX:+PrintGCDateStamps \ # 打印 GC 时间戳
-Xloggc:/var/log/java/gc.log \ # GC 日志路径
-jar myapp.jar
第四部分:自动化与持续优化
4.1 自动化监控脚本
系统健康检查脚本:
#!/bin/bash
# /usr/local/bin/system_health_check.sh
# 配置
LOG_FILE="/var/log/system_health.log"
THRESHOLD_CPU=80
THRESHOLD_MEM=80
THRESHOLD_DISK=85
# 获取当前时间
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# 检查 CPU 使用率
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$CPU_USAGE > $THRESHOLD_CPU" | bc -l) )); then
echo "[$TIMESTAMP] WARNING: CPU usage is ${CPU_USAGE}% (threshold: ${THRESHOLD_CPU}%)" >> $LOG_FILE
fi
# 检查内存使用率
MEM_USAGE=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
if (( $(echo "$MEM_USAGE > $THRESHOLD_MEM" | bc -l) )); then
echo "[$TIMESTAMP] WARNING: Memory usage is ${MEM_USAGE}% (threshold: ${THRESHOLD_MEM}%)" >> $LOG_FILE
fi
# 检查磁盘使用率
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt $THRESHOLD_DISK ]; then
echo "[$TIMESTAMP] WARNING: Disk usage is ${DISK_USAGE}% (threshold: ${THRESHOLD_DISK}%)" >> $LOG_FILE
fi
# 检查负载平均值
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}')
CPU_CORES=$(nproc)
LOAD_THRESHOLD=$(echo "$CPU_CORES * 2" | bc)
if (( $(echo "$LOAD_AVG > $LOAD_THRESHOLD" | bc -l) )); then
echo "[$TIMESTAMP] WARNING: Load average is ${LOAD_AVG} (threshold: ${LOAD_THRESHOLD})" >> $LOG_FILE
fi
设置定时任务:
# 创建定时任务
sudo crontab -e
# 每5分钟运行一次健康检查
*/5 * * * * /usr/local/bin/system_health_check.sh
# 每天凌晨3点清理日志
0 3 * * * find /var/log -name "*.log" -mtime +7 -delete
# 每周日凌晨2点进行系统快照
0 2 * * 0 /usr/local/bin/system_snapshot.sh
4.2 配置管理工具
使用 Ansible 管理配置:
# ansible/playbooks/alma_performance.yml
---
- name: AlmaLinux Performance Tuning
hosts: all
become: yes
tasks:
- name: Update system
dnf:
name: '*'
state: latest
- name: Install performance tools
dnf:
name:
- sysstat
- htop
- iotop
- perf
- bpftrace
state: present
- name: Configure sysctl
sysctl:
name: "{{ item.key }}"
value: "{{ item.value }}"
state: present
reload: yes
loop:
- { key: 'net.core.somaxconn', value: '65535' }
- { key: 'vm.swappiness', value: '10' }
- { key: 'fs.file-max', value: '2097152' }
- name: Configure limits
pam_limits:
domain: "*"
limit_type: "{{ item.type }}"
limit_item: "{{ item.item }}"
value: "{{ item.value }}"
loop:
- { type: 'soft', item: 'nofile', value: '65536' }
- { type: 'hard', item: 'nofile', value: '65536' }
- { type: 'soft', item: 'nproc', value: '65536' }
- { type: 'hard', item: 'nproc', value: '65536' }
- name: Configure CPU governor
command: cpupower frequency-set -g performance
when: ansible_distribution == "AlmaLinux"
- name: Disable transparent hugepages
lineinfile:
path: /etc/default/grub
regexp: '^GRUB_CMDLINE_LINUX_DEFAULT='
line: 'GRUB_CMDLINE_LINUX_DEFAULT="transparent_hugepage=never"'
notify: Update GRUB
handlers:
- name: Update GRUB
command: grub2-mkconfig -o /boot/grub2/grub.cfg
notify: Reboot
- name: Reboot
reboot:
msg: "Rebooting for kernel parameter changes"
connect_timeout: 5
reboot_timeout: 300
pre_reboot_delay: 0
post_reboot_delay: 30
test_command: whoami
4.3 性能基准测试
使用 fio 进行 I/O 基准测试:
# 安装 fio
sudo dnf install -y fio
# 创建测试配置文件
cat > /tmp/fio_test.fio << 'EOF'
[global]
ioengine=libaio
direct=1
size=10G
runtime=60
time_based
group_reporting
[read]
name=read_test
rw=read
bs=4k
numjobs=4
[write]
name=write_test
rw=write
bs=4k
numjobs=4
[randread]
name=randread_test
rw=randread
bs=4k
numjobs=4
[randwrite]
name=randwrite_test
rw=randwrite
bs=4k
numjobs=4
[seqread]
name=seqread_test
rw=read
bs=1M
numjobs=1
[seqwrite]
name=seqwrite_test
rw=write
bs=1M
numjobs=1
EOF
# 运行测试
fio /tmp/fio_test.fio --output=/tmp/fio_results.json --output-format=json
使用 sysbench 进行数据库基准测试:
# 安装 sysbench
sudo dnf install -y sysbench
# 准备测试数据
sysbench oltp_read_write --table-size=1000000 --threads=16 --time=60 prepare
# 运行测试
sysbench oltp_read_write --table-size=1000000 --threads=16 --time=60 run
# 清理测试数据
sysbench oltp_read_write --table-size=1000000 --threads=16 --time=60 cleanup
第五部分:故障排除与最佳实践
5.1 常见性能问题诊断
CPU 使用率过高:
# 1. 查看哪个进程占用 CPU
top -c
# 2. 使用 perf 分析 CPU 使用情况
sudo perf top -p <PID>
# 3. 检查是否有大量上下文切换
pidstat -w -p <PID> 1
# 4. 检查是否有锁竞争
sudo perf lock record -p <PID> sleep 10
sudo perf lock report
内存不足问题:
# 1. 查看内存使用详情
free -h
cat /proc/meminfo
# 2. 查看内存泄漏
sudo valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all ./myapp
# 3. 检查交换分区使用情况
vmstat 1 10
# 4. 查看内存碎片
cat /proc/buddyinfo
I/O 瓶颈问题:
# 1. 查看 I/O 等待
iostat -x 1
# 2. 查看哪些进程在进行 I/O
iotop -o
# 3. 检查磁盘队列深度
cat /sys/block/sda/queue/nr_requests
# 4. 使用 blktrace 分析 I/O 路径
sudo blktrace -d /dev/sda -o trace
sudo blkparse trace.bin | head -100
网络性能问题:
# 1. 查看网络连接状态
ss -s
ss -tunap
# 2. 检查网络丢包
netstat -s | grep -i "drop\|error\|retrans"
# 3. 使用 tcpdump 分析网络流量
sudo tcpdump -i eth0 -w /tmp/network.pcap
# 4. 检查网络缓冲区使用情况
cat /proc/net/sockstat
5.2 性能调优最佳实践
- 基准测试先行:在任何调优之前,先进行基准测试,记录当前性能指标。
- 逐步调整:每次只调整一个参数,观察效果后再进行下一步调整。
- 监控与记录:使用监控工具记录调整前后的性能变化。
- 考虑业务场景:不同的应用对资源的需求不同,调优策略应根据业务特点定制。
- 定期复审:随着应用和负载的变化,定期重新评估和调整性能配置。
5.3 安全与性能的平衡
安全加固与性能优化:
# 1. 启用 SELinux(可能影响性能,但安全重要)
sudo setenforce 1
sudo semanage permissive -a httpd_t # 为特定服务设置宽松模式
# 2. 配置防火墙规则(避免过度限制)
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload
# 3. 使用 AppArmor 或 SELinux 策略优化
sudo aa-status
sudo aa-complain /usr/sbin/nginx # 仅记录不阻止
结语
AlmaLinux 的性能调优是一个持续的过程,需要根据具体的应用场景、硬件配置和业务需求进行调整。本文从基础配置到高级调优,提供了全面的实战指南和代码示例。记住,没有“一刀切”的最佳配置,只有最适合你特定场景的配置。
通过系统化的监控、分析和调优,你可以将 AlmaLinux 的性能推向极限,为你的应用提供稳定、高效的运行环境。持续学习和实践是掌握性能调优艺术的关键。
最后建议:在生产环境进行任何重大调优之前,务必在测试环境中充分验证,并做好完整的备份和回滚计划。性能调优是一门艺术,也是一门科学,需要耐心、细致和持续的优化。
