引言:为什么需要对 AlmaLinux 进行性能调优?
AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,默认的内核参数和系统配置往往是为了兼容性和通用性而设计的,并非针对特定硬件或工作负载进行优化。在高并发、大数据量或低延迟要求的场景下,未调优的系统可能无法充分利用硬件资源,导致性能瓶颈。
本文将深入探讨如何通过调整内核参数、优化文件系统、管理进程和内存等方式,挖掘 AlmaLinux 的性能极限。我们将从基础概念入手,逐步深入到实战调优,并提供详细的代码示例和解释,帮助你构建一个高效、稳定的 AlmaLinux 系统环境。
一、性能调优前的准备工作
在进行任何调优之前,了解当前系统的状态至关重要。盲目修改参数可能导致系统不稳定甚至崩溃。
1.1 系统基准测试工具
使用基准测试工具可以量化系统性能,为调优提供参考依据。
sysbench
sysbench 是一个模块化的、跨平台的基准测试工具,支持 CPU、内存、磁盘 I/O 和数据库测试。
安装 sysbench:
sudo dnf install epel-release -y
sudo dnf install sysbench -y
CPU 基准测试示例: 计算 10000 以内的质数,测试 CPU 运算能力。
sysbench cpu --cpu-max-prime=20000 run
输出解读关键点:
- events per second: 每秒完成的事件数,数值越高越好。
- latency (avg/stddev): 平均延迟和标准差,数值越低越好。
iostat (来自 sysstat 包)
用于监控磁盘 I/O 统计信息。
安装 sysstat:
sudo dnf install sysstat -y
实时监控磁盘 I/O (每 2 秒刷新一次):
iostat -xz 2
输出解读关键点:
- %util: 磁盘利用率,接近 100% 表示磁盘瓶颈。
- await: I/O 请求的平均等待时间(毫秒),过高表示磁盘响应慢。
- r/s / w/s: 每秒读/写次数。
1.2 监控系统资源
在调优过程中,需要实时监控资源使用情况。
htop
比 top 更直观的进程查看器。
sudo dnf install htop -y
htop
使用技巧:
- 按
F6可以按 CPU%、MEM% 等排序。 - 按
F9发送信号(如 SIGTERM 或 SIGKILL)终止进程。 - 按
F2进入设置,可以配置颜色方案和显示选项。
二、内核参数调优:sysctl.conf 深度解析
内核参数是操作系统的核心配置,位于 /etc/sysctl.conf 或 /etc/sysctl.d/ 目录下。使用 sysctl -p 命令可以加载修改后的配置。
2.1 虚拟内存(VM)调优
虚拟内存管理是 Linux 性能调优中最关键的部分之一,特别是对于内存密集型应用。
参数:vm.swappiness
控制内核将数据从 RAM 移动到 Swap 分区的积极程度。
- 取值范围: 0-100
- 默认值: 60
- 建议: 对于数据库服务器(如 MySQL),建议设置为 1 或 10,以避免频繁的 Swap 交换,提高 I/O 性能。对于桌面应用,保持默认即可。
修改方法:
# 临时修改(重启失效)
sudo sysctl -w vm.swappiness=10
# 永久修改
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.d/99-custom.conf
sudo sysctl -p /etc/sysctl.d/99-custom.conf
参数:vm.vfs_cache_pressure
控制内核回收用于目录项(dentry)和 inode 缓存的内存倾向。
- 默认值: 100
- 建议: 如果系统运行大量文件操作(如 Web 服务器),可以增加该值(如 500),让内核更积极地回收缓存。如果希望保留更多缓存以提高文件查找速度,可以降低该值(如 50)。
修改示例:
echo "vm.vfs_cache_pressure = 50" | sudo tee -a /etc/sysctl.d/99-custom.conf
参数:vm.dirty_ratio 和 vm.dirty_background_ratio
这两个参数控制脏页(已修改但未写入磁盘的数据)的写入策略。
- vm.dirty_background_ratio: 达到此百分比时,后台刷写进程开始将脏页写入磁盘。
- vm.dirty_ratio: 达到此百分比时,所有进程将被阻塞,直到脏页被写入磁盘。
场景分析:
- 默认值:
dirty_background_ratio=10,dirty_ratio=20。 - 高吞吐数据库/日志服务器: 适当增加这两个值(例如
dirty_background_ratio=5,dirty_ratio=10),可以让系统在内存中积攒更多数据,合并 I/O 请求,减少磁盘寻道次数,提高吞吐量。但风险是系统崩溃时丢失的数据更多。
修改示例:
echo "vm.dirty_background_ratio = 5" | sudo tee -a /etc/sysctl.d/99-custom.conf
echo "vm.dirty_ratio = 10" | sudo tee -a /etc/sysctl.d/99-custom.conf
2.2 网络性能调优
对于高并发的网络服务(如 Nginx、Redis),网络栈的调优至关重要。
参数:net.core.somaxconn
定义了系统中每一个端口最大的 TCP listen 队列长度。
- 默认值: 128 (通常太小)
- 建议: 对于高并发服务器,建议设置为 4096 或更高。
修改示例:
echo "net.core.somaxconn = 4096" | sudo tee -a /etc/sysctl.d/99-custom.conf
参数:net.ipv4.tcp_max_syn_backlog
定义了 SYN 包(连接请求包)的队列长度。如果系统受到 SYN Flood 攻击或在高并发连接建立期间,增加此值可以防止连接丢失。
- 建议: 设置为 8192。
修改示例:
echo "net.ipv4.tcp_max_syn_backlog = 8192" | sudo tee -a /etc/sysctl.d/99-custom.conf
参数:net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_tw_recycle
允许将处于 TIME_WAIT 状态的 socket 重用于新的 TCP 连接。
- 注意: 在 Linux 4.12+ 内核中,
tcp_tw_recycle已被移除,因为它会导致 NAT 环境下的连接问题。现在主要依赖tcp_tw_reuse。 - 建议: 开启
net.ipv4.tcp_tw_reuse = 1。
修改示例:
echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.d/99-custom.conf
参数:net.ipv4.tcp_fin_timeout
控制 TCP FIN_WAIT_2 状态的超时时间。
- 默认值: 60秒
- 建议: 减少到 15-30秒 可以更快释放资源。
修改示例:
echo "net.ipv4.tcp_fin_timeout = 15" | sudo tee -a /etc/sysctl.d/99-custom.conf
三、文件系统与磁盘 I/O 优化
磁盘通常是系统中最慢的组件,优化磁盘 I/O 可以显著提升整体性能。
3.1 I/O 调度器选择
I/O 调度器决定了内核如何处理磁盘 I/O 请求。AlmaLinux 支持多种调度器,包括 mq-deadline (默认), bfq, kyber 等。
- bfq (Budget Fair Queueing): 适合桌面和交互式系统,提供公平的 I/O 分配。
- mq-deadline: 适合服务器,特别是数据库,强调吞吐量和截止时间。
- kyber: 较新的调度器,旨在为高速存储(如 NVMe SSD)提供低延迟。
查看当前调度器:
cat /sys/block/sda/queue/scheduler
# 输出示例: noop [deadline] cfq bfq
修改调度器 (临时):
# 假设设备是 sda
echo "mq-deadline" > /sys/block/sda/queue/scheduler
永久修改 (使用 udev 规则):
创建文件 /etc/udev/rules.d/60-ioscheduler.rules:
# 为所有 NVMe SSD 设置 kyber
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="kyber"
# 为所有 HDD 设置 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="mq-deadline"
应用规则:
sudo udevadm control --reload-rules && sudo udevadm trigger
3.2 文件系统挂载选项
在 /etc/fstab 中调整挂载选项可以提升文件系统性能。
针对 ext4 文件系统的优化:
- noatime: 禁止更新文件访问时间。这可以显著减少写操作,特别是对于 Web 服务器或邮件服务器。
- data=writeback: 仅对 ext4 有效。启用写回模式可以提高性能,但可能会增加系统崩溃时数据损坏的风险(通常与数据库的日志机制配合使用是安全的)。
修改 /etc/fstab 示例:
# 原始行
UUID=xxxx-xxxx-xxxx / ext4 defaults 1 1
# 优化后
UUID=xxxx-xxxx-xxxx / ext4 defaults,noatime,data=writeback 1 1
注意:修改后需要重新挂载文件系统 mount -o remount /。
3.3 预读 (Read-ahead) 调整
预读决定了文件系统在顺序读取文件时预先读取多少数据块。
- 默认值: 256 (KB)
- 建议: 对于大文件顺序读取(如视频流、大数据分析),增加预读值可以提高吞吐量。
查看和设置:
# 查看 sda 的预读值 (单位: 512字节扇区)
blockdev --getra /dev/sda
# 设置为 8192 (即 4MB)
sudo blockdev --setra 8192 /dev/sda
注意:此设置重启失效,需写入 udev 规则或 rc.local。
四、进程与 CPU 调度优化
4.1 CPU 亲和性 (Affinity) 与隔离
在多核系统中,将特定进程绑定到特定 CPU 核心(CPU Pinning)可以减少缓存失效(Cache Miss)和上下文切换,提高性能。
工具: taskset
查看进程当前的 CPU 亲和性:
# 查找 nginx worker 进程 PID
PID=$(pgrep -f nginx | head -1)
taskset -p $PID
# 输出: pid 1234's current affinity mask: f (表示使用 0-3 核)
设置进程的 CPU 亲和性: 将进程绑定到第 2 和第 3 个核心(核心编号从 0 开始)。
# 1100 二进制是 10001000000,对应第 2 和第 3 核 (从右往左数)
# 或者使用十六进制 0x6 (二进制 0110,对应第 1 和第 2 核)
# 这里使用十六进制更简单: 0x3 (二进制 0011,绑定核心 0 和 1)
taskset -p 0x3 $PID
4.2 调整进程优先级 (Nice 值)
Nice 值范围从 -20 到 19,数值越小优先级越高。
- nice: 启动时设置优先级。
- renice: 修改运行中进程的优先级。
场景: 数据库服务需要高优先级,后台备份任务需要低优先级。
启动高优先级服务:
# -n -10 表示设置 Nice 值为 -10 (高优先级)
nice -n -10 /usr/sbin/mysqld_safe
调整运行中任务的优先级:
# 假设备份脚本 PID 为 5678,将其优先级调低
renice +10 5678
五、系统服务与资源限制优化
5.1 Systemd 服务资源控制
Systemd 不仅管理服务启动,还可以限制服务使用的系统资源(CPU、内存、IO)。
编辑服务单元文件:
通常在 /etc/systemd/system/ 下创建覆盖文件。
例如,限制 Nginx 服务最多使用 50% 的 CPU 时间。
sudo systemctl edit nginx
这将打开一个文本编辑器,输入以下内容:
[Service]
# 限制 CPU 使用率:1000ms/1000ms = 100%,500ms/1000ms = 50%
CPUQuota=50%
# 限制内存使用:绝对值或百分比
# MemoryLimit=2G 或者 MemoryLimit=50%
# 限制 IO 权重 (10-1000,默认 100,越高优先级越高)
# IOWeight=200
保存并退出后,重新加载配置并重启服务:
sudo systemctl daemon-reload
sudo systemctl restart nginx
5.2 调整文件描述符限制 (ulimit)
Linux 系统对每个进程打开的文件描述符(File Descriptors)数量有限制。高并发服务器(如 Nginx、Redis)经常遇到 “Too many open files” 错误。
查看当前限制:
ulimit -n
永久修改限制:
编辑 /etc/security/limits.conf:
sudo vim /etc/security/limits.conf添加以下行: “`conf
- soft nofile 65535
- hard nofile 65535 root soft nofile 65535 root hard nofile 65535
”`
对于 Systemd 服务: 由于 Systemd 默认会覆盖 limits.conf 的设置,对于 Systemd 管理的服务,需要在服务文件中指定:
[Service] LimitNOFILE=65535
六、实战案例:优化高并发 Web 服务器
假设我们有一台运行 AlmaLinux 的服务器,部署了 Nginx 和 PHP-FPM,用于处理高并发 Web 请求。以下是综合上述知识点的调优步骤。
6.1 调优清单
- 网络栈调优 (sysctl): 增加连接队列,减少 TIME_WAIT。
- 文件描述符: 提高 Nginx 和 PHP-FPM 的打开文件数限制。
- 内核参数: 降低 swappiness,优化脏页比率。
- 进程管理: 调整 PHP-FPM 进程管理模式和数量。
6.2 具体实施步骤
步骤 1: 修改 sysctl.conf
创建 /etc/sysctl.d/99-web-optimize.conf:
# 网络优化
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.ip_local_port_range = 1024 65535
# 内存优化
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.vfs_cache_pressure = 50
加载配置: sudo sysctl -p /etc/sysctl.d/99-web-optimize.conf
步骤 2: 修改 PHP-FPM 配置
编辑 /etc/php-fpm.d/www.conf:
; 进程管理模式:static 或 dynamic
; dynamic: 动态调整进程数
; static: 固定进程数(推荐高负载使用,避免频繁 fork)
pm = static
; 如果是 static,该值即为进程总数。
; 根据 CPU 核心数 * 2 或 * 4 设置,避免过多上下文切换。
; 假设服务器有 4 核,设置为 16。
pm.max_children = 16
; 每个子进程能打开的文件数
; 必须小于系统的 ulimit -n
rlimit_files = 65535
步骤 3: 修改 Nginx 配置
编辑 /etc/nginx/nginx.conf:
user nginx;
worker_processes auto; # 自动根据 CPU 核心数设置
# 每个 worker 进程能打开的文件数
worker_rlimit_nofile 65535;
events {
worker_connections 4096; # 每个 worker 的最大连接数
use epoll; # 高效的事件模型
multi_accept on; # 尽可能多地接受连接
}
http {
# 开启 Gzip 压缩,减少传输体积
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 隐藏 Nginx 版本号,提高安全性
server_tokens off;
# 保持连接时间
keepalive_timeout 65;
keepalive_requests 10000;
}
步骤 4: 修改系统 Limits
编辑 /etc/security/limits.conf,添加:
nginx soft nofile 65535
nginx hard nofile 65535
重启服务:
sudo systemctl restart nginx php-fpm
七、总结与注意事项
性能调优是一个持续的过程,没有“银弹”。以下是一些关键的总结和警告:
- 测量,不要猜测: 在修改任何参数之前和之后,都要使用基准测试工具(如
sysbench,ab)进行测量,对比数据变化。 - 一次只改一个变量: 不要一次性修改 sysctl 中的所有参数。如果出现问题,很难定位是哪个参数导致的。
- 理解参数含义: 每个参数都有其特定的适用场景。例如,增加
dirty_ratio可以提高吞吐量,但会增加数据丢失的风险。 - 文档化: 记录你所做的所有更改。这不仅是为了排查问题,也是为了在系统迁移或重建时能够复现高性能配置。
- 监控: 使用 Prometheus + Grafana 或 Zabbix 等工具长期监控系统指标,及时发现性能退化。
通过本文的指南,你应该能够系统地分析 AlmaLinux 的性能瓶颈,并应用针对性的优化策略,从而将硬件性能发挥到极致。
