引言:为什么需要优化 AlmaLinux 服务器性能

在企业级环境中,服务器性能直接关系到业务的稳定性和用户体验。AlmaLinux 作为 CentOS 的稳定替代品,继承了 RHEL 的稳定性和安全性,但默认配置往往偏向于通用性而非极致性能。通过系统化的性能优化,我们可以显著提升服务器的响应速度、吞吐量和资源利用率。

性能优化的核心目标是:在现有硬件资源下,最大化系统性能,减少资源浪费,确保关键业务的稳定运行。优化不是一次性的,而是一个持续监控、分析和调整的过程。

一、系统级性能监控与分析

在进行任何优化之前,我们需要先了解系统的当前状态,识别瓶颈所在。

1.1 使用 sysstat 工具集监控系统资源

sysstat 是一套强大的系统监控工具,包含 sar、iostat、mpstat 等。

安装 sysstat:

# 安装 sysstat
sudo dnf install sysstat -y

# 启用 sysstat 每分钟收集数据(默认已启用,可检查 /etc/sysconfig/sysstat)
sudo systemctl enable sysstat
sudo systemctl start sysstat

常用监控命令:

# 实时查看 CPU 使用率(每秒刷新一次)
mpstat -P ALL 1

# 查看内存使用情况(-m 显示内存,-S 显示交换分区)
vmstat -m -S 1

# 查看磁盘 I/O 统计(-x 显示扩展信息)
iostat -x 1

# 查看网络流量(需要安装 netstat 或 ss)
ss -s

示例:使用 sar 分析历史性能数据

# 查看过去 1 小时的 CPU 使用情况
sar -u -s $(date -d "1 hour ago" +%H:%M:%S)

# 查看过去 1 小时的内存使用情况
sar -r -s $(date -d "1 hour ago" +%H:%M:%S)

# 查看过去 1 小时的磁盘 I/O 情况
sar -d -s $(date -d "1 hour ago" +%H:%M:%S)

1.2 使用 atop 进行高级监控

atop 是一个交互式监控工具,提供更详细的进程级信息。

安装 atop:

sudo dnf install atop -y
sudo systemctl enable atop
sudo systemctl start atop

使用 atop:

# 启动 atop(交互式界面)
atop

# 查看特定时间的记录(atop 默认记录历史数据)
atop -r /var/log/atop/atop_YYYYMMDD -b 14:00

1.3 使用 perf 进行性能剖析

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

安装 perf:

sudo dnf install perf -y

使用 perf 分析 CPU 性能:

# 记录 10 秒的 CPU 性能数据
perf record -a -g sleep 10

# 生成报告
perf report

使用 perf 分析系统调用:

# 记录系统调用
perf stat -e syscalls:sys_enter_* -a sleep 10

二、内核参数调整:突破性能瓶颈的核心

内核参数是系统性能优化的关键,通过调整这些参数,可以显著提升系统在高负载下的表现。

2.1 内核参数调整工具

使用 sysctl 临时调整:

# 查看当前参数值
sysctl net.core.somaxconn

# 临时调整(重启后失效)
sudo sysctl -w net.core.somaxconn=65535

永久调整(创建配置文件):

# 创建自定义配置文件
sudo tee /etc/sysctl.d/99-custom.conf <<EOF
# 网络连接优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535

# 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

# TIME_WAIT 连接回收优化
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 网络性能优化
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_max_tw_buckets = 2000000

# 内存管理优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 100
EOF

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

2.2 网络性能优化详解

2.2.1 TCP 连接优化

问题场景:高并发 Web 服务器出现大量 SYN_RECV 状态连接,导致服务不可用。

优化参数:

# 增大 SYN 缓冲区
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 开启 SYN Cookie 防护(防止 SYN 洪水攻击)
net.ipv4.tcp_syncookies = 1

# 调整 TIME_WAIT 状态回收
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0  # 在 NAT 环境下应关闭
net.ipv4.tcp_fin_timeout = 30

验证效果:

# 查看当前连接状态统计
ss -s

