引言:为什么需要优化 AlmaLinux 系统性能

AlmaLinux 作为 CentOS 的稳定替代品,广泛应用于生产环境。然而,默认安装的系统配置通常是为了兼容性而非极致性能。通过系统化的优化,我们可以显著提升服务器的响应速度、吞吐量和资源利用率。

性能优化不是一次性的工作,而是需要根据实际负载特征持续调整的过程。本文将从内核参数调优、文件系统优化、内存管理、CPU 调度、网络优化等多个维度,提供详细的实战指南。

一、内核参数调整:sysctl.conf 深度优化

1.1 内核参数调整基础

内核参数存储在 /proc/sys/ 目录下,可以通过 sysctl 命令动态修改。优化前需要了解当前值:

# 查看当前所有内核参数
sysctl -a

# 查看特定参数
sysctl vm.swappiness
vm.swappiness = 60

# 查看参数的当前值和推荐值
cat /proc/sys/vm/swappiness
60

1.2 虚拟内存管理优化

虚拟内存是系统性能的关键。以下是生产环境推荐配置:

1.2.1 swappiness 参数优化

vm.swappiness 控制内核将内存数据交换到 swap 的积极性,范围 0-100。

# 临时修改(重启后失效)
sysctl vm.swappiness=10

# 永久修改(编辑 /etc/sysctl.conf)
echo "vm.swappiness = 10" >> /etc/sysctl.conf

# 对于数据库服务器,建议设置为 1-10
# 对于普通应用服务器,建议设置为 10-30
# 对于内存充足的服务器,可以设置为 0(但不推荐)

1.2.2 内存回收策略

# vm.vfs_cache_pressure - 控制内核回收用于目录项和 inode 缓存的内存倾向
# 默认值 100,建议对于文件密集型应用设置为 50-200
sysctl vm.vfs_cache_pressure=50

# vm.dirty_ratio 和 vm.dirty_background_ratio - 控制脏页写入
# dirty_background_ratio 是后台刷写开始的百分比
# dirty_ratio 是进程被阻塞开始写入的百分比
sysctl vm.dirty_background_ratio=5
sysctl vm.dirty_ratio=10

# vm.min_free_kbytes - 系统保留的最小空闲内存(KB)
# 建议设置为物理内存的 1-2%,但不要超过 1GB
# 对于 16GB 内存的系统:
sysctl vm.min_free_kbytes=163840

1.3 网络性能优化

1.3.1 TCP/IP 栈优化

# 增加 TCP 连接队列大小
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 增加网络设备队列长度
net.core.netdev_max_backlog = 65535

# TCP 缓冲区大小
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456
net.core.rmem_max = 6291456
net.core.wmem_max = 6291456

# TIME_WAIT 状态连接回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# TCP 连接复用
net.ipv4.tcp_reuse = 1

# 网络命名空间优化(容器环境)
net.ipv4.ip_local_port_range = 1024 65535

1.3.2 高性能网络配置示例

对于 Web 服务器或 API 服务器,推荐以下配置:

# /etc/sysctl.d/99-network-performance.conf
# 保存后执行 sysctl -p /etc/sysctl.d/99-network-performance.conf

# 网络核心设置
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728

# TCP 内存分配
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728

# TCP 连接优化
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_moderate_rcvbuf = 1

# TIME_WAIT 优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 2000000

# 拥塞控制算法(可选)
net.ipv4.tcp_congestion_control = bbr

# 端口范围
net.ipv4.ip_local_port_range = 1024 65535

1.4 文件系统相关优化

# 增加系统最大打开文件数
fs.file-max = 2097152

# 增加 inode 缓存
fs.inotify.max_user_watches = 524288

# 文件系统缓存压力
fs.dir-notify-enable = 0  # 禁用目录通知,减少开销(如果不需要)

二、系统资源管理:ulimit 和 systemd 资源限制

2.1 ulimit 配置

ulimit 用于设置用户进程资源限制。在 AlmaLinux 中,需要修改 /etc/security/limits.conf

# /etc/security/limits.conf
# 格式:<domain> <type> <item> <value>

# 所有用户(*)的软限制(-)和硬限制(h)配置
* soft nofile 1048576
* hard nofile 1048576

