引言:为什么需要优化 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 优化原则
- 先监控后优化:不要盲目调整参数,先通过监控工具识别瓶颈
- 小步调整:每次只调整少量参数,观察效果后再继续
- 测试环境验证:在生产环境应用前,先在测试环境验证
- 记录变更:详细记录所有参数调整,便于回滚
- 持续监控:优化不是一次性的,需要持续监控和调整
10.2 常见误区
- 过度优化:不是所有参数都需要调整,默认配置通常适合大多数场景
- 忽略硬件限制:软件优化无法突破硬件瓶颈
- 不考虑业务特点:不同业务场景需要不同的优化策略
- 一次性调整过多:难以定位问题,容易导致系统不稳定
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 性能优化是一个系统工程,需要从内核参数、文件系统、进程管理、网络优化等多个维度综合考虑。通过本文提供的策略和工具,您可以系统地识别和解决性能瓶颈。
关键要点:
- 监控先行:使用 sysstat、atop、perf 等工具识别瓶颈
- 参数调整:根据业务特点调整内核参数,特别是网络和内存相关参数
- 资源管理:使用 systemd 和 cgroups 精确控制进程资源
- 持续优化:性能优化是一个持续的过程,需要定期评估和调整
记住,没有银弹,每个系统的优化策略都应该是独特的,基于实际的监控数据和业务需求。建议在测试环境充分验证后,再逐步应用到生产环境。