# 查看 TIME_WAIT 数量
ss -tan state time-wait | wc -l

2.2.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

# 增大网络设备队列
net.core.netdev_max_backlog = 30000

验证效果:

# 测试网络吞吐量(需要安装 iperf3)
iperf3 -s  # 服务器端
iperf3 -c <server_ip>  # 客户端

2.3 内存管理优化

2.3.1 调整交换分区策略

问题场景:系统频繁使用交换分区,导致响应变慢。

优化参数:

# 降低交换分区使用倾向(0-100,值越小越倾向于使用物理内存)
vm.swappiness = 10

# 调整脏页比例
vm.dirty_ratio = 15          # 系统脏页占内存百分比,超过此值开始同步写回
vm.dirty_background_ratio = 5 # 后台脏页百分比,超过此值开始后台写回

# 调整脏页年龄(秒)
vm.dirty_expire_centisecs = 3000

验证效果:

# 查看交换分区使用情况
free -h
vmstat -S 1

# 查看脏页状态
cat /proc/vmstat | grep dirty

2.3.2 文件系统缓存优化

问题场景:频繁访问大量小文件时,inode 缓存不足。

优化参数:

# 调整 VFS 缓存压力(100 为默认值,值越大越积极回收缓存)
vm.vfs_cache_pressure = 100

# 增大 dentry 缓存
# 这个参数在 /etc/sysctl.conf 中无法直接设置,需要通过其他方式

验证效果:

# 查看缓存使用情况
cat /proc/meminfo | grep -E "Cached|Slab"

# 查看 slab 分配器信息
cat /proc/slabinfo | head -10

2.4 I/O 调度器优化

2.4.1 选择合适的 I/O 调度器

问题场景:数据库服务器磁盘 I/O 延迟高。

查看当前调度器:

# 查看所有磁盘的调度器
cat /sys/block/*/queue/scheduler

# 查看特定磁盘(如 sda)
cat /sys/block/sda/queue/scheduler

不同调度器适用场景:

  • mq-deadline:适合数据库等随机读写场景(默认)
  • bfq:适合桌面系统,提供公平的 I/O 分配
  • none:适合 NVMe SSD,不需要额外调度

临时修改调度器:

# 修改为 mq-deadline(适合数据库)
echo mq-deadline > /sys/block/sda/queue/scheduler

# 修改为 none(适合 NVMe SSD)
echo none > /sys/block/nvme0n1/queue/scheduler

永久修改(创建 udev 规则):

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

# 为所有 SATA 磁盘设置 mq-deadline 调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="mq-deadline"
EOF

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

2.4.2 调整 I/O 队列深度

问题场景:高并发写入时,I/O 队列过长导致延迟增加。

调整队列深度:

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

# 调整队列深度(默认 128,可增大到 1024)
echo 1024 > /sys/block/sda/queue/nr_requests

# 永久调整(通过 udev 规则)
sudo tee /etc/udev/rules.d/70-io-queue-depth.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/nr_requests}="1024"
EOF

2.5 NUMA 优化

问题场景:多路 CPU 服务器上,内存访问不均衡导致性能下降。

查看 NUMA 拓扑:

# 查看 NUMA 节点信息
numactl --hardware

# 查看当前进程的 NUMA 分配策略
numactl --show

优化策略:

# 启动进程时指定 NUMA 节点(例如绑定到节点 0)
numactl --cpunodebind=0 --membind=0 <command>

# 调整内存分配策略(0-2,0 表示优先本地内存,2 表示允许远程内存)
echo 0 > /proc/sys/kernel/numa_balancing

三、文件系统优化

3.1 XFS 文件系统优化

XFS 是 AlmaLinux 默认的文件系统,适合大文件和高并发场景。

创建优化的 XFS 文件系统:

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

# 重新挂载并优化(针对数据库场景)
mount -o remount,noatime,nodiratime,logbufs=8,logbsize=256k /data

# 永久生效(修改 /etc/fstab)
sudo tee -a /etc/fstab <<EOF
/dev/sdb1 /data xfs noatime,nodiratime,logbufs=8,logbsize=256k 0 0
EOF

XFS 性能调优参数:

# 调整 XFS 日志缓冲区(针对高写入负载)
# 临时调整
xfs_io -c "logbufs 8" /data
xfs_io -c "logbsize 256k" /data

# 查看当前参数
xfs_info /data

3.2 ext4 文件系统优化

如果使用 ext4 文件系统,可以进行以下优化:

创建优化的 ext4 文件系统:

# 创建文件系统时指定优化参数
mkfs.ext4 -E lazy_itable_init=1,lazy_journal_init=1 -O extent,uninit_bg /dev/sdb1

# 挂载优化
mount -o remount,noatime,nodiratime,delalloc,barrier=0 /data

# 永久生效
sudo tee -a /etc/fstab <<EOF
/dev/sdb1 /data ext4 noatime,nodiratime,delalloc,barrier=0 0 2
EOF

3.3 文件系统缓存优化

问题场景:大量小文件读取时,dentry 和 inode 缓存不足。

优化策略:

# 增大 dentry 缓存(需要调整内核参数)
# 在 /etc/sysctl.d/99-memory.conf 中添加
vm.vfs_cache_pressure = 50  # 降低回收压力

# 调整 min_free_kbytes(系统保留的最小空闲内存)
vm.min_free_kbytes = 65536  # 64MB,根据内存大小调整

四、进程与资源管理优化

4.1 使用 systemd 进行资源限制

systemd 是现代 Linux 的初始化系统,可以精确控制进程资源。

创建自定义服务文件:

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

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

# 资源限制
MemoryLimit=2G          # 内存限制
CPUQuota=50%            # CPU 使用率限制(50% 单核)
TasksMax=500            # 最大进程/线程数
Nice=10                 # 优先级(-20 到 19,值越大优先级越低)

# 安全限制
NoNewPrivileges=true     # 禁止获取新权限
PrivateTmp=true          # 使用私有 /tmp
ProtectSystem=strict     # 只读系统目录
ProtectHome=true         # 禁止访问 /home

Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

# 重新加载并启动
sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp

4.2 使用 cgroups 进行精细控制

cgroups 是 Linux 内核功能,用于限制和隔离进程资源。

创建自定义 cgroup:

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

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

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

# 设置内存限制(2GB)
sudo cgset -r memory.limit_in_bytes=2G critical_app

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

4.3 使用 numactl 进行 NUMA 绑定

问题场景:多路 CPU 服务器上,进程在 NUMA 节点间迁移导致性能下降。

解决方案:

# 查看 CPU 和 NUMA 拓扑
numactl --hardware

# 启动时绑定到特定 NUMA 节点
numactl --cpunodebind=0 --membind=0 /usr/bin/myapp

# 绑定到特定 CPU 核心
numactl --physcpubind=0,1,2,3 --membind=0 /usr/bin/myapp

# 创建 systemd 服务实现自动绑定
sudo tee /etc/systemd/system/numa-bound-app.service <<EOF
[Unit]
Description=NUMA Bound Application
After=network.target

[Service]
ExecStart=/usr/bin/numactl --cpunodebind=0 --membind=0 /usr/bin/myapp
Restart=always

[Install]
WantedBy=multi-user.target
EOF

4.4 进程优先级调整

使用 nice 和 renice:

# 启动时设置优先级(-20 到 19,值越小优先级越高)
nice -n -10 /usr/bin/critical-app

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

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

使用 systemd 设置优先级:

# 在服务文件中设置
[Service]
Nice=-10

五、网络性能深度优化

5.1 网络接口参数优化

查看和调整网卡参数:

# 查看当前参数
ethtool -k eth0

# 关闭 TCP 分段卸载(TSO)以减少 CPU 使用(某些场景)
sudo ethtool -K eth0 tso off

# 关闭 LRO/GRO(大接收卸载)以减少延迟
sudo ethtool -K eth0 gro off
sudo ethtool -K eth0 lro off

# 调整环形缓冲区大小(增加缓冲区以减少丢包)
sudo ethtool -G eth0 rx 4096 tx 4096

# 查看当前设置
ethtool -g eth0

永久生效(创建 systemd 服务):

sudo tee /etc/systemd/system/eth0-optimize.service <<EOF
[Unit]
Description=Network Interface Optimization
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ethtool -G eth0 rx 4096 tx 4096
ExecStart=/usr/sbin/ethtool -K eth0 gro off
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable eth0-optimize.service
sudo systemctl start eth0-optimize.service

5.2 中断亲和性优化

问题场景:网络中断集中在少数 CPU 核心,导致负载不均衡。

优化步骤:

# 查看网络中断分布
cat /proc/interrupts | grep eth0

# 查看当前中断亲和性
cat /proc/irq/*/smp_affinity