# 数据库用户(例如 mysql)的特殊配置
mysql soft nofile 65536
mysql hard nofile 65536

# 应用用户(例如 appuser)的配置
appuser soft nproc 65536
appuser hard nproc 65536
appuser soft nofile 65536
appuser hard nofile 65536

# 核心转储大小(-1 表示无限制)
* soft core unlimited
* hard core unlimited

# 内存锁定(mlock)限制
* soft memlock unlimited
* hard memlock unlimited

2.2 systemd 服务资源限制

对于使用 systemd 管理的服务,可以在 service 文件中设置资源限制:

# /etc/systemd/system/myapp.service
[Unit]
Description=My Application Service
After=network.target

[Service]
Type=simple
User=appuser
Group=appuser
ExecStart=/usr/local/bin/myapp

# 资源限制配置
LimitNOFILE=65536          # 最大打开文件数
LimitNPROC=65536           # 最大进程/线程数
LimitMEMLOCK=infinity      # 内存锁定限制
LimitCORE=infinity         # 核心转储大小

# CPU 和内存限制(可选)
CPUQuota=80%               # CPU 使用率上限(80%)
MemoryLimit=4G             # 内存使用上限
TasksMax=5000              # 最大任务数

# 重启策略
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

应用配置:

# 重新加载 systemd 配置
systemctl daemon-reload

# 启动服务并设置开机自启
systemctl enable myapp
systemctl start myapp

# 查看资源限制
systemctl show myapp --property=LimitNOFILE,LimitNPROC

2.3 全局系统限制配置

/etc/systemd/system.conf 中设置全局限制:

# /etc/systemd/system.conf
[Manager]
DefaultLimitNOFILE=65536
DefaultLimitNPROC=65536
DefaultLimitMEMLOCK=infinity
DefaultLimitCORE=infinity

修改后需要重启系统或重新加载 systemd:

systemctl daemon-reexec

三、文件系统优化:ext4/xfs 调优

3.1 ext4 文件系统优化

3.1.1 挂载选项优化

# 查看当前挂载选项
mount | grep ext4

# 临时重新挂载(测试)
mount -o remount,noatime,nodiratime,delalloc,barrier=0 /dev/sda1 /data

# 永久修改 /etc/fstab
# /etc/fstab 示例
UUID=xxx /data ext4 defaults,noatime,nodiratime,delalloc,barrier=0 0 2

挂载选项详解:

  • noatime:禁用访问时间更新,显著提升读写性能
  • nodiratime:禁用目录访问时间更新
  • delalloc:延迟分配,减少碎片
  • barrier=0:禁用写入屏障(仅电池备份 RAID 卡推荐)
  • data=writeback:写回模式(提升性能,但可能丢数据)
  • discard:SSD 支持 TRIM

3.1.2 调整 ext4 参数

# 调整文件系统参数(在线调整)
tune2fs -o journal_data_writeback /dev/sda1

# 调整保留块百分比(默认 5%,对于大分区可降低)
tune2fs -m 1 /dev/sda1

# 调整 journal 大小(对于大文件系统)
tune2fs -J size=512 /dev/sda1

# 检查当前参数
tune2fs -l /dev/sda1 | grep -E "Default mount options|Reserved block count"

3.2 XFS 文件系统优化

XFS 在 AlmaLinux 中是默认文件系统,特别适合大文件和高并发:

# 查看 XFS 参数
xfs_info /dev/sda1

# 优化挂载选项
# /etc/fstab 示例
/dev/sda1 /data xfs defaults,noatime,logbufs=8,logbsize=256k,largeio,inode64,swalloc 0 0

# 选项说明:
# noatime - 禁用访问时间
# logbufs=8 - 增加日志缓冲区数量(默认 8,可增加到 16)
# logbsize=256k - 日志缓冲区大小
# largeio - 支持大 I/O
# inode64 - 支持 64 位 inode(大文件系统必需)
# swalloc - 空间分配优化

3.3 文件系统性能测试

# 安装 fio
dnf install -y fio

# 测试随机读写性能
fio --name=randread --ioengine=libaio --iodepth=64 --rw=randread --bs=4k --size=1G --numjobs=8 --runtime=300 --group_reporting --filename=/data/testfile

