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

AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,即使是最优秀的操作系统,在默认配置下也可能无法充分发挥硬件潜力。当服务器出现响应缓慢、高负载或资源瓶颈时,系统性能优化就显得尤为重要。

性能优化不仅仅是技术挑战,更是系统稳定性的保障。通过合理的优化策略,我们可以:

  1. 提升系统响应速度:减少延迟,提高用户体验
  2. 提高资源利用率:让有限的硬件资源发挥最大效能
  3. 增强系统稳定性:避免因资源耗尽导致的服务中断
  4. 降低运营成本:通过优化减少对昂贵硬件升级的依赖

本文将从多个维度深入探讨 AlmaLinux 的性能优化策略,涵盖内核参数调整、资源管理、文件系统优化、网络调优等关键领域,并提供完整的实战案例和代码示例。

一、系统监控与性能分析基础

在进行任何优化之前,我们必须首先了解系统的当前状态。这一部分将介绍关键的监控工具和分析方法。

1.1 系统资源概览工具

1.1.1 使用 tophtop 实时监控

top 是最基本的系统监控工具,但 htop 提供了更友好的界面和更多功能。

# 安装 htop
sudo dnf install htop -y

# 运行 htop
htop

htop 中,我们可以:

  • 查看 CPU、内存、交换空间的使用情况
  • 识别占用资源最多的进程
  • 按不同维度排序(F6键)
  • 发送信号或结束进程

1.1.2 使用 vmstat 分析系统整体状态

vmstat 提供了关于进程、内存、I/O、中断和 CPU 活动的详细信息。

# 每2秒输出一次,共5次
vmstat 2 5

# 输出示例:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 123456  45678 789012   0    0    10    25  150  200  5  2 92  1  0
 0  0      0 123400  45678 789012   0    0     0     0  120  180  3  1 96  0  0

关键指标解读

  • r:运行队列长度(大于CPU核心数表示CPU瓶颈)
  • b:阻塞进程数
  • swpd:已使用的虚拟内存
  • si/so:交换区输入/输出(应接近0)
  • bi/bo:块设备I/O
  • us/sy:用户/系统CPU时间
  • id:CPU空闲时间
  • wa:I/O等待时间

1.1.3 使用 iostat 监控磁盘I/O

# 安装 sysstat 包
sudo dnf install sysstat -y

# 查看磁盘I/O统计(每2秒一次,共3次)
iostat -dx 2 3

# 输出示例:
Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm  %util
sda              2.50   15.00     10.00     60.00     0.00     2.00   0.00  11.76    0.50    1.20    0.02     4.00     4.00  0.30   0.50

关键指标

  • r/sw/s:每秒读/写次数
  • rkB/swkB/s:每秒读/写KB数
  • await:平均I/O等待时间(ms)
  • %util:磁盘利用率(接近100%表示磁盘瓶颈)

1.2 性能分析工具集

1.2.1 sar 系统活动报告

sar 可以收集、报告和保存系统活动信息。

# 安装 sysstat
sudo dnf install sysstat -y

# 启用 sar 自动收集(每10分钟收集一次,保留30天)
sudo systemctl enable --now sysstat

# 查看历史CPU使用情况
sar -u

# 查看历史内存使用情况
sar -r

# 查看特定时间的数据
sar -u -s 10:00:00 -e 12:00:00

1.2.2 perf 性能剖析工具

perf 是 Linux 内核自带的性能分析工具,可以深入到函数级别。

# 安装 perf
sudo dnf install perf -y

# 记录系统范围内的CPU事件(10秒)
perf record -a -g sleep 10

# 生成报告
perf report

# 分析特定进程
perf top -p <PID>

1.2.3 strace 系统调用跟踪

用于调试程序和分析系统调用。

# 跟踪特定进程的系统调用
strace -p <PID>

# 跟踪新命令的执行
strace ls -l

# 只跟踪特定系统调用
strace -e trace=open,read,write ls -l

# 输出到文件并统计
strace -c ls -l

二、内核参数优化策略

内核参数是系统性能调优的核心。通过调整 /proc/sys/ 下的参数,我们可以优化内存管理、网络性能、文件系统缓存等。

2.1 内核参数调整基础

2.1.1 临时调整与永久生效

临时调整(重启后失效):

# 临时调整TCP缓冲区大小
echo 8388608 > /proc/sys/net/core/rmem_max

永久调整

# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf

# 添加参数
net.core.rmem_max = 8388608

# 立即生效
sudo sysctl -p

2.2 内存管理优化

2.2.1 虚拟内存参数

# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf

# 添加以下内存优化参数
# 最大虚拟内存使用量(物理内存的1.5倍)
vm.max_map_count = 262144

# 内存过度分配策略(0:禁止过度分配, 1:允许过度分配, 2:保守策略)
vm.overcommit_memory = 1

# 过度分配百分比(仅当vm.overcommit_memory=2时有效)
vm.overcommit_ratio = 80

# 交换区使用策略(0:最佳性能, 1:最佳内存利用)
vm.swappiness = 10