# 设置中断亲和性(将中断分散到多个核心)
# 例如,将 eth0 的中断分配到 CPU 0-3
for irq in $(grep eth0 /proc/interrupts | awk '{print $1}' | sed 's/://'); do
    echo f > /proc/irq/$irq/smp_affinity
done

# 永久配置(创建 systemd 服务)
sudo tee /etc/systemd/system/irq-affinity.service <<EOF
[Unit]
Description=IRQ Affinity Optimization
After=network.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'for irq in \$(grep eth0 /proc/interrupts | awk "{print \$1}" | sed "s/://"); do echo f > /proc/irq/\$irq/smp_affinity; done'
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

5.3 TCP 拥塞控制算法

查看当前算法:

sysctl net.ipv4.tcp_congestion_control

选择合适的算法:

  • cubic:默认算法,适合大多数场景
  • bbr:Google 开发,适合高延迟、高带宽场景(如跨国传输)
  • htcp:适合高带宽、长距离网络

启用 BBR:

# 临时启用
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr

# 永久启用
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.d/99-network.conf
sudo sysctl -p /etc/sysctl.d/99-network.conf

# 验证
sysctl net.ipv4.tcp_congestion_control

六、高级优化策略

6.1 Transparent Huge Pages (THP) 优化

问题场景:数据库应用(如 Redis、MongoDB)在 THP 开启时性能下降。

查看 THP 状态:

cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag

禁用 THP(针对数据库服务器):

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

# 永久禁用(创建 systemd 服务)
sudo tee /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages
Before=database.service