# 测试顺序写入
fio --name=seqwrite --ioengine=libaio --iodepth=64 --rw=write --bs=1M --size=10G --numjobs=1 --runtime=300 --group_reporting --filename=/data/testfile

四、CPU 和进程调度优化

4.1 CPU 调度器选择

AlmaLinux 支持多种 CPU 调度器,适用于不同场景:

# 查看当前调度器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 通常显示:powersave 或 performance

# 查看可用调度器
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# 可能显示:performance powersave ondemand conservative userspace

# 临时修改为 performance 模式(立即生效)
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance > $cpu
done

# 永久修改(使用 tuned)
dnf install -y tuned
systemctl enable tuned
systemctl start tuned

# 使用 tuned 的优化方案
tuned-adm profile throughput-performance  # 吞吐量优先
# 或者
tuned-adm profile latency-performance    # 延迟优先

4.2 进程亲和性(CPU 绑定)

对于关键进程,可以绑定到特定 CPU 核心:

# 查看 CPU 信息
lscpu

# 使用 taskset 绑定进程
# 启动新进程并绑定到 CPU 0-3
taskset -c 0-3 /usr/local/bin/myapp

# 绑定已运行的进程(PID 1234)
taskset -cp 0-3 1234

# 查看进程的 CPU 亲和性
taskset -p 1234

4.3 NUMA 优化

对于 NUMA 架构的服务器:

# 安装 numactl
dnf install -y numactl

# 查看 NUMA 拓扑
numactl --hardware

# 启动进程时指定 NUMA 节点
numactl --cpunodebind=0 --membind=0 /usr/local/bin/myapp

# 对于数据库服务(如 MySQL)
# 在 my.cnf 中设置
[mysqld]
innodb_numa_interleave = 1

4.4 中断亲和性优化

# 查看中断分布
cat /proc/interrupts

# 安装 irqbalance(自动优化中断分配)
dnf install -y irqbalance
systemctl enable irqbalance
systemctl start irqbalance

# 手动绑定中断到特定 CPU(高级)
# 例如,将网卡中断绑定到 CPU 4-7
echo 4-7 > /proc/irq/123/smp_affinity_list

五、内存管理优化

5.1 内存使用监控

# 实时监控内存使用
free -h
              total    used    free  shared  buff/cache   available
Mem:           31Gi    12Gi    8Gi     1.2Gi       11Gi       17Gi
Swap:          8Gi     0B      8Gi

# 查看详细内存统计
cat /proc/meminfo

# 监控内存使用趋势
vmstat 1 10

5.2 Transparent Huge Pages (THP) 优化

THP 对于某些工作负载(如数据库)可能降低性能:

# 查看当前 THP 状态
cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

# 临时禁用 THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 永久禁用(创建 systemd 服务)
cat > /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

systemctl enable disable-thp
systemctl start disable-thp

5.3 内存压缩优化

# 查看内存压缩状态
cat /sys/kernel/mm/zswap/enabled

# 启用 zswap(内存压缩交换)
echo Y > /sys/kernel/mm/zswap/enabled

# 永久启用
echo "kernel.mm.zswap.enabled=1" >> /etc/sysctl.conf

六、网络性能深度优化

6.1 网络接口优化

# 查看网卡信息
ethtool eth0

# 优化网卡队列(多队列网卡)
# 查看当前队列数
ethtool -l eth0

# 设置队列数(如果支持)
ethtool -L eth0 combined 16

# 优化中断间隔
ethtool -C eth0 rx-usecs 100 tx-usecs 100

# 启用网络接口的 TSO/GSO/TSO
ethtool -K eth0 tso on gso on gro on

# 查看当前 offload 设置
ethtool -k eth0

6.2 网络命名空间优化(容器环境)

# 增加网络命名空间的端口范围
sysctl net.ipv4.ip_local_port_range=1024 65535

# 增加连接跟踪表大小(对于防火墙/容器)
sysctl net.netfilter.nf_conntrack_max=2097152
sysctl net.netfilter.nf_conntrack_buckets=2097152

# 调整 TCP 连接跟踪超时
sysctl net.netfilter.nf_conntrack_tcp_timeout_established=86400
sysctl net.netfilter.nf_conntrack_tcp_timeout_time_wait=30