# 内存回收策略(默认值 100)
vm.zone_reclaim_mode = 0

# 设置保留内存百分比
vm.admin_reserve_kbytes = 8192

# 用户进程可分配的最大物理内存(字节)
vm.user_reserve_kbytes = 131072

# 应用设置
sudo sysctl -p

参数详解

  • vm.max_map_count:限制进程的内存映射区域数量,对Elasticsearch、PostgreSQL等应用很重要
  • vm.overcommit_memory:控制内核是否允许过度分配内存
  • vm.swappiness:控制系统使用交换区的倾向性(0-100),值越低越倾向于使用物理内存
  • vm.zone_reclaim_mode:控制NUMA系统中的内存回收策略

2.2.2 缓存和缓冲区优化

# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf

# 添加缓存优化参数
# 控制脏页比例(占总内存的百分比)
vm.dirty_ratio = 15

# 控制后台脏页比例
vm.dirty_background_ratio = 5

# 脏页写入时间(秒)
vm.dirty_writeback_centisecs = 500

# 脏页到期时间(秒)
vm.dirty_expire_centisecs = 3000

# 页面缓存最大值(占总内存的百分比)
vm.vfs_cache_pressure = 100

# 应用设置
sudo sysctl -p

优化建议

  • 对于写密集型应用,适当降低 dirty_ratiodirty_background_ratio 可以减少数据丢失风险
  • 对于读密集型应用,可以适当提高 vfs_cache_pressure(>100)来减少缓存压力

2.3 网络性能优化

2.3.1 TCP/IP 核心参数

# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf

# TCP核心优化参数
# 启用TCP快速打开(客户端和服务器端)
net.ipv4.tcp_fastopen = 3

# 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.netfilter.nf_conntrack_max = 2000000

# TIME_WAIT状态连接的最大数量
net.ipv4.tcp_max_tw_buckets = 2000000

# 允许TIME_WAIT socket重新用于新TCP连接
net.ipv4.tcp_tw_reuse = 1

# 减少TIME_WAIT状态超时时间
net.ipv4.tcp_fin_timeout = 30

# TCP Keepalive参数
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10

# 最大半连接队列
net.ipv4.tcp_max_syn_backlog = 65536

# 最大ESTABLISHED状态连接数
net.core.somaxconn = 65536

# 应用设置
sudo sysctl -p

2.3.2 高性能网络参数(针对高并发场景)

# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf

# 高性能网络优化参数
# 增加接收队列
net.core.netdev_max_backlog = 50000

# 启用TCP时间戳
net.ipv4.tcp_timestamps = 1

# 启用TCP选择性确认
net.ipv4.tcp_sack = 1

# 启用TCP窗口缩放
net.ipv4.tcp_window_scaling = 1

# 增加内存压力下的TCP缓冲区自动调整
net.ipv4.tcp_moderate_rcvbuf = 1

# TCP拥塞控制算法(可选:bbr, cubic, htcp)
net.ipv4.tcp_congestion_control = bbr

# 禁用TCP慢启动
net.ipv4.tcp_slow_start_after_idle = 0

# 应用设置
sudo sysctl -p

BBR 拥塞控制算法: BBR (Bottleneck Bandwidth and RTT) 是 Google 开发的拥塞控制算法,特别适合高延迟、高带宽的网络环境。

# 检查当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control

# 如果系统不支持BBR,需要升级内核
sudo dnf install kernel-ml -y
sudo grub2-set-default 0
sudo reboot

# 启用BBR
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
sudo sysctl -p

2.4 文件系统优化

2.4.1 文件系统挂载参数

编辑 /etc/fstab 文件优化挂载参数:

# 备份原始 fstab
sudo cp /etc/fstab /etc/fstab.backup

# 编辑 fstab
sudo vi /etc/fstab

# 优化示例(针对SSD)
UUID=xxxx-xxxx-xxxx    /    ext4    defaults,noatime,nodiratime,discard,errors=remount-ro    0    1

# 优化示例(针对HDD)
UUID=xxxx-xxxx-xxxx    /data    ext4    defaults,noatime,barrier=0,data=writeback    0    2

参数详解

  • noatime:不更新文件访问时间,减少写操作
  • nodiratime:不更新目录访问时间
  • discard:启用SSD TRIM支持(SSD专用)
  • barrier=0:禁用写屏障(提高性能,但有数据丢失风险)
  • data=writeback:写回模式(提高性能,但一致性风险)

2.4.2 I/O调度器优化

# 查看当前I/O调度器
cat /sys/block/sda/queue/scheduler

# 输出示例:noop [deadline] cfq

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

# 永久修改(创建udev规则)
sudo tee /etc/udev/rules.d/60-ioscheduler.rules <<EOF
# 为所有NVMe设备设置none调度器
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"

# 为所有SSD设备设置noop调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"

# 为所有HDD设备设置deadline调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
EOF

# 重新加载udev规则
sudo udevadm control --reload-rules
sudo udevadm trigger