[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

sudo systemctl enable disable-thp.service

6.2 CPU 频率调节策略

查看当前策略:

cpupower frequency-info

设置性能模式(适合服务器):

# 安装 cpupower
sudo dnf install kernel-tools -y

# 设置性能模式(所有 CPU)
sudo cpupower frequency-set -g performance

# 永久生效(创建 systemd 服务)
sudo tee /etc/systemd/system/cpu-performance.service <<EOF
[Unit]
Description=CPU Performance Mode
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/cpupower frequency-set -g performance
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl enable cpu-performance.service

6.3 中断负载均衡

安装 irqbalance:

sudo dnf install irqbalance -y
sudo systemctl enable irqbalance
sudo systemctl start irqbalance

配置 irqbalance:

# 编辑配置文件
sudo tee /etc/sysconfig/irqbalance <<EOF
# 启用 irqbalance
IRQBALANCE_ARGS="--powerthresh=1 --deepthresh=1"

# 禁用特定中断的均衡(例如,将网络中断绑定到特定 CPU)
# 在 /etc/irqbalance.conf 中添加
EOF

七、应用层优化建议

7.1 Web 服务器优化(Nginx)

Nginx 配置优化:

# /etc/nginx/nginx.conf

worker_processes auto;  # 自动设置为 CPU 核心数
worker_connections 65535;  # 每个工作进程的最大连接数
worker_rlimit_nofile 65535;  # 工作进程可打开的文件描述符限制

events {
    use epoll;  # 使用 epoll 事件模型
    worker_connections 65535;
    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;
    output_buffers 1 32k;
    postpone_output 1460;

    # 超时设置
    client_header_timeout 30s;
    client_body_timeout 30s;
    send_timeout 30s;
    keepalive_timeout 65;

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

    # TCP 优化
    tcp_nopush on;
    tcp_nodelay on;
    reset_timedout_connection on;
    client_body_timeout 10;
    send_timeout 2;
}

系统级 Nginx 优化:

# 增加 Nginx 进程可打开的文件描述符限制
sudo tee /etc/security/limits.d/nginx.conf <<EOF
nginx       soft    nofile      65535
nginx       hard    nofile      65535
EOF

# 在 systemd 服务中设置
sudo tee /etc/systemd/system/nginx.service.d/limits.conf <<EOF
[Service]
LimitNOFILE=65535
LimitNPROC=65535
EOF

sudo systemctl daemon-reload

7.2 数据库优化(MySQL/MariaDB)

MySQL 配置优化(my.cnf):

[mysqld]
# 基础设置
user = mysql
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock

# 连接设置
max_connections = 1000
max_connect_errors = 100000
connect_timeout = 10
wait_timeout = 600

# 缓冲区设置(根据内存调整)
innodb_buffer_pool_size = 4G  # 通常设置为总内存的 50-70%
innodb_buffer_pool_instances = 8  # 每个实例至少 1GB
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M

# I/O 优化
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2  # 平衡性能和安全性
innodb_io_capacity = 2000  # SSD 设置更高值
innodb_io_capacity_max = 4000

# 查询缓存(MySQL 8.0+ 已移除,适用于 5.7)
query_cache_type = 0
query_cache_size = 0

# 临时表设置
tmp_table_size = 256M
max_heap_table_size = 256M

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

# 其他优化
innodb_old_blocks_time = 1000
innodb_read_io_threads = 8
innodb_write_io_threads = 8

系统级 MySQL 优化:

# 增加 MySQL 进程可打开的文件描述符限制
sudo tee /etc/security/limits.d/mysql.conf <<EOF
mysql       soft    nofile      65535
mysql       hard    nofile      65535
EOF

# 调整内核参数(针对数据库)
sudo tee /etc/sysctl.d/99-mysql.conf <<EOF
# 提高文件系统缓存压力,减少交换
vm.vfs_cache_pressure = 50

# 增大最大映射内存区域(防止 mmap 问题)
vm.max_map_count = 262144

# 调整网络参数
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
EOF

sudo sysctl -p /etc/sysctl.d/99-mysql.conf

7.3 Redis 优化

Redis 配置优化(redis.conf):

# 内存设置
maxmemory 4gb  # 根据系统内存设置
maxmemory-policy allkeys-lru  # 内存不足时的策略

# 持久化设置(根据需求调整)
save 900 1
save 300 10
save 60 10000
rdbcompression yes
rdbchecksum yes

# 网络设置
bind 0.0.0.0
port 6379
tcp-backlog 65535
timeout 0
tcp-keepalive 300

# 性能设置
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

# 慢查询日志
slowlog-log-slower-than 10000
slowlog-max-len 128

# 进程设置
daemonize yes
pidfile /var/run/redis/redis.pid
logfile /var/log/redis/redis.log

系统级 Redis 优化:

# 禁用 THP(Redis 官方推荐)
sudo tee /etc/systemd/system/disable-thp.service <<EOF
[Unit]
Description=Disable Transparent Huge Pages
Before=redis.service

[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

sudo systemctl enable disable-thp.service

# 增加 Redis 进程可打开的文件描述符限制
sudo tee /etc/security/limits.d/redis.conf <<EOF
redis       soft    nofile      65535
redis       hard    nofile      65535
EOF

# 调整内核参数
sudo tee /etc/sysctl.d/99-redis.conf <<EOF
# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5

# 网络优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 内存映射限制
vm.max_map_count = 262144
EOF

sudo sysctl -p /etc/sysctl.d/99-redis.conf

八、自动化优化脚本

8.1 系统性能优化脚本

#!/bin/bash
# system-optimize.sh - AlmaLinux 系统性能优化脚本

set -e

LOG_FILE="/var/log/system-optimize.log"
SYSCTL_CONF="/etc/sysctl.d/99-optimized.conf"

# 日志函数
log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}

# 检查是否为 root 用户
if [[ $EUID -ne 0 ]]; then
   echo "此脚本必须以 root 权限运行" 
   exit 1
fi

log "开始系统性能优化..."

# 1. 备份现有配置
log "备份现有 sysctl 配置..."
cp /etc/sysctl.conf /etc/sysctl.conf.backup.$(date +%Y%m%d)

# 2. 创建优化的 sysctl 配置
log "创建优化的 sysctl 配置..."
cat > "$SYSCTL_CONF" <<'EOF'
# 网络优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65535
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_max_tw_buckets = 2000000
net.ipv4.tcp_congestion_control = bbr

# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.vfs_cache_pressure = 100
vm.min_free_kbytes = 65536
vm.max_map_count = 262144

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

# 安全优化(可选,根据需求调整)
kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
EOF

# 3. 应用配置
log "应用 sysctl 配置..."
sysctl -p "$SYSCTL_CONF"

# 4. 调整文件描述符限制
log "调整文件描述符限制..."
cat > /etc/security/limits.d/99-nofile.conf <<'EOF'
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
EOF

# 5. 禁用 THP(针对数据库服务器)
log "禁用 Transparent Huge Pages..."
cat > /etc/systemd/system/disable-thp.service <<'EOF'
[Unit]
Description=Disable Transparent Huge Pages
After=multi-user.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.service
systemctl start disable-thp.service

# 6. 设置 CPU 性能模式
log "设置 CPU 性能模式..."
if command -v cpupower &> /dev/null; then
    cpupower frequency-set -g performance
    cat > /etc/systemd/system/cpu-performance.service <<'EOF'
[Unit]
Description=CPU Performance Mode
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/cpupower frequency-set -g performance
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF
    systemctl enable cpu-performance.service
    systemctl start cpu-performance.service
fi

# 7. 安装并配置 sysstat
log "安装 sysstat..."
dnf install -y sysstat
systemctl enable sysstat
systemctl start sysstat

# 8. 优化 I/O 调度器(针对 SATA 磁盘)
log "优化 I/O 调度器..."
for disk in /sys/block/sd*/queue/scheduler; do
    if [[ -f "$disk" ]]; then
        echo mq-deadline > "$disk"
    fi
done

# 9. 创建 udev 规则以保持优化
log "创建 udev 规则..."
cat > /etc/udev/rules.d/60-ioscheduler.rules <<'EOF'
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="mq-deadline"
ACTION=="add|change", KERNEL=="nvme*[0-9]*", ATTR{queue/scheduler}="none"
EOF

udevadm control --reload-rules
udevadm trigger

log "优化完成!请重启系统以使所有更改生效。"
log "日志文件: $LOG_FILE"

8.2 性能监控脚本

#!/bin/bash
# performance-monitor.sh - 性能监控脚本

INTERVAL=5
DURATION=3600  # 监控 1 小时
LOG_DIR="/var/log/performance"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)