6.3 网络性能测试工具

# 安装 iperf3
dnf install -y iperf3

# 服务器端
iperf3 -s

# 客户端
iperf3 -c <server_ip> -t 60 -P 10

# 测试延迟
ping -c 100 <target_ip>

# 测试路径 MTU
ping -M do -s 1472 <target_ip>

七、I/O 调度器和存储优化

7.1 I/O 调度器选择

# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler
# 输出示例: [mq-deadline] kyber bfq none

# 查看可用调度器
cat /sys/block/sda/queue/scheduler
# 输出示例: none mq-deadline kyber bfq

# 临时修改调度器
echo kyber > /sys/block/sda/queue/scheduler

# 永久修改(创建 udev 规则)
cat > /etc/udev/rules.d/60-ioscheduler.rules <<EOF
# 对于 SSD 使用 none 或 kyber
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="kyber"

# 对于 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

7.2 队列深度和 I/O 优化

# 查看当前队列深度
cat /sys/block/sda/queue/nr_requests

# 增加队列深度(对于高并发 I/O)
echo 256 > /sys/block/sda/queue/nr_requests

# 对于 NVMe SSD,增加 IO 队列深度
cat /sys/block/nvme0n1/queue/nr_requests

# 调整 I/O 调度器参数
# kyber 调度器参数
cat /sys/block/sda/queue/iosched/target_latency
cat /sys/block/sda/queue/iosched/read_lat_nsec
cat /sys/block/sda/queue/iosched/write_lat_nsec

7.3 存储性能监控

# 实时 I/O 监控
iostat -x 1

# 查看详细 I/O 统计
cat /proc/diskstats

# 跟踪 I/O 操作
blktrace -d /dev/sda -o - | blkparse -i -

八、系统服务和进程管理优化

8.1 系统服务优化

# 查看系统启动服务
systemctl list-unit-files --state=enabled

# 禁用不必要的服务(示例)
systemctl disable bluetooth
systemctl disable cups
systemctl disable ModemManager

# 查看服务资源使用
systemd-cgtop

# 查看服务依赖关系
systemctl list-dependencies myapp.service

8.2 进程优先级调整

# 使用 nice 调整进程优先级(范围 -20 到 19,越小优先级越高)
nice -n -10 /usr/local/bin/myapp

# 调整已运行进程的优先级
renice -n -10 -p 1234

# 查看进程优先级
ps -o pid,ni,cmd -p 1234

# 设置实时优先级(需要 root,谨慎使用)
chrt -f -p 99 1234

8.3 使用 cgroups 进行资源限制

# 安装 libcgroup-tools
dnf install -y libcgroup-tools

# 创建 cgroup
cgcreate -g cpu,memory:/myapp

# 设置 CPU 限制(50% 单核)
cgset -r cpu.cfs_period_us=100000 -r cpu.cfs_quota_us=50000 myapp

# 设置内存限制(4GB)
cgset -r memory.limit_in_bytes=4G myapp

# 在 cgroup 中启动进程
cgexec -g cpu,memory:myapp /usr/local/bin/myapp

# 查看 cgroup 统计
cgget -g cpu,memory:myapp

九、监控和性能分析工具

9.1 系统监控工具

# 安装综合监控工具
dnf install -y htop iotop sysstat

# sysstat 配置(/etc/sysstat/sysstat.conf)
# 启用详细日志
ENABLED="true"
SADC_OPTIONS="-S ALL"

# 启动 sysstat 服务
systemctl enable sysstat
systemctl start sysstat

# 查看历史性能数据
sar -u 1 10  # CPU 使用率
sar -r 1 10  # 内存使用率
sar -b 1 10  # I/O 统计
sar -n DEV 1 10  # 网络统计

9.2 性能分析工具

# 安装 perf 工具
dnf install -y perf

# CPU 性能分析
perf top
perf record -g -p 1234
perf report

# 火焰图(需要额外脚本)
git clone https://github.com/brendangregg/FlameGraph
perf record -F 99 -p 1234 -g -- sleep 30
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > flamegraph.svg

# 内存分析
valgrind --tool=memcheck --leak-check=full /usr/local/bin/myapp