调度器选择指南

  • none / noop:适合SSD,无调度开销
  • deadline:适合HDD,保证请求截止时间
  • cfq:适合桌面系统,公平分配I/O带宽
  • kyber / mq-deadline:适合多队列设备(NVMe)

2.5 进程调度和CPU优化

2.5.1 CPU亲和性设置

# 查看CPU信息
lscpu

# 设置进程亲和性(将进程绑定到特定CPU核心)
taskset -p 0xF <PID>  # 绑定到前4个核心(二进制1111)

# 启动新进程时设置亲和性
taskset -c 0,1,2,3 my_command

# 查看进程亲和性
taskset -p <PID>

2.5.2 调整进程调度策略

# 查看进程调度策略
chrt -p <PID>

# 设置实时调度策略(需要root权限)
chrt -f -p 99 <PID>  # 设置为FIFO实时调度,优先级99

# 启动实时调度进程
chrt -f 99 my_command

# 设置普通调度策略
chrt -o -p 0 <PID>  # 设置为普通调度,优先级0

注意:实时调度策略可能导致系统不稳定,仅在必要时使用。

三、资源高效利用策略

3.1 CPU资源优化

3.1.1 进程优先级调整

# 使用nice调整优先级(范围-20到19,值越低优先级越高)
nice -n -10 my_command  # 高优先级运行

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

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

3.1.2 使用cgroups限制资源

# 安装cgroup工具
sudo dnf install libcgroup-tools -y

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

# 设置CPU使用限制(50%单核)
echo 50000 > /sys/fs/cgroup/cpu/limited/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/limited/cpu.cfs_period_us

# 设置内存限制(1GB)
echo 1G > /sys/fs/cgroup/memory/limited/memory.limit_in_bytes

# 在cgroup中运行进程
sudo cgexec -g cpu,memory:limited my_command

# 监控cgroup资源使用
sudo cgstat -l limited

3.1.3 多线程优化

对于多核系统,确保应用程序充分利用多线程:

# 设置环境变量优化多线程性能
export OMP_NUM_THREADS=4      # OpenMP线程数
export MKL_NUM_THREADS=4      # Intel MKL线程数
export OPENBLAS_NUM_THREADS=4 # OpenBLAS线程数

# 对于Java应用
java -XX:+UseNUMA -XX:+UseParallelGC -Xmx4g MyApp

# 对于Python多进程
import multiprocessing
multiprocessing.set_start_method('spawn')
multiprocessing.set_executable('/usr/bin/python3')

3.2 内存资源优化

3.2.1 内存使用分析

# 查看内存使用详情
free -h

# 查看进程内存使用
ps aux --sort=-%mem | head -10

# 查看共享内存使用
ipcs -m

# 查看内存映射
pmap -x <PID>

# 监控内存泄漏
valgrind --leak-check=full my_program

3.2.2 透明大页优化

# 查看当前透明大页状态
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag

# 启用透明大页(对于内存密集型应用)
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always > /sys/kernel/mm/transparent_hugepage/defrag

# 永久设置
sudo tee /etc/systemd/system/thp.service <<EOF
[Unit]
Description=Transparent Huge Pages

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

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable --now thp.service

3.2.3 内存压缩

# 启用zswap(内存压缩交换)
# 编辑内核启动参数
sudo vi /etc/default/grub

# 添加参数
GRUB_CMDLINE_LINUX="... zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=25"

# 更新grub并重启
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot

# 验证zswap状态
cat /sys/module/zswap/parameters/enabled

3.3 I/O资源优化

3.3.1 预读和缓存优化

# 调整块设备预读大小(单位:512字节扇区)
sudo blockdev --setra 8192 /dev/sda

# 永久设置(创建udev规则)
sudo tee /etc/udev/rules.d/60-blockdev.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/read_ahead_kb}="8192"
EOF

sudo udevadm control --reload-rules
sudo udevadm trigger

3.3.2 异步I/O优化

# 对于数据库应用,启用异步I/O
# PostgreSQL配置示例
sudo vi /var/lib/pgsql/data/postgresql.conf

# 添加或修改
shared_preload_libraries = 'pg_aio'
max_connections = 200
effective_io_concurrency = 200
maintenance_work_mem = 2GB
checkpoint_timeout = 15min
max_wal_size = 8GB

# MySQL配置示例
sudo vi /etc/my.cnf

# 添加
[mysqld]
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_size = 4G
innodb_read_io_threads = 8
innodb_write_io_threads = 8

3.3.3 RAID优化

# 查看RAID状态
cat /proc/mdstat

# 调整RAID读写策略
sudo mdadm --detail /dev/md0

# 设置RAID读策略(0:负载均衡, 1:优先读取奇偶校验, 2:优先读取数据)
echo "algorithm 2" > /sys/block/md0/md/algorithm

# 调整RAID同步速度
echo 50000 > /sys/block/md0/md/sync_speed_min
echo 200000 > /sys/block/md0/md/sync_speed_max

# 调整RAID重建速度
echo 50000 > /sys/block/md0/md/sync_force_parallel

四、网络性能优化实战

4.1 网络接口优化

