引言
AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。然而,默认配置往往无法充分发挥硬件性能,尤其在高并发、大数据量场景下。本文将从内核参数调优、文件系统优化、网络栈调整、应用层加速及常见问题解析等方面,提供一套完整的性能优化方案,并辅以实战代码和配置示例。
一、内核参数调优
内核参数直接影响系统资源调度、内存管理和 I/O 性能。通过调整 /etc/sysctl.conf 或 /etc/sysctl.d/ 下的配置文件,可以优化系统行为。
1.1 内存管理优化
问题场景:系统频繁发生内存交换(swap),导致 I/O 压力增大,响应变慢。
解决方案:调整 vm.swappiness 和 vm.vfs_cache_pressure。
vm.swappiness:控制内核使用 swap 的倾向,值越低越倾向于使用物理内存。vm.vfs_cache_pressure:控制内核回收 inode 和 dentry 缓存的倾向,值越高回收越积极。
配置示例:
# 编辑 sysctl 配置文件
sudo vi /etc/sysctl.d/99-memory.conf
# 添加以下内容
vm.swappiness = 10
vm.vfs_cache_pressure = 50
生效命令:
sudo sysctl -p /etc/sysctl.d/99-memory.conf
验证:
cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure
1.2 网络栈优化
问题场景:高并发网络连接下,系统出现大量 TIME_WAIT 或 SYN 丢包。
解决方案:调整 TCP 相关参数。
net.ipv4.tcp_tw_reuse:允许重用 TIME_WAIT 状态的 socket。net.ipv4.tcp_max_syn_backlog:增加 SYN 队列长度。net.core.somaxconn:增加监听队列长度。
配置示例:
sudo vi /etc/sysctl.d/99-network.conf
# 添加以下内容
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 1440000
生效命令:
sudo sysctl -p /etc/sysctl.d/99-network.conf
验证:
ss -s | grep timewait
netstat -s | grep "SYNs to LISTEN"
1.3 文件系统优化
问题场景:大量小文件读写性能差。
解决方案:调整 vm.dirty_background_ratio 和 vm.dirty_ratio,控制脏页写回策略。
配置示例:
sudo vi /etc/sysctl.d/99-fs.conf
# 添加以下内容
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 3000
生效命令:
sudo sysctl -p /etc/sysctl.d/99-fs.conf
二、文件系统优化
文件系统选择和挂载参数对 I/O 性能至关重要。
2.1 文件系统选择
- XFS:适合大文件和高并发场景,AlmaLinux 默认文件系统。
- ext4:通用性好,适合中小文件。
- Btrfs:支持快照和压缩,但性能略逊。
建议:对于数据库、日志等大文件场景,优先使用 XFS。
2.2 挂载参数优化
问题场景:磁盘 I/O 瓶颈,尤其是随机读写。
解决方案:调整挂载参数,如 noatime、nodiratime、barrier 等。
配置示例:
# 编辑 /etc/fstab
sudo vi /etc/fstab
# 修改对应磁盘的挂载选项,例如:
UUID=xxxx-xxxx-xxxx /data xfs defaults,noatime,nodiratime,barrier=0 0 0
参数说明:
noatime:禁止更新文件访问时间,减少写操作。nodiratime:禁止更新目录访问时间。barrier=0:禁用写屏障(仅适用于有 UPS 保护的环境,否则可能丢数据)。
生效命令:
sudo mount -o remount /data
2.3 使用 fstrim 优化 SSD
问题场景:SSD 长期使用后性能下降。
解决方案:定期执行 fstrim 回收空闲块。
配置示例:
# 手动执行
sudo fstrim -v /
# 设置定时任务(每周一次)
sudo crontab -e
# 添加以下内容
0 2 * * 0 /usr/sbin/fstrim -v /
三、网络栈优化
网络性能优化涉及内核参数、网卡驱动和协议栈。
3.1 网卡驱动优化
问题场景:网络吞吐量低,延迟高。
解决方案:启用网卡多队列(RSS)和中断绑定。
步骤:
检查网卡是否支持多队列:
ethtool -l eth0启用多队列(以
eth0为例):sudo ethtool -L eth0 combined 8绑定中断到 CPU 核心: “`bash
查看中断号
cat /proc/interrupts | grep eth0
# 绑定中断(示例:将中断 100-107 绑定到 CPU 0-7) for i in {100..107}; do echo \(i > /proc/irq/\)i/smp_affinity_list; done
### 3.2 TCP BBR 拥塞控制算法
**问题场景**:高延迟网络下吞吐量低。
**解决方案**:启用 BBR(Bottleneck Bandwidth and RTT)算法。
**配置示例**:
```bash
# 编辑 sysctl 配置文件
sudo vi /etc/sysctl.d/99-bbr.conf
# 添加以下内容
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
生效命令:
sudo sysctl -p /etc/sysctl.d/99-bbr.conf
验证:
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr
四、应用层加速
应用层优化需结合具体应用,如数据库、Web 服务器等。
4.1 数据库优化(以 MySQL 为例)
问题场景:查询慢,连接数高。
解决方案:调整 MySQL 配置文件 my.cnf。
配置示例:
[mysqld]
# 内存相关
innodb_buffer_pool_size = 4G # 根据内存调整,通常为总内存的 50-70%
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2 # 平衡性能与数据安全
# 连接相关
max_connections = 500
thread_cache_size = 50
# 查询缓存(MySQL 8.0 已移除,5.7 可用)
query_cache_type = 1
query_cache_size = 64M
验证:
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
4.2 Web 服务器优化(以 Nginx 为例)
问题场景:高并发下响应慢。
解决方案:调整 Nginx 配置文件 nginx.conf。
配置示例:
worker_processes auto; # 自动设置为 CPU 核心数
worker_connections 1024; # 每个 worker 的最大连接数
worker_rlimit_nofile 65535; # 文件描述符限制
events {
use epoll; # Linux 高性能事件模型
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 100;
client_max_body_size 10m;
# Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
验证:
nginx -t # 测试配置
systemctl reload nginx
4.3 缓存优化
问题场景:重复请求导致后端压力大。
解决方案:引入 Redis 或 Memcached 作为缓存层。
Redis 配置示例:
# 编辑 redis.conf
sudo vi /etc/redis/redis.conf
# 修改以下参数
maxmemory 4G
maxmemory-policy allkeys-lru
tcp-keepalive 300
timeout 0
启动 Redis:
sudo systemctl start redis
sudo systemctl enable redis
五、监控与诊断工具
性能优化需持续监控,以下工具可帮助定位瓶颈。
5.1 系统级监控
- top/htop:实时查看 CPU、内存使用情况。
- iostat:监控磁盘 I/O。
- vmstat:监控虚拟内存、进程、CPU 活动。
- netstat/ss:监控网络连接。
示例:
# 每 2 秒刷新一次磁盘 I/O
iostat -x 2
# 查看 TCP 连接状态
ss -s
5.2 应用级监控
- Prometheus + Grafana:开源监控方案,支持自定义指标。
- ELK Stack:日志分析,定位性能问题。
Prometheus 配置示例(prometheus.yml):
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100'] # Node Exporter
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104'] # MySQL Exporter
六、常见问题解析
6.1 问题:系统突然变慢,CPU 使用率高
可能原因:
- 某个进程占用大量 CPU。
- 上下文切换频繁。
- 硬件故障(如 CPU 过热降频)。
排查步骤:
- 使用
top或htop查看 CPU 使用率最高的进程。 - 使用
pidstat -w查看上下文切换情况。 - 使用
dmesg或sensors检查硬件状态。
解决方案:
- 如果是某个进程问题,优化该进程或限制资源(如使用
cgroups)。 - 如果是上下文切换频繁,调整内核参数(如
vm.swappiness)。 - 如果是硬件问题,检查散热或更换硬件。
6.2 问题:磁盘 I/O 瓶颈
可能原因:
- 磁盘性能不足(如 HDD 用于高 I/O 场景)。
- 文件系统碎片化。
- 大量小文件读写。
排查步骤:
- 使用
iostat -x 1查看磁盘利用率和等待时间。 - 使用
iotop查看哪个进程占用 I/O 最多。 - 使用
df -h和du -sh检查磁盘空间。
解决方案:
- 升级到 SSD 或 RAID 配置。
- 定期执行
fstrim(SSD)或碎片整理(HDD)。 - 优化应用层,减少小文件读写(如合并日志)。
6.3 问题:网络延迟高
可能原因:
- 网络拥塞。
- DNS 解析慢。
- 防火墙规则过多。
排查步骤:
- 使用
ping和traceroute检查网络延迟。 - 使用
dig或nslookup检查 DNS 解析时间。 - 使用
iptables -L -n检查防火墙规则。
解决方案:
- 启用 BBR 拥塞控制算法。
- 使用本地 DNS 缓存(如
dnsmasq)。 - 优化防火墙规则,减少不必要的规则。
七、实战案例:优化一个高并发 Web 服务器
7.1 场景描述
一台 AlmaLinux 服务器,配置为 16 核 CPU、32GB 内存、SSD 磁盘,运行 Nginx 和 PHP-FPM,处理高并发 Web 请求。当前响应时间超过 500ms,需要优化。
7.2 优化步骤
7.2.1 内核参数调优
sudo vi /etc/sysctl.d/99-optimization.conf
# 添加以下内容
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
vm.swappiness = 10
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
7.2.2 文件系统优化
# 修改 /etc/fstab,为 /data 分区添加 noatime
sudo vi /etc/fstab
# 添加:UUID=xxxx-xxxx-xxxx /data xfs defaults,noatime 0 0
sudo mount -o remount /data
7.2.3 Nginx 优化
# /etc/nginx/nginx.conf
worker_processes auto;
worker_connections 4096;
worker_rlimit_nofile 65535;
events {
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 100;
# Gzip 压缩
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 限制请求体大小
client_max_body_size 10m;
}
7.2.4 PHP-FPM 优化
; /etc/php-fpm.d/www.conf
pm = dynamic
pm.max_children = 200
pm.start_servers = 50
pm.min_spare_servers = 20
pm.max_spare_servers = 100
pm.max_requests = 1000
request_terminate_timeout = 30
7.2.5 缓存引入
# 安装 Redis
sudo dnf install redis -y
sudo systemctl start redis
sudo systemctl enable redis
# 配置 Redis
sudo vi /etc/redis/redis.conf
# 修改:maxmemory 8G, maxmemory-policy allkeys-lru
7.2.6 监控配置
# 安装 Node Exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz
sudo mv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
sudo useradd -rs /bin/false node_exporter
# 创建 systemd 服务
sudo vi /etc/systemd/system/node_exporter.service
# 内容略...
sudo systemctl start node_exporter
7.3 优化效果
- 响应时间从 500ms 降至 100ms。
- 并发连接数从 1000 提升至 5000。
- CPU 使用率从 90% 降至 60%。
八、总结
AlmaLinux 性能优化是一个系统工程,需要从内核、文件系统、网络到应用层全面考虑。通过合理的参数调整、工具使用和监控,可以显著提升系统性能。建议在生产环境变更前,先在测试环境验证,并做好备份。持续监控和迭代优化是保持系统高性能的关键。
九、参考资源
通过以上步骤,您可以系统地优化 AlmaLinux 服务器,应对各种性能挑战。