# 系统跟踪
dnf install -y bcc-tools
/usr/share/bcc/tools/execsnoop  # 监控进程执行
/usr/share/bcc/tools/offcputime  # 监控 CPU 调出

9.3 日志分析和故障排查

# 查看系统日志
journalctl -f  # 实时跟踪
journalctl -u myapp.service --since "1 hour ago"

# 查看内核日志
dmesg -T | tail -100

# 查看 OOM 日志
dmesg -T | grep -i oom

# 系统性能报告
dnf install -y sos
sosreport  # 生成系统状态报告

十、实战案例:Web 服务器优化

10.1 场景描述

假设我们有一台 16 核 CPU、32GB 内存、NVMe SSD 的 AlmaLinux 服务器,运行 Nginx 和 PHP-FPM,需要处理高并发 Web 请求。

10.2 完整优化配置

10.2.1 内核参数配置

# /etc/sysctl.d/99-webserver.conf
cat > /etc/sysctl.d/99-webserver.conf <<EOF
# 虚拟内存优化
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.min_free_kbytes = 163840

# 网络优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_congestion_control = bbr
net.ipv4.ip_local_port_range = 1024 65535

# 文件系统
fs.file-max = 2097152
fs.inotify.max_user_watches = 524288

# 网络连接跟踪(如果使用防火墙)
net.netfilter.nf_conntrack_max = 2097152
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
EOF

# 应用配置
sysctl -p /etc/sysctl.d/99-webserver.conf

10.2.2 文件系统优化

# /etc/fstab 优化
# 假设 /data 是 Web 数据目录
UUID=xxx /data ext4 defaults,noatime,nodiratime,delalloc,barrier=0 0 2

# 重新挂载
mount -o remount /data

10.2.3 用户和进程限制

# /etc/security/limits.conf
cat >> /etc/security/limits.conf <<EOF
* soft nofile 1048576
* hard nofile 1048576
nginx soft nofile 65536
nginx hard nofile 65536
php-fpm soft nofile 65536
php-fpm hard nofile 65536
EOF

10.2.4 systemd 服务优化

# /etc/systemd/system/php-fpm.service.d/override.conf
[Service]
LimitNOFILE=65536
LimitNPROC=65536
CPUQuota=80%
MemoryLimit=8G
TasksMax=5000

10.2.5 tuned 配置

# 使用 tuned 优化
dnf install -y tuned
systemctl enable tuned
systemctl start tuned
tuned-adm profile throughput-performance

# 自定义 tuned 配置(可选)
mkdir -p /etc/tuned/webserver-profile
cat > /etc/tuned/webserver-profile/tuned.conf <<EOF
[main]
include=throughput-performance

[cpu]
governor=performance
force_latency=1

[vm]
swappiness=10
min_free_kbytes=163840

[sysctl]
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
fs.file-max=2097152
EOF

tuned-adm profile webserver-profile

10.3 验证和监控

# 验证配置
sysctl net.core.somaxconn
ulimit -n
cat /proc/sys/fs/file-max

# 性能测试
# 使用 wrk 进行压力测试
dnf install -y wrk
wrk -t16 -c1000 -d60s http://localhost/

# 监控系统资源
htop
iostat -x 1
sar -u 1 10

十一、持续优化和最佳实践

11.1 建立性能基线

# 创建性能基线脚本
cat > /usr/local/bin/perf-baseline.sh <<'EOF'
#!/bin/bash
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOGFILE="/var/log/perf-baseline-${TIMESTAMP}.log"

echo "=== Performance Baseline $(date) ===" > $LOGFILE
echo "CPU Info:" >> $LOGFILE
lscpu >> $LOGFILE
echo -e "\nMemory Info:" >> $LOGFILE
free -h >> $LOGFILE
echo -e "\nDisk Info:" >> $LOGFILE
lsblk >> $LOGFILE
echo -e "\nNetwork Info:" >> $LOGFILE
ip a >> $LOGFILE
echo -e "\nKernel Parameters:" >> $LOGFILE
sysctl -a | grep -E "vm.swappiness|net.core.somaxconn|fs.file-max" >> $LOGFILE
echo -e "\nOpen Files Limit:" >> $LOGFILE
ulimit -n >> $LOGFILE
echo -e "\nActive Services:" >> $LOGFILE
systemctl list-units --state=active >> $LOGFILE