4.1.1 网卡多队列

# 查看网卡队列数
ethtool -l eth0

# 启用多队列(如果支持)
sudo ethtool -L eth0 combined 8

# 调整队列长度
sudo ip link set eth0 txqueuelen 5000

# 查看和调整中断亲和性
cat /proc/interrupts | grep eth0

# 设置中断亲和性(将中断分配到不同CPU核心)
sudo systemctl enable irqbalance
sudo systemctl start irqbalance

4.1.2 网卡参数调优

# 查看当前设置
ethtool -k eth0

# 启用关键特性
sudo ethtool -K eth0 gro on    # 通用接收卸载
sudo ethtool -K eth0 gso on    # 通用发送卸载
sudo ethtool -K eth0 tso on    # TCP分段卸载
sudo ethtool -K eth0 rx on tx on  # 启用接收/发送校验和

# 调整环形缓冲区大小
sudo ethtool -G eth0 rx 4096 tx 4096

# 查看统计信息
ethtool -S eth0

4.2 防火墙优化

4.2.1 firewalld 性能优化

# 查看当前规则数量
sudo firewall-cmd --list-all

# 优化策略:减少不必要的规则
# 创建优化的区域配置
sudo firewall-cmd --permanent --new-policy optimized
sudo firewall-cmd --permanent --policy optimized --add-ingress-zone HOST
sudo firewall-cmd --permanent --policy optimized --add-egress-zone ANY
sudo firewall-cmd --permanent --policy optimized --set-target ACCEPT

# 对于高并发服务器,考虑使用nftables替代
sudo dnf install nftables -y
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl enable --now nftables

4.2.2 nftables 优化配置

# 创建优化的nftables配置
sudo tee /etc/nftables.conf <<EOF
#!/usr/sbin/nft -f

# 清空现有规则
flush ruleset

