引言:为什么需要对 AlmaLinux 进行性能优化?
AlmaLinux 是一个开源、社区驱动的操作系统,作为 CentOS 的替代品,它与 RHEL (Red Hat Enterprise Linux) 二进制兼容。在企业环境中,无论是运行数据库、Web 服务器、容器化应用还是虚拟化平台,系统的默认配置往往是为了通用性而设计的。为了榨取硬件的每一分性能,或者为了在特定负载下实现资源的高效利用,系统管理员必须进行针对性的优化。
本指南将深入探讨从底层内核参数调整到上层应用资源管理的全方位优化策略,帮助你构建一个高性能、高稳定性的 AlmaLinux 环境。
第一章:监控与基准测试——优化的基础
在进行任何优化之前,我们必须建立一个基准(Baseline)。没有数据支撑的优化是盲目的。我们需要知道当前的瓶颈在哪里:是 CPU、内存、磁盘 I/O 还是网络?
1.1 实时监控工具
- top/htop: 查看实时的进程资源占用。
- iostat: 监控磁盘 I/O 统计。
- vmstat: 监控虚拟内存、进程、CPU 活动。
- ss/netstat: 监控网络连接和套接字统计。
1.2 专业基准测试工具
为了量化性能,我们需要使用专业的工具进行压力测试:
- CPU: 使用
sysbench进行素数计算测试。 - 内存: 使用
sysbench或stream测试内存带宽。 - 磁盘 I/O: 使用
fio(Flexible I/O Tester) 进行复杂的读写模式测试。
实战:使用 fio 测试磁盘性能
安装 fio:
sudo dnf install -y fio
创建一个简单的随机读写测试文件 randread.fio:
[global]
ioengine=libaio
direct=1
size=1G
runtime=60
group_reporting
[randread]
bs=4k
iodepth=16
rw=randread
filename=/dev/nvme0n1
注意:请将 /dev/nvme0n1 替换为你实际的测试磁盘,生产环境慎用,会覆盖数据。
运行测试:
fio randread.fio
通过对比优化前后的 IOPS (每秒读写次数) 和 Latency (延迟),我们可以判断优化是否有效。
第二章:内核参数调整 (sysctl)
AlmaLinux 的内核参数保存在 /etc/sysctl.conf 或 /etc/sysctl.d/ 目录下。通过调整这些参数,我们可以改变内核处理网络、内存和文件系统的方式。
2.1 网络性能优化
对于高并发的 Web 服务器或负载均衡器,网络栈的优化至关重要。
核心参数调整:
增大 TCP 连接队列: 默认的
net.core.somaxconn可能太小,导致高并发下连接被丢弃。# /etc/sysctl.d/99-network.conf net.core.somaxconn = 65535启用 TCP Fast Open: 减少 TCP 握手的 RTT(往返时间)。
net.ipv4.tcp_fastopen = 3优化 TCP 拥塞控制算法: 对于高吞吐、高延迟的网络(如跨洋传输),BBR 算法通常优于 Cubic。
net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbrTIME_WAIT 状态端口复用: 防止在高并发下耗尽可用端口。
net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30
2.2 内存与虚拟内存优化
Swappiness: 控制内核将数据换出到交换分区的倾向。对于数据库服务器,我们通常希望尽可能使用物理内存。
# 0 表示尽量不使用 swap,除非内存不足 vm.swappiness = 10VFS Cache Pressure: 控制内核回收用于目录项和 inode 缓存的内存倾向。
# 降低回收倾向,提高文件系统性能 vm.vfs_cache_pressure = 50
2.3 应用参数生效
修改完配置文件后,执行以下命令立即生效:
sudo sysctl -p /etc/sysctl.d/99-network.conf
第三章:文件系统与磁盘 I/O 优化
磁盘往往是系统性能的瓶颈。AlmaLinux 默认使用 XFS 或 ext4。
3.1 挂载选项优化
在 /etc/fstab 中调整挂载选项可以显著提升性能。
针对 SSD 的优化 (noatime):
noatime 选项禁止更新文件访问时间,减少不必要的写操作。
# 原始行
UUID=xxxx-xxxx-xxxx / ext4 defaults 0 0
# 优化后
UUID=xxxx-xxxx-xxxx / ext4 defaults,noatime,discard 0 0
注意:discard 选项用于 TRIM,但在某些情况下可能引起延迟,现代内核通常建议使用周期性的 fstrim 任务。
3.2 I/O 调度器选择
I/O 调度器决定了内核如何处理磁盘 I/O 请求。
- HDD: 通常使用
mq-deadline或bfq。 - SSD/NVMe: 应该使用
none(或noop),因为 SSD 没有机械寻道时间,调度器反而增加开销。
查看当前调度器:
cat /sys/block/sda/queue/scheduler
# 输出示例: noop [deadline] cfq
永久修改调度器:
使用 udev 规则。创建文件 /etc/udev/rules.d/60-ioscheduler.rules:
# 对所有 NVMe 设备设置 none 调度器
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
# 对所有 SATA/SCSI 设备设置 deadline 调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="mq-deadline"
加载规则:
sudo udevadm control --reload-rules && sudo udevadm trigger
第四章:资源限制与控制 (Cgroups)
在现代 Linux 中,Cgroups (Control Groups) 是容器技术的基石,也可以用来限制单个进程或用户的资源使用,防止“吵闹邻居”问题。
4.1 使用 Systemd 进行资源限制
Systemd 对 Cgroups 进行了很好的封装。我们可以直接在服务文件中限制资源。
案例:限制 Nginx 服务的 CPU 和内存
编辑 Nginx 的 systemd 服务覆盖文件:
sudo systemctl edit nginx.service
在编辑器中输入以下内容:
[Service]
# 限制 CPU 使用率:1000ms 的 CPU 时间意味着在 1 秒内最多使用 1 个核心的满负荷
# 这里的 10% 指的是单核的 10%,如果是多核,需配合 CPUQuota 使用
CPUQuota=10%
# 限制内存使用:当内存使用超过 512M,系统将尝试回收内存,如果不足则杀掉进程
MemoryLimit=512M
# 限制进程数(防止 Fork Bomb)
TasksMax=200
保存并退出,然后重新加载并重启服务:
sudo systemctl daemon-reload
sudo systemctl restart nginx
4.2 使用 Cgroups v2 手动控制 (高级)
如果你需要更精细的控制,可以直接操作 Cgroups v2 (AlmaLinux 9 默认支持)。
示例:创建一个名为 “high-priority” 的 cgroup,限制其 CPU 使用:
# 1. 挂载 cgroup (如果尚未挂载)
sudo mount -t cgroup2 none /sys/fs/cgroup
# 2. 创建子目录
sudo mkdir /sys/fs/cgroup/high-priority
# 3. 设置限制:限制该组内所有进程最多使用 0.5 个 CPU 核心
# cpu.max 格式为:$MAX $PERIOD (例如 50000 100000 表示 50%)
echo "50000 100000" | sudo tee /sys/fs/cgroup/high-priority/cpu.max
# 4. 将当前 shell 进程加入该 cgroup
echo $$ | sudo tee /sys/fs/cgroup/high-priority/cgroup.procs
# 5. 运行一个死循环脚本来测试
while true; do :; done &
此时查看 CPU 使用率,你会发现该进程被限制在了 50% 左右。
第五章:SELinux 与防火墙优化
在追求性能时,安全组件有时会成为瓶颈。
5.1 SELinux 优化
不要轻易禁用 SELinux!如果遇到性能问题,通常是因为文件上下文错误导致频繁的权限检查。
检查 SELinux 日志:
sudo ausearch -m avc -ts recent
优化策略:
如果发现大量 AVC 拒绝,且确认安全无误,应使用 audit2allow 生成自定义模块,而不是关闭 SELinux。
# 提取导致拒绝的日志
sudo ausearch -m avc -ts recent | audit2allow -M mynginx
# 应用模块
sudo semodule -i mynginx.pp
5.2 Firewalld 优化
对于高流量服务器,防火墙规则过多会影响包处理速度。
- 精简规则:只保留必要的端口。
- 富规则 (Rich Rules):避免使用过多的富规则,尽量使用直接区域。
第六章:特定场景优化实战
6.1 数据库服务器 (以 MySQL/MariaDB 为例)
内核参数:
vm.swappiness = 1(极度避免交换)vm.dirty_ratio = 15(脏页比例,触发刷盘)net.core.somaxconn = 65535net.ipv4.tcp_max_syn_backlog = 65535
文件系统:
- 使用 XFS。
- 挂载选项:
noatime,nodiratime。
I/O 调度器:
- 设置为
none(针对 NVMe)。
- 设置为
6.2 Web 服务器 (Nginx)
Worker 进程优化:
- 通常设置为等于 CPU 核心数。
worker_processes auto;
Worker 连接数:
worker_connections 65535;
文件描述符限制:
- 在
/etc/security/limits.conf中:
nginx soft nofile 65535 nginx hard nofile 65535- 在
第七章:总结与最佳实践
性能优化是一个持续的过程,而不是一次性的工作。以下是一些核心建议:
- 变更管理:每次只修改一个参数,然后进行测试。不要一次性修改所有 sysctl 参数。
- 文档化:记录你所做的所有更改,以便在系统崩溃或迁移时能够复现。
- 关注瓶颈:使用
sar或Prometheus + Grafana等工具长期监控,找到真正的瓶颈所在。 - 保持更新:AlmaLinux 会定期发布内核更新,新内核往往包含更好的性能改进和驱动支持。
通过以上从内核参数、文件系统、资源限制到特定场景的详细配置,你可以将 AlmaLinux 打造成一个针对你的业务负载高度优化的高性能平台。