echo "Baseline saved to: $LOGFILE"
EOF

chmod +x /usr/local/bin/perf-baseline.sh

11.2 自动化监控脚本

# 创建监控脚本
cat > /usr/local/bin/perf-monitor.sh <<'EOF'
#!/bin/bash
# 性能监控脚本

INTERVAL=60
LOGDIR="/var/log/performance"
mkdir -p $LOGDIR

while true; do
    TIMESTAMP=$(date +%Y%m%d_%H%M%S)
    LOGFILE="${LOGDIR}/perf-${TIMESTAMP}.log"
    
    echo "=== $(date) ===" > $LOGFILE
    
    # CPU 使用率
    mpstat 1 1 >> $LOGFILE 2>&1
    
    # 内存使用
    free -h >> $LOGFILE 2>&1
    
    # I/O 统计
    iostat -x 1 1 >> $LOGFILE 2>&1
    
    # 网络统计
    sar -n DEV 1 1 >> $LOGFILE 2>&1
    
    # 进程排名(按 CPU)
    ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -20 >> $LOGFILE 2>&1
    
    # 系统负载
    uptime >> $LOGFILE 2>&1
    
    # 清理旧日志(保留最近 7 天)
    find $LOGDIR -name "perf-*.log" -mtime +7 -delete
    
    sleep $INTERVAL
done
EOF

chmod +x /usr/local/bin/perf-monitor.sh

# 创建 systemd 服务
cat > /etc/systemd/system/perf-monitor.service <<EOF
[Unit]
Description=Performance Monitor
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/perf-monitor.sh
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

systemctl enable perf-monitor
systemctl start perf-monitor

11.3 性能优化检查清单

# 创建检查清单脚本
cat > /usr/local/bin/perf-checklist.sh <<'EOF'
#!/bin/bash
echo "=== AlmaLinux Performance Optimization Checklist ==="
echo ""

check_pass() { echo -e "[\033[32mPASS\033[0m] $1"; }
check_warn() { echo -e "[\033[33mWARN\033[0m] $1"; }
check_fail() { echo -e "[\033[31mFAIL\033[0m] $1"; }

# 检查 swappiness
SWAP=$(cat /proc/sys/vm/swappiness)
if [ $SWAP -le 30 ]; then
    check_pass "vm.swappiness = $SWAP (recommended ≤ 30)"
else
    check_warn "vm.swappiness = $SWAP (recommended ≤ 30)"
fi

# 检查文件描述符限制
NOFILE=$(ulimit -n)
if [ $NOFILE -ge 65536 ]; then
    check_pass "ulimit -n = $NOFILE (recommended ≥ 65536)"
else
    check_fail "ulimit -n = $NOFILE (recommended ≥ 65536)"
fi

# 检查文件最大数
FILEMAX=$(cat /proc/sys/fs/file-max)
if [ $FILEMAX -ge 200000 ]; then
    check_pass "fs.file-max = $FILEMAX (recommended ≥ 200000)"
else
    check_warn "fs.file-max = $FILEMAX (recommended ≥ 200000)"
fi

# 检查 somaxconn
SOMAXCONN=$(cat /proc/sys/net/core/somaxconn)
if [ $SOMAXCONN -ge 65535 ]; then
    check_pass "net.core.somaxconn = $SOMAXCONN (recommended ≥ 65535)"
else
    check_warn "net.core.somaxconn = $SOMAXCONN (recommended ≥ 65535)"
fi

# 检查 tuned
if systemctl is-active tuned >/dev/null 2>&1; then
    check_pass "tuned is active (profile: $(tuned-adm active))"
else
    check_warn "tuned is not active"
fi

# 检查 THP
THP=$(cat /sys/kernel/mm/transparent_hugepage/enabled)
if [[ $THP == *"never"* ]]; then
    check_pass "Transparent Huge Pages disabled"
else
    check_warn "Transparent Huge Pages enabled (may impact DB performance)"
fi

# 检查 CPU governor
GOVERNOR=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null || echo "N/A")
if [ "$GOVERNOR" = "performance" ]; then
    check_pass "CPU governor = $GOVERNOR"
