引言:为什么需要对 AlmaLinux 进行性能优化?
AlmaLinux 作为 CentOS 的替代者,继承了 RHEL 的稳定性和安全性,广泛应用于企业级服务器环境。然而,默认配置往往无法满足特定业务场景的性能需求。通过合理的性能优化,我们可以显著提升系统响应速度、资源利用率和应用吞吐量。
本文将从内核参数调整、文件系统优化、容器资源限制等多个维度,为您提供一份详尽的实战指南,帮助您在 AlmaLinux 上榨干每一分性能。
第一部分:系统级优化——内核参数调整
内核参数是操作系统的核心配置,直接影响系统的网络性能、内存管理和 I/O 效率。我们主要通过修改 /etc/sysctl.conf 文件来持久化调整这些参数。
1.1 网络性能优化
对于高并发网络服务(如 Web 服务器、数据库),网络栈的调优至关重要。
核心参数详解与示例
TCP 连接复用与快速回收
net.ipv4.tcp_tw_reuse = 1:允许将 TIME_WAIT 状态的 sockets 重新用于新的 TCP 连接。这对于高并发短连接场景(如 API 网关)非常有效。net.ipv4.tcp_tw_recycle = 0:在 NAT 环境下建议关闭,否则可能导致连接问题。net.ipv4.tcp_fin_timeout = 30:减少 FIN_WAIT_2 状态的超时时间,释放资源。
SYN Flood 攻击防御与连接队列
net.ipv4.tcp_syncookies = 1:当 SYN 队列满时,开启 Cookie 机制防止 SYN Flood 攻击。net.core.somaxconn = 65535:定义每个监听端口的最大连接队列长度。如果 Nginx 报错 “connection reset by peer” 或 “connection refused”,通常需要调大此值。net.ipv4.tcp_max_syn_backlog = 65535:SYN 接收队列大小。
拥塞控制算法
- 对于高丢包或长距离传输(如跨机房),推荐使用 BBR 算法。
net.core.default_qdisc = fqnet.ipv4.tcp_congestion_control = bbr
实战操作步骤
编辑配置文件:
sudo vi /etc/sysctl.conf添加优化配置(在文件末尾追加):
# 网络优化 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 65535 net.ipv4.tcp_syncookies = 1 # 开启 BBR net.core.default_qdisc = fq net.ipv4.tcp_congestion_control = bbr # 内存与缓存 vm.swappiness = 10 vm.vfs_cache_pressure = 50生效配置:
sudo sysctl -p验证 BBR 是否开启:
sysctl net.ipv4.tcp_congestion_control # 输出应为: net.ipv4.tcp_congestion_control = bbr
1.2 内存与 I/O 优化
调整 Swappiness(交换分区倾向性)
Linux 的 swappiness 值(0-100)控制系统使用 Swap 的倾向。
- 默认值 60:表示系统内存剩余 40% 时开始使用 Swap。
- 优化建议:对于数据库或高性能应用,Swap 会导致严重的 I/O 抖动。建议设置为 10 甚至 0(如果物理内存充足)。
# 临时生效
sudo sysctl vm.swappiness=10
# 永久生效(已在上面的 sysctl.conf 中添加)
echo "vm.swappiness = 10" >> /etc/sysctl.conf
调整 VFS Cache Pressure
该参数控制系统回收用于目录项和 inode 缓存的倾向。默认值 100。
- 优化建议:降低该值(如 50)可以保留更多的文件系统元数据缓存,提升大量文件读取的性能。
第二部分:文件系统与磁盘 I/O 优化
磁盘 I/O 往往是系统性能的瓶颈。在 AlmaLinux 上,我们可以从挂载选项和调度器入手。
2.1 挂载选项优化 (Mount Options)
编辑 /etc/fstab 文件来优化。
- noatime:禁止更新文件访问时间。每次读取文件时不再写入元数据,显著减少 I/O 操作。
- discard / nodiscard:对于 SSD,开启
discard可以支持 TRIM,保持 SSD 长期性能;但在某些场景下可能导致延迟,建议根据业务权衡。
示例:优化 /data 分区(假设为 SSD)
原内容:
/dev/mapper/vg_data-lv_data /data ext4 defaults 0 2
优化后:
/dev/mapper/vg_data-lv_data /data ext4 defaults,noatime,nodiscard 0 2
应用更改:
sudo mount -o remount /data
2.2 I/O 调度器选择
对于不同的硬件,I/O 调度器决定了请求处理的顺序。
- SSD/NVMe:不需要复杂的寻道,推荐使用 none 或 noop(简单的 FIFO 队列)。
- 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 设置为 noop
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
# 对于 HDD 设置为 deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
第三部分:容器环境下的资源限制与优化 (Docker/Podman)
在 AlmaLinux 上运行容器时,如果不加限制,单个容器可能会耗尽宿主机的所有资源,导致系统崩溃。我们需要利用 Cgroups 进行精细化控制。
3.1 Docker 守护进程配置
如果通过 Docker 运行,建议修改 /etc/docker/daemon.json 来设置默认的日志驱动和大小限制,防止日志撑爆磁盘。
配置示例:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
}
}
解释:限制单个容器日志最大 100MB,保留 3 个文件;默认打开文件数限制为 65536。
3.2 运行时资源限制实战 (Run-time Limits)
在启动容器时,必须显式指定 CPU 和内存限制。
场景:运行一个高负载的 Java 应用容器
假设宿主机为 4 核 16GB 内存,我们需要限制该应用最多使用 2 核 CPU 和 8GB 内存,并预留 1GB 内存给系统。
命令示例:
docker run -d \
--name java-app \
--restart unless-stopped \
--cpus="2.0" \
--memory="8g" \
--memory-reservation="7g" \
--memory-swap="8g" \
--ulimit nofile=65536:65536 \
-p 8080:8080 \
my-java-app:latest
参数详解:
--cpus="2.0":限制容器使用的 CPU 核心数为 2。相当于设置 CPU 配额。--memory="8g":硬限制,容器内存不能超过 8GB,超出会被 OOM Kill。--memory-reservation="7g":软限制,当内存达到 7GB 时,系统会发出警告并尝试回收内存。--memory-swap="8g":内存 + Swap 的总限制。这里设置为 8g,意味着 Swap 可用空间为 0(8g - 8g)。对于数据库容器,通常建议禁用 Swap。--ulimit:设置容器内部的 ulimit,防止 “Too many open files” 错误。
3.3 使用 Podman 的 Systemd 集成 (推荐在 AlmaLinux 使用)
AlmaLinux 默认包含 Podman,且推荐使用 Systemd 管理容器以实现开机自启和更好的资源控制。
创建 systemd 服务文件:/etc/systemd/system/myapp.service
[Unit]
Description=My High Performance App
After=network-online.target
Wants=network-online.target
[Service]
Restart=always
ExecStartPre=/usr/bin/rm -f /%t/%n-pid /%t/%n-cid
ExecStart=/usr/bin/podman run --name myapp \
--cpus=2 \
--memory=8g \
--log-opt max-size=10m \
-p 8080:8080 \
registry.example.com/myapp:latest
ExecStop=/usr/bin/podman stop -t 10 myapp
ExecStopPost=/usr/bin/podman rm -f myapp
# 资源限制:通过 systemd 的 Resource Control
# 这里的限制是针对整个 service 单元的(包括 podman 进程及其子进程)
CPUQuota=200% # 限制 2 个 CPU 核心
MemoryLimit=9G # 稍微大于容器限制,防止 systemd 层面被杀
[Install]
WantedBy=multi-user.target
启动并启用:
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
第四部分:系统监控与性能分析工具
优化不是一劳永逸的,需要持续监控。以下是在 AlmaLinux 上常用的工具。
4.1 综合性能分析:htop 与 glances
- htop:比 top 更直观,支持树状视图和鼠标操作。
sudo dnf install htop -y htop - glances:提供系统概览,包括容器资源占用。
sudo dnf install glances -y glances
4.2 I/O 分析:iotop
找出是哪个进程在疯狂读写磁盘。
sudo dnf install iotop -y
sudo iotop -o
-o:只显示正在进行 I/O 操作的进程。
4.3 网络分析:ss 与 nethogs
- ss:比 netstat 更快,用于查看网络连接状态。
ss -antp | grep ESTAB - nethogs:按进程实时统计流量。
sudo dnf install nethogs -y sudo nethogs
第五部分:进阶优化——透明大页与 NUMA
5.1 禁用透明大页 (Transparent Huge Pages - THP)
对于大多数数据库负载(如 MongoDB, PostgreSQL, Redis),THP 会导致内存分配延迟增加和 CPU 使用率上升。建议禁用。
检查状态:
cat /sys/kernel/mm/transparent_hugepage/enabled
# 输出通常为 [always] madvise never
永久禁用:
编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 行添加:
transparent_hugepage=never
更新 GRUB 并重启:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
5.2 NUMA (Non-Uniform Memory Access) 优化
在多路服务器上,CPU 访问本地内存比访问远端内存快。如果应用绑定了特定 CPU 核心,但内存分配在远端,性能会下降。
使用 numactl 控制:
假设我们要在 CPU 节点 0 上运行一个容器:
# 安装 numactl
sudo dnf install numactl -y
# 运行命令,绑定到 node 0
numactl --cpunodebind=0 --membind=0 docker run ...
总结
AlmaLinux 的性能优化是一个系统工程,涉及内核、文件系统、容器和应用层。
核心优化清单回顾:
- 网络:开启 BBR,增大连接队列 (
somaxconn)。 - 内存:降低
swappiness,调整vfs_cache_pressure。 - 磁盘:SSD 使用
noatime,调整 I/O 调度器。 - 容器:严格限制 CPU 和内存,配置日志轮转,使用 Systemd 管理。
- 监控:善用
iotop,ss,htop定位瓶颈。
通过以上步骤,您可以构建一个高性能、高稳定性的 AlmaLinux 运行环境。请根据实际业务负载逐步调整参数,并务必在生产环境变更前进行充分测试。
