引言:为什么需要对 AlmaLinux 进行性能优化?
AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,正如任何操作系统一样,默认配置往往是为了通用性而设计的,并非针对特定工作负载进行优化。在高负载的生产环境中,未经优化的系统可能会遇到性能瓶颈,如 CPU 利用率过高、内存不足、I/O 延迟大或网络吞吐量低等问题。
性能优化不仅仅是提升速度,更是为了确保系统的稳定性、可预测性和资源的高效利用。通过调整内核参数、优化文件系统、隔离关键进程和合理分配资源,我们可以显著提升 AlmaLinux 在数据库服务器、Web 服务器、虚拟化平台或高性能计算环境中的表现。
本文将深入探讨 AlmaLinux 的性能优化策略,从基础的内核参数调整到高级的资源隔离技术(如 cgroups 和 namespaces),并提供详细的实战步骤和代码示例。无论你是系统管理员还是 DevOps 工程师,这篇文章都将为你提供可操作的指导。
1. 性能优化前的准备工作:监控与基准测试
在盲目调整参数之前,了解系统的当前状态至关重要。优化是一个迭代过程:测量、调整、验证、再测量。没有基准数据,你无法知道优化是否有效。
1.1 常用监控工具
AlmaLinux 提供了一系列强大的工具来监控系统资源:
- top/htop:实时查看进程的 CPU 和内存使用情况。
- vmstat:报告虚拟内存统计信息,包括进程、内存、I/O、中断和 CPU 活动。
- iostat:监控 CPU 输入/输出统计信息,特别适用于磁盘 I/O 分析。
- sar(sysstat 包):收集、报告和保存系统活动信息,可用于长期分析。
- netstat/ss:网络连接、路由表、接口统计等。
- perf:Linux 内核自带的性能分析工具,可用于 CPU 性能事件采样。
1.2 基准测试工具
为了量化性能,我们可以使用以下工具进行基准测试:
- CPU:
sysbench或stress-ng。 - 内存:
sysbench或stream。 - 磁盘 I/O:
fio(Flexible I/O Tester),这是行业标准。 - 网络:
iperf3。
示例:使用 sysbench 进行 CPU 基准测试
首先安装 sysbench:
sudo dnf install -y epel-release
sudo dnf install -y sysbench
运行 CPU 基准测试(计算素数):
# --cpu-max-primes: 计算素数的最大数量
# --threads: 线程数,通常设置为 CPU 核心数
# --time: 运行时间(秒)
sysbench cpu --cpu-max-primes=20000 --threads=4 --time=10 run
输出结果将显示每秒计算的事件数(events per second),这是衡量 CPU 计算能力的关键指标。优化前后对比这个数值,可以直观地看到效果。
2. 内核参数调整:sysctl.conf 的深度优化
内核参数控制着操作系统如何管理 CPU、内存、网络和 I/O。通过调整 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的文件,我们可以改变这些行为。
注意:修改内核参数具有风险,可能导致系统不稳定。建议在测试环境中验证,并准备好回滚方案。
2.1 内存管理优化
内存是性能的关键。Linux 内核使用虚拟内存,其中涉及交换(swap)和缓存。
2.1.1 Swappiness (vm.swappiness)
Swappiness 控制内核将数据从 RAM 移动到 Swap 分区的倾向性。值范围是 0-100。对于拥有大量 RAM 的现代服务器,降低 Swappiness 可以减少磁盘 I/O,提高响应速度。
- 默认值:通常为 60。
- 推荐值:对于数据库服务器,建议设置为 1 或 10;对于通用服务器,可以设置为 10-30。如果内存充足,可以设置为 0(但某些内核版本可能仍会使用 Swap)。
配置示例:
# 编辑 /etc/sysctl.d/99-memory.conf
echo "vm.swappiness = 10" | sudo tee -a /etc/sysctl.d/99-memory.conf
sudo sysctl -p /etc/sysctl.d/99-memory.conf
2.1.2 脏页比率 (vm.dirty_ratio 和 vm.dirty_background_ratio)
这两个参数控制文件系统缓存中“脏页”(已修改但未写入磁盘的数据)的数量。
vm.dirty_background_ratio:当脏页占内存百分比达到此值时,后台进程开始将数据写入磁盘。vm.dirty_ratio:当脏页占内存百分比达到此值时,进程将被阻塞,直到数据写入磁盘。
优化策略:
- 增大
dirty_background_ratio允许更多数据在内存中累积,减少 I/O 次数,但增加了崩溃时数据丢失的风险。 - 降低
dirty_ratio可以防止进程因 I/O 阻塞太久,保持系统响应性。
推荐配置(针对高吞吐量写入场景,如日志服务器):
# 增加后台写入阈值,减少 I/O 频率
echo "vm.dirty_background_ratio = 10" | sudo tee -a /etc/sysctl.d/99-memory.conf
# 限制单进程阻塞阈值,避免系统卡顿
echo "vm.dirty_ratio = 20" | sudo tee -a /etc/sysctl.d/99-memory.conf
sudo sysctl -p /etc/sysctl.d/99-memory.conf
2.2 文件系统优化
文件系统缓存和打开文件限制也会影响性能。
2.2.1 VFS Cache Pressure (fs.vfs_cache_pressure)
该参数控制系统回收用于目录项和 inode 缓存的倾向。默认值 100 表示积极回收。增加此值(如 500)会减少缓存,释放内存,但可能增加文件查找时间。减少此值(如 50)会保留更多缓存,提高文件访问速度。
配置示例:
echo "fs.vfs_cache_pressure = 50" | sudo tee -a /etc/sysctl.d/99-fs.conf
sudo sysctl -p /etc/sysctl.d/99-fs.conf
2.2.2 文件描述符限制 (ulimit)
每个进程能打开的文件数(包括网络套接字)有限制。默认值通常较低(1024),对于高并发 Web 服务器或数据库来说不够。
永久修改限制:
编辑 /etc/security/limits.conf:
# /etc/security/limits.conf
# <domain> <type> <item> <value>
* soft nofile 65536
* hard nofile 65536
root soft nofile 65536
root hard nofile 65536
验证:
重新登录后,运行 ulimit -n 应显示 65536。
2.3 网络优化
对于网络密集型应用,调整 TCP 栈参数至关重要。
2.3.1 TCP 拥塞控制算法
默认算法通常是 cubic。对于高带宽、高延迟的网络(如跨数据中心),bbr (Bottleneck Bandwidth and RTT) 往往表现更好。
配置示例:
echo "net.core.default_qdisc = fq" | sudo tee -a /etc/sysctl.d/99-network.conf
echo "net.ipv4.tcp_congestion_control = bbr" | sudo tee -a /etc/sysctl.d/99-network.conf
sudo sysctl -p /etc/sysctl.d/99-network.conf
验证是否启用:
sysctl net.ipv4.tcp_congestion_control
# 输出应为 net.ipv4.tcp_congestion_control = bbr
2.3.2 端口范围和连接跟踪
对于高并发服务器,增加可用端口范围和连接跟踪表大小:
# 增加本地端口范围
echo "net.ipv4.ip_local_port_range = 1024 65535" | sudo tee -a /etc/sysctl.d/99-network.conf
# 增大连接跟踪表(如果使用 iptables/nftables)
echo "net.netfilter.nf_conntrack_max = 2000000" | sudo tee -a /etc/sysctl.d/99-network.conf
# 增大半连接队列(SYN Flood 保护)
echo "net.ipv4.tcp_max_syn_backlog = 65536" | sudo tee -a /etc/sysctl.d/99-network.conf
# 增大全连接队列
echo "net.core.somaxconn = 65536" | sudo tee -a /etc/sysctl.d/99-network.conf
sudo sysctl -p /etc/sysctl.d/99-network.conf
注意:nf_conntrack_max 增大可能会增加内存消耗,需根据服务器内存调整。
3. I/O 调度器与文件系统优化
磁盘 I/O 往往是系统的瓶颈。AlmaLinux 支持多种 I/O 调度器,用于决定磁盘操作的顺序。
3.1 选择合适的 I/O 调度器
- none:适用于多队列设备(NVMe SSD),几乎没有开销。
- mq-deadline:适用于 SSD 和高性能存储,注重吞吐量。
- bfq:适用于桌面或混合负载,提供更好的公平性。
- kyber:较新的调度器,旨在提供低延迟。
对于 NVMe SSD,通常使用 none 或 mq-deadline。对于 SATA SSD/HDD,mq-deadline 或 bfq 可能更合适。
查看当前调度器:
cat /sys/block/sda/queue/scheduler
# 输出示例: noop [deadline] cfq
临时更改:
echo none > /sys/block/nvme0n1/queue/scheduler
永久更改(使用 udev 规则):
创建文件 /etc/udev/rules.d/60-ioscheduler.rules:
# 对于 NVMe 设备使用 none
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
# 对于 SSD 设备使用 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="mq-deadline"
# 对于 HDD 设备使用 bfq
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="bfq"
应用规则:
sudo udevadm control --reload-rules && sudo udevadm trigger
3.2 文件系统挂载选项
在 /etc/fstab 中调整挂载选项可以显著提升性能。
推荐的 ext4 挂载选项:
noatime:不更新文件访问时间,减少写操作(除非需要访问时间审计)。data=writeback:对于 ext4,这可以提高元数据性能,但崩溃时可能丢失数据(适合日志分区,不适合关键数据)。barrier=0:禁用写屏障,提高性能,但断电时有数据损坏风险(仅限带电池 RAID 卡的环境)。
示例 /etc/fstab 条目:
UUID=xxxx-xxxx-xxxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2
4. 资源隔离:cgroups 与 Namespaces
资源隔离是确保关键服务获得所需资源,并防止“吵闹邻居”问题的关键技术。Linux 通过 cgroups (Control Groups) 和 Namespaces 实现这一点。
4.1 使用 cgroups v1/v2 进行资源限制
cgroups 允许你限制、记录和隔离进程组的资源使用(CPU、内存、I/O、网络)。
AlmaLinux 8⁄9 默认启用了 cgroups v2,但也兼容 v1。
4.1.1 使用 systemd 进行简单的资源控制(推荐)
Systemd 是 AlmaLinux 的 init 系统,它原生集成了 cgroups。你可以通过创建 service 文件来限制资源。
场景:限制一个非关键后台脚本的 CPU 使用率,防止它耗尽所有 CPU。
创建一个 systemd service 文件:
sudo nano /etc/systemd/system/limited-script.service内容如下: “`ini [Unit] Description=Limited Background Script After=network.target
[Service] ExecStart=/usr/bin/python3 /opt/scripts/heavy_task.py # CPU 限制:将 CPU 使用率限制在单个核心的 50% # CPUQuota=50% 表示使用 0.5 个 CPU 核心 CPUQuota=50% # 内存限制:最大 512MB MemoryMax=512M # 如果内存不足,允许使用少量 swap,但不超过 1G MemorySwapMax=1G Restart=on-failure User=appuser
[Install] WantedBy=multi-user.target
3. 启动并启用服务:
```bash
sudo systemctl daemon-reload
sudo systemctl start limited-script.service
sudo systemctl status limited-script.service
- 验证限制:
使用
top或systemd-cgtop查看进程的资源使用情况。即使脚本试图占满 CPU,它也会被限制在 50% 左右。
4.1.2 手动使用 cgroups (cgroups v2)
如果你需要更精细的控制,或者控制非 systemd 管理的进程,可以手动挂载 cgroup2 并创建组。
挂载 cgroup2(如果尚未挂载):
sudo mount -t cgroup2 none /sys/fs/cgroup创建一个控制组:
sudo mkdir /sys/fs/cgroup/mygroup cd /sys/fs/cgroup/mygroup设置限制(例如,CPU 权重):
cpu.weight:相对权重,默认 100。值越高,获得的 CPU 时间越多。memory.max:硬内存限制。
# 设置内存限制为 2GB
echo 2G > memory.max
# 设置 CPU 权重为 50 (相对较低)
echo 50 > cpu.weight
- 将进程添加到控制组:
假设我们要限制 PID 为 12345 的进程。
现在,该进程及其子进程将受到上述限制。echo 12345 > cgroup.procs
4.2 使用 Namespaces 进行隔离
Namespaces 提供进程级别的隔离,如 PID、网络、挂载、UTS(主机名)等。这通常是容器技术(如 Docker/Podman)的基础。
虽然手动使用 namespaces 比较复杂(通常通过 unshare 命令),但理解其概念很重要。
示例:使用 unshare 创建一个独立的网络命名空间
这在测试网络配置或构建虚拟网络环境时非常有用。
# 创建一个新的网络命名空间并启动一个 shell
sudo unshare --net /bin/bash
在这个新 shell 中,你将看到一个干净的网络环境(只有 lo 接口,且未启动)。你可以在这里配置虚拟网卡、iptables 规则,而不会影响主机网络。
退出命名空间:只需输入 exit。
4.3 使用 cgroups 进行 I/O 隔离 (blkio)
对于数据库和 Web 服务器,磁盘 I/O 隔离至关重要。你可以限制特定进程组的磁盘读写带宽。
场景:限制备份进程的 I/O,以免影响数据库性能。
假设使用 cgroups v1(因为 v2 的 I/O 控制有时在默认内核配置中未启用):
挂载 blkio 子系统:
sudo mount -t cgroup -o blkio none /sys/fs/cgroup/blkio创建组:
sudo mkdir /sys/fs/cgroup/blkio/backup_group设置限制(假设设备是
/dev/sda,需要获取其主次设备号): “`bash获取设备号
ls -l /dev/sda
输出示例: brw-rw—- 1 root disk 8, 0 Nov 20 10:00 /dev/sda
主设备号 8,次设备号 0
# 限制写入速度为 10MB/s (单位是字节/秒) echo “8:0 10485760” > /sys/fs/cgroup/blkio/backup_group/blkio.throttle.write_bps_device
4. 将备份进程 PID 加入该组:
```bash
echo <PID> > /sys/fs/cgroup/blkio/backup_group/cgroup.procs
注意:在 AlmaLinux 9 中,推荐使用 cgroups v2。在 v2 中,I/O 控制通过 io.max 文件实现,语法略有不同。
5. 高级优化:Tuned 和 Performance Profiles
手动调整参数虽然灵活,但容易出错。tuned 是一个动态自适应系统调优守护进程,它提供了针对不同场景预设的优化配置文件。
5.1 安装和使用 Tuned
AlmaLinux 默认可能已安装。如果没有:
sudo dnf install -y tuned
启动并启用服务:
sudo systemctl enable --now tuned
5.2 查看和应用配置文件
列出可用配置文件:
tuned-adm list
常见配置文件:
virtual-guest:适用于虚拟机,平衡性能和功耗。throughput-performance:最大化吞吐量,适合文件服务器。latency-performance:最小化延迟,适合数据库。powersave:节能。
应用配置文件:
sudo tuned-adm profile latency-performance
检查当前状态:
tuned-adm active
5.3 自定义 Tuned 配置文件
如果预设配置文件不满足需求,可以创建自定义配置文件。
复制现有配置文件:
sudo cp -r /usr/lib/tuned/latency-performance /etc/tuned/my-custom-profile编辑
tuned.conf:sudo nano /etc/tuned/my-custom-profile/tuned.conf
示例:增加 TCP 缓冲区大小。
[main]
summary=Custom profile for high network load
[sysctl]
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
- 应用自定义配置:
sudo tuned-adm profile my-custom-profile
6. 实战案例:优化一个高流量 Nginx Web 服务器
让我们将上述理论应用到一个具体的场景中。
目标:优化运行在 AlmaLinux 上的 Nginx,以处理高并发静态文件请求。
6.1 步骤 1:系统级调整
文件描述符限制: 在
/etc/security/limits.conf中为 nginx 用户设置:nginx soft nofile 65536 nginx hard nofile 65536内核参数 (
/etc/sysctl.d/99-nginx.conf):# 网络优化 net.core.somaxconn = 65536 net.ipv4.tcp_max_syn_backlog = 65536 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 15 # 内存优化 vm.swappiness = 10 vm.vfs_cache_pressure = 50应用 sysctl:
sudo sysctl -p /etc/sysctl.d/99-nginx.conf
6.2 步骤 2:Nginx 配置优化
编辑 /etc/nginx/nginx.conf:
user nginx;
# 设置工作进程数,通常等于 CPU 核心数或 2 倍
worker_processes auto;
# 每个进程允许的最大连接数
events {
worker_connections 4096;
# 使用 epoll 事件模型(Linux 2.6+)
use epoll;
# 优化 accept 锁机制
multi_accept on;
}
http {
# 开启 sendfile,直接在内核空间拷贝文件,减少用户空间切换
sendfile on;
# 开启 tcp_nopush,优化 sendfile,将响应头和文件内容在一个包里发送
tcp_nopush on;
# 开启 tcp_nodelay,禁用 Nagle 算法,减少小包延迟
tcp_nodelay on;
# 保持连接超时时间
keepalive_timeout 65;
keepalive_requests 1000;
# 缓存打开的文件描述符
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# 包含其他配置文件
include /etc/nginx/conf.d/*.conf;
}
6.3 步骤 3:使用 systemd 进行资源隔离
如果服务器上还运行着其他服务(如数据库),我们不希望 Nginx 吃掉所有 CPU。
创建 /etc/systemd/system/nginx.service.d/override.conf:
[Service]
# 限制 CPU 使用率为 80% (假设是 4 核 CPU,这限制了 3.2 核的使用)
CPUQuota=80%
# 限制内存使用,假设分配 4GB 给 Nginx
MemoryMax=4G
然后重载 systemd:
sudo systemctl daemon-reload
sudo systemctl restart nginx
6.4 步骤 4:验证
检查 Nginx 状态:
sudo systemctl status nginx压力测试: 使用
ab(Apache Bench) 或wrk进行测试。# 安装 httpd-tools 获取 ab sudo dnf install -y httpd-tools # 模拟 100 个并发用户,总共发送 10000 个请求 ab -n 10000 -c 100 http://your_server_ip/监控资源: 在另一个终端运行
top或htop,观察 Nginx 进程的 CPU 和内存使用是否在限制范围内,以及系统负载是否保持在合理水平。
7. 总结与最佳实践
AlmaLinux 的性能优化是一个持续的过程,涉及多个层面:
- 监控先行:始终从基准测试和监控开始,了解瓶颈所在。
- 渐进式调整:每次只调整少量参数,观察效果,避免一次性修改导致系统不可用。
- 利用工具:善用
tuned简化工作,使用sysctl、ulimit和 systemd 进行精细控制。 - 资源隔离:利用 cgroups 和 systemd 保护关键服务,确保资源公平分配。
- 文档化:记录所有的修改,以便在系统迁移或故障排查时参考。
通过遵循本指南中的步骤,你可以将 AlmaLinux 打造成一个高性能、稳定且资源高效的操作系统环境,满足各种严苛的生产需求。记住,没有“一刀切”的配置,最佳设置取决于你的具体硬件和工作负载特性。不断测试和迭代,你将找到最适合你的系统的优化方案。