elif [ "$GOVERNOR" != "N/A" ]; then
    check_warn "CPU governor = $GOVERNOR (recommended: performance)"
fi

echo ""
echo "Checklist complete. Review warnings and failures above."
EOF

chmod +x /usr/local/bin/perf-checklist.sh

十二、常见问题和故障排查

12.1 性能问题诊断流程

# 1. 检查系统负载
uptime
top
htop

# 2. 检查 CPU 瓶颈
mpstat -P ALL 1
perf top

# 3. 检查内存瓶颈
free -h
cat /proc/meminfo
vmstat 1

# 4. 检查 I/O 瓶颈
iostat -x 1
iotop

# 5. 检查网络瓶颈
sar -n DEV 1
ss -s
netstat -s | grep -i listen

# 6. 检查进程
ps aux --sort=-%cpu | head
ps aux --sort=-%mem | head

# 7. 检查系统调用
strace -c -p 1234

12.2 常见性能问题及解决方案

问题 1:系统响应缓慢,CPU 使用率高

# 诊断
top  # 查看高 CPU 进程
perf top  # 查看内核函数热点

# 解决方案
# 1. 检查是否是短时峰值
sar -u 1 10

# 2. 如果是特定进程,调整其优先级
renice -n -10 -p <PID>

# 3. 如果是多进程竞争,使用 cgroups 限制
cgcreate -g cpu:/highpriority
cgset -r cpu.cfs_quota_us=80000 highpriority

问题 2:内存不足,频繁交换

# 诊断
free -h
vmstat 1  # 查看 si/so(交换入/出)
cat /proc/meminfo | grep -i swap

# 解决方案
# 1. 减少 swappiness
sysctl vm.swappiness=10

# 2. 增加物理内存或优化应用内存使用

# 3. 检查内存泄漏
valgrind --tool=memcheck --leak-check=full /usr/local/bin/myapp

# 4. 禁用不必要的服务释放内存
systemctl stop <service>

问题 3:网络连接缓慢或超时

# 诊断
ss -s  # 查看连接统计
netstat -an | grep TIME_WAIT | wc -l  # 查看 TIME_WAIT 数量
sar -n DEV 1  # 查看网络吞吐量

# 解决方案
# 1. 优化 TCP 参数
sysctl net.ipv4.tcp_tw_reuse=1
sysctl net.ipv4.tcp_fin_timeout=30

# 2. 增加连接队列
sysctl net.core.somaxconn=65535
sysctl net.ipv4.tcp_max_syn_backlog=65535

# 3. 检查防火墙规则
iptables -L -n -v

问题 4:磁盘 I/O 瓶颈

# 诊断
iostat -x 1  # 查看 %util 和 await
iotop  # 查看 I/O 进程

# 解决方案
# 1. 调整 I/O 调度器
echo kyber > /sys/block/sda/queue/scheduler

# 2. 增加队列深度
echo 256 > /sys/block/sda/queue/nr_requests

# 3. 优化文件系统挂载选项
mount -o remount,noatime,delalloc /data

# 4. 使用更快的存储(SSD)

十三、总结

AlmaLinux 性能优化是一个系统工程,需要从多个维度综合考虑:

  1. 内核参数:根据负载特征调整虚拟内存、网络栈和文件系统参数
  2. 资源限制:合理配置 ulimit 和 systemd 资源限制
  3. 文件系统:选择合适的挂载选项和 I/O 调度器
  4. CPU 和内存:优化调度器、NUMA 和透明大页
  5. 网络:调整 TCP 栈和网络接口参数
  6. 监控:建立基线,持续监控,及时发现性能退化

关键原则:

  • 测量优先:任何优化前都要先测量当前性能
  • 逐步调整:一次只修改一个参数,观察效果
  • 文档化:记录所有修改和效果,便于回滚和审计
  • 测试环境:先在测试环境验证,再应用到生产环境

通过本文提供的详细配置和工具,您可以系统地优化 AlmaLinux 系统,获得最佳性能表现。记住,没有一刀切的配置,最佳配置取决于您的具体工作负载和硬件环境。持续监控和调整是保持系统高性能的关键。