引言

AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。然而,默认配置往往无法充分发挥硬件性能,尤其在高并发、大数据量场景下。本文将从内核参数调优、文件系统优化、网络栈调整、应用层加速及常见问题解析等方面,提供一套完整的性能优化方案,并辅以实战代码和配置示例。


一、内核参数调优

内核参数直接影响系统资源调度、内存管理和 I/O 性能。通过调整 /etc/sysctl.conf/etc/sysctl.d/ 下的配置文件,可以优化系统行为。

1.1 内存管理优化

问题场景:系统频繁发生内存交换(swap),导致 I/O 压力增大,响应变慢。

解决方案:调整 vm.swappinessvm.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_WAITSYN 丢包。

解决方案:调整 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_ratiovm.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 瓶颈,尤其是随机读写。

解决方案:调整挂载参数,如 noatimenodiratimebarrier 等。

配置示例

# 编辑 /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)和中断绑定。

步骤

  1. 检查网卡是否支持多队列:

    
    ethtool -l eth0
    

  2. 启用多队列(以 eth0 为例):

    
    sudo ethtool -L eth0 combined 8
    

  3. 绑定中断到 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 使用率高

可能原因

  1. 某个进程占用大量 CPU。
  2. 上下文切换频繁。
  3. 硬件故障(如 CPU 过热降频)。

排查步骤

  1. 使用 tophtop 查看 CPU 使用率最高的进程。
  2. 使用 pidstat -w 查看上下文切换情况。
  3. 使用 dmesgsensors 检查硬件状态。

解决方案

  • 如果是某个进程问题,优化该进程或限制资源(如使用 cgroups)。
  • 如果是上下文切换频繁,调整内核参数(如 vm.swappiness)。
  • 如果是硬件问题,检查散热或更换硬件。

6.2 问题:磁盘 I/O 瓶颈

可能原因

  1. 磁盘性能不足(如 HDD 用于高 I/O 场景)。
  2. 文件系统碎片化。
  3. 大量小文件读写。

排查步骤

  1. 使用 iostat -x 1 查看磁盘利用率和等待时间。
  2. 使用 iotop 查看哪个进程占用 I/O 最多。
  3. 使用 df -hdu -sh 检查磁盘空间。

解决方案

  • 升级到 SSD 或 RAID 配置。
  • 定期执行 fstrim(SSD)或碎片整理(HDD)。
  • 优化应用层,减少小文件读写(如合并日志)。

6.3 问题:网络延迟高

可能原因

  1. 网络拥塞。
  2. DNS 解析慢。
  3. 防火墙规则过多。

排查步骤

  1. 使用 pingtraceroute 检查网络延迟。
  2. 使用 dignslookup 检查 DNS 解析时间。
  3. 使用 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 性能优化是一个系统工程,需要从内核、文件系统、网络到应用层全面考虑。通过合理的参数调整、工具使用和监控,可以显著提升系统性能。建议在生产环境变更前,先在测试环境验证,并做好备份。持续监控和迭代优化是保持系统高性能的关键。


九、参考资源

  1. AlmaLinux 官方文档
  2. Linux 内核参数调优指南
  3. Nginx 性能优化最佳实践
  4. MySQL 性能调优手册

通过以上步骤,您可以系统地优化 AlmaLinux 服务器,应对各种性能挑战。