table inet filter {
    # 基础链
    chain input {
        type filter hook input priority 0; policy drop;

        # 允许本地回环
        iif "lo" accept

        # 允许已建立和相关连接
        ct state established,related accept

        # 允许ICMP
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept

        # 允许SSH(限制速率)
        tcp dport 22 ct state new limit rate 5/minute accept

        # 允许HTTP/HTTPS
        tcp dport {80, 443} accept

        # 丢弃无效包
        ct state invalid drop
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}
EOF

# 应用配置
sudo nft -f /etc/nftables.conf

4.3 负载均衡与连接优化

4.3.1 使用 HAProxy 进行TCP负载均衡

# 安装HAProxy
sudo dnf install haproxy -y

# 配置优化
sudo tee /etc/haproxy/haproxy.cfg <<EOF
global
    maxconn 100000
    nbthread 8
    tune.ssl.default-dh-param 2048
    tune.maxrewrite 1024
    tune.bufsize 32768

defaults
    mode tcp
    timeout connect 5s
    timeout client 30s
    timeout server 30s
    timeout http-request 10s
    option tcplog
    option dontlognull
    retries 3
    option redispatch
    maxconn 10000

frontend http_front
    bind *:80
    default_backend http_back

backend http_back
    balance leastconn
    option httpchk GET /health
    server web1 192.168.1.101:80 check inter 2000 rise 2 fall 3
    server web2 192.168.1.102:80 check inter 2000 rise 2 fall 3
    server web3 192.168.1.103:80 check inter 2000 rise 2 fall 3

listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats refresh 10s
EOF

# 启动HAProxy
sudo systemctl enable --now haproxy

4.3.2 使用 ipvs 进行内核级负载均衡

# 安装ipvsadm
sudo dnf install ipvsadm -y

# 加载ipvs模块
sudo modprobe ip_vs
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_wlc

# 配置ipvs规则
sudo ipvsadm -A -t 192.168.1.100:80 -s wlc
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.101:80 -g
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.102:80 -g
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.103:80 -g

# 查看ipvs状态
sudo ipvsadm -L -n --stats

# 保存配置
sudo ipvsadm-save > /etc/sysconfig/ipvsadm
sudo systemctl enable ipvsadm

五、应用层优化策略

5.1 Web服务器优化

5.1.1 Nginx 高性能配置

# 安装Nginx
sudo dnf install nginx -y

# 优化配置
sudo tee /etc/nginx/nginx.conf <<EOF
user nginx;
worker_processes auto;
worker_rlimit_nofile 100000;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 日志格式优化
    log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
                    '\$status \$body_bytes_sent "\$http_referer" '
                    '"\$http_user_agent" "\$http_x_forwarded_for" '
                    'rt=\$request_time uct="\$upstream_connect_time" '
                    'uht="\$upstream_header_time" urt="\$upstream_response_time"';

    access_log /var/log/nginx/access.log main;

    # 性能优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 1000;
    reset_timedout_connection on;
    client_body_timeout 10;
    send_timeout 2;

    # 缓冲区优化
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 4k;
    output_buffers 1 32k;
    postpone_output 1460;

    # 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;

    # 包含其他配置
    include /etc/nginx/conf.d/*.conf;
}
EOF

# 测试配置并重启
sudo nginx -t
sudo systemctl restart nginx

5.1.2 Apache 优化配置

# 安装Apache
sudo dnf install httpd -y

# 优化配置
sudo tee /etc/httpd/conf/httpd.conf <<EOF
ServerTokens Prod
ServerSignature Off
TraceEnable Off

# 性能优化
StartServers 8
MinSpareServers 8
MaxSpareServers 16
MaxRequestWorkers 400
MaxConnectionsPerChild 10000

# 超时设置
Timeout 60
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100

# 模块优化
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so

# MPM Event配置
<IfModule mpm_event_module>
    StartServers 4
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadLimit 64
    ThreadsPerChild 25
    MaxRequestWorkers 400
    MaxConnectionsPerChild 10000
</IfModule>

# Gzip压缩
<IfModule mod_deflate.c>
    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
    DeflateCompressionLevel 6
</IfModule>

# 缓存控制
<IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType image/jpg "access plus 1 year"
    ExpiresByType image/jpeg "access plus 1 year"
    ExpiresByType image/gif "access plus 1 year"
    ExpiresByType image/png "access plus 1 year"
    ExpiresByType text/css "access plus 1 month"
    ExpiresByType application/javascript "access plus 1 month"
</IfModule>
EOF

# 启动服务
sudo systemctl enable --now httpd

5.2 数据库优化

5.2.1 PostgreSQL 优化

# 安装PostgreSQL
sudo dnf install postgresql-server postgresql-contrib -y
sudo postgresql-setup --initdb

# 优化配置
sudo tee /var/lib/pgsql/data/postgresql.conf <<EOF
# 连接设置
max_connections = 200
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 64MB
maintenance_work_mem = 512MB

# WAL设置
wal_level = replica
wal_buffers = 16MB
checkpoint_timeout = 15min
max_wal_size = 4GB
min_wal_size = 1GB

# 自动清理
autovacuum = on
autovacuum_max_workers = 4
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50

# 日志设置
log_min_duration_statement = 500
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on

# 查询优化
random_page_cost = 1.1
effective_io_concurrency = 200
default_statistics_target = 100
EOF

# 配置客户端认证
sudo tee /var/lib/pgsql/data/pg_hba.conf <<EOF
# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust
host    all             all             ::1/128                 trust
host    all             all             192.168.1.0/24          md5
EOF

# 启动服务
sudo systemctl enable --now postgresql

# 调整内核参数以支持PostgreSQL
sudo tee -a /etc/sysctl.conf <<EOF
# PostgreSQL优化
kernel.shmmax = 2147483648
kernel.shmall = 524288
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
EOF
sudo sysctl -p

5.2.2 MySQL/MariaDB 优化

# 安装MariaDB
sudo dnf install mariadb-server -y

# 优化配置
sudo tee /etc/my.cnf.d/server.cnf <<EOF
[mysqld]
# 基础设置
user = mysql
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

# 连接设置
max_connections = 500
max_connect_errors = 100
connect_timeout = 10

# 内存优化
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1

# I/O优化
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_flush_neighbors = 0

# 查询缓存
query_cache_type = 0
query_cache_size = 0

# 日志设置
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

# 其他优化
tmp_table_size = 256M
max_heap_table_size = 256M
table_open_cache = 2000
table_definition_cache = 1400
EOF

# 启动服务
sudo systemctl enable --now mariadb

# 运行MySQL安全脚本
sudo mysql_secure_installation

5.3 应用性能监控

5.3.1 使用 Prometheus + Grafana 监控

# 安装Prometheus
sudo dnf install prometheus -y

# 配置Prometheus
sudo tee /etc/prometheus/prometheus.yml <<EOF
global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:
  - "rules.yml"

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']
  
  - job_name: 'postgres'
    static_configs:
      - targets: ['localhost:9187']
  
  - job_name: 'nginx'
    static_configs:
      - targets: ['localhost:9113']

  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:9104']
EOF

# 安装Node Exporter
sudo dnf install node_exporter -y
sudo systemctl enable --now node_exporter

# 安装PostgreSQL Exporter
sudo dnf install postgres_exporter -y
sudo systemctl enable --now postgres_exporter

# 安装Nginx Exporter
sudo dnf install nginx-prometheus-exporter -y
sudo systemctl enable --now nginx-prometheus-exporter

# 安装MySQL Exporter
sudo dnf install prometheus-mysqld-exporter -y
sudo systemctl enable --now mysqld_exporter

# 启动Prometheus
sudo systemctl enable --now prometheus

六、实战案例:解决高负载服务器问题

6.1 案例背景

假设我们有一台 AlmaLinux 服务器,配置为:

  • CPU:8核
  • 内存:32GB
  • 磁盘:2TB SSD
  • 运行服务:Nginx + PHP-FPM + MySQL
  • 问题:在高并发访问时,服务器响应缓慢,CPU使用率经常达到100%,内存使用率超过90%

6.2 诊断过程

6.2.1 初步诊断

# 1. 查看系统整体状态
top

# 2. 查看CPU使用详情
mpstat -P ALL 1

# 3. 查看内存使用详情
vmstat 1 10

# 4. 查看I/O情况
iostat -dx 1 5

# 5. 查看网络连接
ss -s
ss -tan | awk '{print $1}' | sort | uniq -c

# 6. 查看PHP-FPM进程
ps aux | grep php-fpm | wc -l

6.2.2 深入分析

# 1. 使用perf分析CPU热点
sudo perf top -p $(pgrep php-fpm)

# 2. 分析MySQL慢查询
sudo mysql -e "SHOW FULL PROCESSLIST;" | grep -v Sleep

# 3. 查看系统调用
sudo strace -c -p $(pgrep php-fpm)

# 4. 使用atop记录历史数据
sudo atop -w /var/log/atop.log 60  # 每60秒记录一次

# 5. 分析网络流量
sudo iftop -i eth0 -n

6.3 优化方案实施

6.3.1 内核参数优化

# 创建优化脚本
sudo tee /usr/local/bin/performance-tuning.sh <<'EOF'
#!/bin/bash

# 网络优化
cat >> /etc/sysctl.conf <<'SYSCTL'
# 网络优化
net.core.somaxconn = 65536
net.core.netdev_max_backlog = 50000
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10

# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.max_map_count = 262144
vm.overcommit_memory = 1

# 文件系统
fs.file-max = 2097152
fs.nr_open = 2097152
SYSCTL

# 调整用户限制
cat >> /etc/security/limits.conf <<'LIMITS'
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65535
* hard nproc 65535
LIMITS

# 应用设置
sysctl -p

echo "内核参数优化完成"
EOF

sudo chmod +x /usr/local/bin/performance-tuning.sh
sudo /usr/local/bin/performance-tuning.sh

6.3.2 PHP-FPM 优化

# 备份原配置
sudo cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup

# 优化配置
sudo tee /etc/php-fpm.d/www.conf <<'EOF'
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.backlog = 65536
listen.allowed_clients = 127.0.0.1

; 进程管理
pm = dynamic
pm.max_children = 200
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 50
pm.max_requests = 5000

; 进程空闲时间
pm.process_idle_timeout = 10s

; 内存限制
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 60
php_admin_value[max_input_time] = 60
php_admin_value[post_max_size] = 50M
php_admin_value[upload_max_filesize] = 50M

; 慢日志
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log

; 错误日志
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/error.log
php_admin_flag[log_errors] = on

; Opcache
php_admin_value[opcache.enable] = 1
php_admin_value[opcache.memory_consumption] = 512
php_admin_value[opcache.interned_strings_buffer] = 64
php_admin_value[opcache.max_accelerated_files] = 100000
php_admin_value[opcache.validate_timestamps] = 0
php_admin_value[opcache.save_comments] = 1
php_admin_value[opcache.fast_shutdown] = 1
php_admin_value[opcache.enable_cli] = 1
EOF

# 重启PHP-FPM
sudo systemctl restart php-fpm

# 查看状态
sudo systemctl status php-fpm
sudo php-fpm -t

6.3.3 MySQL 优化

# 优化MySQL配置
sudo tee /etc/my.cnf.d/server.cnf <<'EOF'
[mysqld]
# 基础设置
user = mysql
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock

# 连接设置
max_connections = 500
max_connect_errors = 100
connect_timeout = 10
wait_timeout = 600

# 内存优化
innodb_buffer_pool_size = 16G
innodb_buffer_pool_instances = 16
innodb_log_file_size = 2G
innodb_log_buffer_size = 128M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_neighbors = 0

# 查询缓存
query_cache_type = 0
query_cache_size = 0

# 日志设置
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1

# 临时表
tmp_table_size = 512M
max_heap_table_size = 512M

# 表缓存
table_open_cache = 4000
table_definition_cache = 2000

# 排序缓冲区
sort_buffer_size = 4M
join_buffer_size = 4M

# InnoDB额外设置
innodb_adaptive_hash_index = 1
innodb_change_buffering = all
innodb_old_blocks_time = 1000
innodb_stats_on_metadata = 0
innodb_stats_method = nulls_equal
EOF

# 重启MySQL
sudo systemctl restart mariadb

# 运行MySQL性能调优脚本
sudo mysql_tuner --user root --pass ''

6.3.4 Nginx 优化

# 优化Nginx配置
sudo tee /etc/nginx/nginx.conf <<'EOF'
user nginx;
worker_processes auto;
worker_rlimit_nofile 100000;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 4096;
    use epoll;
    multi_accept on;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    'rt=$request_time uct="$upstream_connect_time" '
                    'uht="$upstream_header_time" urt="$upstream_response_time"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 1000;
    reset_timedout_connection on;
    client_body_timeout 10;
    send_timeout 2;

    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 4k;
    output_buffers 1 32k;
    postpone_output 1460;

    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;

    include /etc/nginx/conf.d/*.conf;
}
EOF

# 优化PHP-FPM上游配置
sudo tee /etc/nginx/conf.d/php-fpm.conf <<'EOF'
upstream php-fpm {
    server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;
    keepalive 32;
}

server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        
        # 优化参数
        fastcgi_connect_timeout 60;
        fastcgi_send_timeout 60;
        fastcgi_read_timeout 60;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        fastcgi_temp_file_write_size 256k;
    }

    location ~ /\.ht {
        deny all;
    }
}
EOF

# 测试并重启Nginx
sudo nginx -t
sudo systemctl restart nginx

6.4 验证优化效果

# 1. 监控CPU使用率
mpstat -P ALL 1 10

# 2. 监控内存使用
free -h
vmstat 1 10

# 3. 监控I/O性能
iostat -dx 1 10

# 4. 监控网络连接
ss -s
ss -tan | awk '{print $1}' | sort | uniq -c

# 5. 监控PHP-FPM状态
sudo systemctl status php-fpm
ps aux | grep php-fpm | wc -l

# 6. 监控MySQL性能
sudo mysql -e "SHOW STATUS LIKE 'Threads_%';"
sudo mysql -e "SHOW STATUS LIKE 'Innodb_buffer_pool_%';"

# 7. 使用ab进行压力测试
sudo dnf install httpd-tools -y
ab -n 10000 -c 100 http://localhost/

6.5 持续监控与调优

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

# 配置sysstat自动收集
sudo systemctl enable --now sysstat

# 创建监控脚本
sudo tee /usr/local/bin/monitor-performance.sh <<'EOF'
#!/bin/bash

LOG_DIR="/var/log/performance"
mkdir -p $LOG_DIR

# 收集系统指标
echo "=== $(date) ===" >> $LOG_DIR/system.log
echo "CPU:" >> $LOG_DIR/system.log
mpstat 1 1 >> $LOG_DIR/system.log
echo "Memory:" >> $LOG_DIR/system.log
free -h >> $LOG_DIR/system.log
echo "Disk I/O:" >> $LOG_DIR/system.log
iostat -dx 1 1 >> $LOG_DIR/system.log
echo "Network:" >> $LOG_DIR/system.log
ss -s >> $LOG_DIR/system.log

# 清理旧日志(保留7天)
find $LOG_DIR -name "*.log" -mtime +7 -delete
EOF

sudo chmod +x /usr/local/bin/monitor-performance.sh

# 添加到crontab(每5分钟执行一次)
sudo crontab -l | { cat; echo "*/5 * * * * /usr/local/bin/monitor-performance.sh"; } | sudo crontab -

七、高级优化技巧

7.1 使用 eBPF 进行深度监控

# 安装bcc工具集
sudo dnf install bcc-tools -y

# 使用bpftrace进行性能分析
sudo dnf install bpftrace -y

# 示例:跟踪MySQL查询延迟
sudo bpftrace -e 'kprobe:do_query { @start[tid] = nsecs; }
kretprobe:do_query /@start[tid]/ { @latency = hist(nsecs - @start[tid]); delete(@start[tid]); }'

# 跟踪系统调用延迟
sudo bpftrace -e 'kprobe:sys_* { @start[tid] = nsecs; }
kretprobe:sys_* /@start[tid]/ { @latency = hist(nsecs - @start[tid]); delete(@start[tid]); }'

7.2 使用 systemd 进行资源限制

# 创建服务单元文件
sudo tee /etc/systemd/system/myapp.service <<'EOF'
[Unit]
Description=My Application
After=network.target

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

# 资源限制
LimitNOFILE=1048576
LimitNPROC=65535
MemoryMax=4G
MemoryHigh=3G
CPUQuota=200%
CPUWeight=100
IOWeight=100

# 安全设置
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/myapp
NoNewPrivileges=true

# 重启策略
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service

7.3 使用 cgroups v2 进行精细控制

# 挂载cgroup v2
sudo mount -t cgroup2 none /sys/fs/cgroup

# 创建cgroup
sudo mkdir -p /sys/fs/cgroup/app.slice

# 设置资源限制
echo "200000" > /sys/fs/cgroup/app.slice/cpu.max
echo "4G" > /sys/fs/cgroup/app.slice/memory.max
echo "100M" > /sys/fs/cgroup/app.slice/memory.high

# 将进程添加到cgroup
echo <PID> > /sys/fs/cgroup/app.slice/cgroup.procs

# 使用systemd集成
sudo systemctl set-property myapp.service MemoryMax=4G CPUQuota=200%

7.4 使用 NUMA 优化

# 查看NUMA拓扑
numactl --hardware

# 绑定进程到特定NUMA节点
numactl --cpunodebind=0 --membind=0 my_command

# 查看进程NUMA状态
numactl --show

# 优化MySQL使用NUMA
sudo tee /etc/systemd/system/mariadb.service.d/numa.conf <<'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/numactl --cpunodebind=0 --membind=0 /usr/sbin/mysqld $MYSQLD_OPTS
EOF

sudo systemctl daemon-reload
sudo systemctl restart mariadb

八、总结与最佳实践

8.1 优化检查清单

8.1.1 系统层面

  • [ ] 内核参数已优化(vm.swappiness, dirty_ratio等)
  • [ ] 文件系统挂载选项正确(noatime, discard等)
  • [ ] I/O调度器适合硬件类型
  • [ ] 用户资源限制已调整(ulimit)
  • [ ] 定期系统监控已配置

8.1.2 网络层面

  • [ ] TCP参数已优化(缓冲区、keepalive等)
  • [ ] 网卡多队列已启用
  • [ ] 防火墙规则已优化
  • [ ] 负载均衡配置正确

8.1.3 应用层面

  • [ ] Web服务器配置已优化
  • [ ] 数据库参数已调整
  • [ ] 缓存策略已实施
  • [ ] 日志级别适当

8.1.4 监控层面

  • [ ] 系统监控工具已安装
  • [ ] 应用性能监控已配置
  • [ ] 告警阈值已设置
  • [ ] 日志轮转已配置

8.2 性能优化原则

  1. 测量优先:在优化之前,先测量当前性能,建立基准
  2. 逐步调整:一次只调整一个参数,观察效果
  3. 理解原理:不要盲目应用参数,理解其作用机制
  4. 测试验证:在生产环境应用前,先在测试环境验证
  5. 持续监控:优化不是一次性工作,需要持续监控和调整
  6. 平衡取舍:性能、稳定性、安全性之间需要权衡

8.3 常见误区

  1. 过度优化:不必要的优化可能引入复杂性和风险
  2. 盲目复制:不同场景需要不同的优化策略
  3. 忽视监控:没有监控的优化是盲目的
  4. 忽略硬件:软件优化无法弥补硬件瓶颈
  5. 一次性调整:系统负载变化需要动态调整

8.4 推荐工具集

# 安装完整的性能分析工具集
sudo dnf install -y \
    sysstat \
    htop \
    iotop \
    iftop \
    nethogs \
    perf \
    bpftrace \
    bcc-tools \
    strace \
    ltrace \
    valgrind \
    gdb \
    tcpdump \
    wireshark-cli \
    atop \
    vmstat \
    iostat \
    mpstat \
    pidstat

8.5 持续优化流程

# 创建优化工作流脚本
sudo tee /usr/local/bin/optimization-workflow.sh <<'EOF'
#!/bin/bash

# 1. 收集当前性能数据
echo "=== 性能数据收集 $(date) ===" > /tmp/performance-report.txt
echo "系统负载:" >> /tmp/performance-report.txt
uptime >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt

echo "CPU使用率:" >> /tmp/performance-report.txt
mpstat 1 3 >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt

echo "内存使用:" >> /tmp/performance-report.txt
free -h >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt

echo "磁盘I/O:" >> /tmp/performance-report.txt
iostat -dx 1 3 >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt

echo "网络连接:" >> /tmp/performance-report.txt
ss -s >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt

echo "进程TOP10 CPU:" >> /tmp/performance-report.txt
ps aux --sort=-%cpu | head -11 >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt

echo "进程TOP10 内存:" >> /tmp/performance-report.txt
ps aux --sort=-%mem | head -11 >> /tmp/performance-report.txt

# 2. 分析瓶颈
echo "=== 瓶颈分析 ===" >> /tmp/performance-report.txt
if [ $(awk '/^r/ {print $1}' /proc/loadavg | cut -d. -f1) -gt $(nproc) ]; then
    echo "警告: CPU负载过高" >> /tmp/performance-report.txt
fi

MEM_FREE=$(free | awk '/Mem:/ {printf "%.0f", $4/$2 * 100}')
if [ $MEM_FREE -lt 10 ]; then
    echo "警告: 内存不足" >> /tmp/performance-report.txt
fi

# 3. 生成报告
cat /tmp/performance-report.txt | mail -s "性能报告 $(date)" admin@example.com

# 4. 清理
rm -f /tmp/performance-report.txt
EOF

sudo chmod +x /usr/local/bin/optimization-workflow.sh

# 添加到cron
sudo crontab -l | { cat; echo "0 */4 * * * /usr/local/bin/optimization-workflow.sh"; } | sudo crontab -

结语

AlmaLinux 性能优化是一个系统性工程,需要从内核参数、资源管理、应用配置、网络调优等多个维度综合考虑。通过本文提供的详细策略和实战案例,您应该能够:

  1. 系统性地诊断性能问题:使用各种监控工具识别瓶颈
  2. 科学地调整内核参数:理解每个参数的作用和适用场景
  3. 优化资源利用:合理分配CPU、内存、I/O资源
  4. 提升应用性能:针对不同应用进行专门优化
  5. 建立持续优化机制:通过监控和自动化工具保持系统最佳状态

记住,性能优化不是一蹴而就的,而是一个持续改进的过程。建议您:

  • 建立性能基线,定期对比
  • 在测试环境验证优化方案
  • 使用版本控制管理配置变更
  • 保持对新技术的关注和学习
  • 建立完善的监控和告警体系

通过这些实践,您将能够打造极速稳定的 AlmaLinux 系统,为业务提供强有力的技术支撑。