mkdir -p "$LOG_DIR"

echo "开始性能监控,间隔: ${INTERVAL}s,持续: ${DURATION}s"
echo "日志目录: $LOG_DIR"

for ((i=0; i<$DURATION; i++)); do
    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 "%.2f", $3/$2 * 100.0}')
    
    # 负载平均值
    LOAD=$(cat /proc/loadavg | awk '{print $1","$2","$3}')
    
    # 磁盘 I/O
    DISK_IO=$(iostat -x 1 1 | grep -A1 "Device" | tail -n +3 | awk '{print $1","$3","$4","$10}' | head -1)
    
    # 网络流量
    NET_RX=$(cat /proc/net/dev | grep eth0 | awk '{print $2}')
    NET_TX=$(cat /proc/net/dev | grep eth0 | awk '{print $10}')
    
    # 记录到日志
    echo "$TIMESTAMP,CPU:$CPU_USAGE,MEM:$MEM_USAGE,LOAD:$LOAD,DISK:$DISK_IO,NET_RX:$NET_RX,NET_TX:$NET_TX" >> "$LOG_DIR/perf_${TIMESTAMP}.log"
    
    sleep $INTERVAL
done

echo "监控完成"

九、优化效果验证

9.1 基准测试工具

CPU 基准测试:

# 安装 stress-ng
sudo dnf install stress-ng -y

# 测试 CPU 性能
stress-ng --cpu 4 --cpu-method matrixprod --timeout 60s --metrics-brief

# 测试内存带宽
stress-ng --matrix 0 --timeout 60s --metrics-brief

磁盘 I/O 基准测试:

# 安装 fio
sudo dnf install fio -y

# 随机读写测试
fio --name=randread --ioengine=libaio --iodepth=64 --rw=randread --bs=4k --size=1G --numjobs=4 --runtime=60 --group_reporting

# 顺序写入测试
fio --name=seqwrite --ioengine=libaio --iodepth=64 --rw=write --bs=1M --size=1G --numjobs=1 --runtime=60 --group_reporting

网络基准测试:

# 安装 iperf3
sudo dnf install iperf3 -y

# 服务器端
iperf3 -s

# 客户端(在另一台机器)
iperf3 -c <server_ip> -t 60 -P 4

9.2 监控优化效果

使用 sar 查看历史数据:

# 查看 CPU 使用率
sar -u -f /var/log/sa/sa$(date +%d) -s 10:00:00

# 查看内存使用率
sar -r -f /var/log/sa/sa$(date +%d) -s 10:00:00

# 查看磁盘 I/O
sar -d -f /var/log/sa/sa$(date +%d) -s 10:00:00

使用 atop 查看历史记录:

# 查看特定时间的记录
atop -r /var/log/atop/atop_$(date +%Y%m%d) -b 14:00

十、最佳实践与注意事项

10.1 优化原则

  1. 先监控后优化:不要盲目调整参数,先通过监控工具识别瓶颈
  2. 小步调整:每次只调整少量参数,观察效果后再继续
  3. 测试环境验证:在生产环境应用前,先在测试环境验证
  4. 记录变更:详细记录所有参数调整,便于回滚
  5. 持续监控:优化不是一次性的,需要持续监控和调整

10.2 常见误区

  1. 过度优化:不是所有参数都需要调整,默认配置通常适合大多数场景
  2. 忽略硬件限制:软件优化无法突破硬件瓶颈
  3. 不考虑业务特点:不同业务场景需要不同的优化策略
  4. 一次性调整过多:难以定位问题,容易导致系统不稳定

10.3 回滚策略

创建回滚脚本:

#!/bin/bash
# rollback.sh - 优化回滚脚本

# 恢复 sysctl 配置
if [[ -f /etc/sysctl.conf.backup.$(date +%Y%m%d) ]]; then
    cp /etc/sysctl.conf.backup.$(date +%Y%m%d) /etc/sysctl.conf
    sysctl -p
fi

# 删除自定义配置
rm -f /etc/sysctl.d/99-optimized.conf
rm -f /etc/systemd/system/disable-thp.service
rm -f /etc/systemd/system/cpu-performance.service

# 重新加载 systemd
systemctl daemon-reload

# 恢复 THP
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always > /sys/kernel/mm/transparent_hugepage/defrag

# 恢复 CPU 调节器
if command -v cpupower &> /dev/null; then
    cpupower frequency-set -g ondemand
fi

echo "回滚完成,请重启系统"

结论

AlmaLinux 性能优化是一个系统工程,需要从内核参数、文件系统、进程管理、网络优化等多个维度综合考虑。通过本文提供的策略和工具,您可以系统地识别和解决性能瓶颈。

关键要点:

  1. 监控先行:使用 sysstat、atop、perf 等工具识别瓶颈
  2. 参数调整:根据业务特点调整内核参数,特别是网络和内存相关参数
  3. 资源管理:使用 systemd 和 cgroups 精确控制进程资源
  4. 持续优化:性能优化是一个持续的过程,需要定期评估和调整

记住,没有银弹,每个系统的优化策略都应该是独特的,基于实际的监控数据和业务需求。建议在测试环境充分验证后,再逐步应用到生产环境。