引言

AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。性能优化是确保系统高效运行的关键,涉及从底层内核参数到上层应用配置的全方位调整。本文将深入探讨 AlmaLinux 的性能优化策略,涵盖内核调优、系统资源管理、网络优化、存储优化以及应用层实战,帮助您构建高性能的服务器环境。

一、内核调优

内核是操作系统的核心,其参数直接影响系统性能。AlmaLinux 基于 RHEL,可以通过 sysctl 命令动态调整内核参数。

1.1 内存管理优化

内存是系统性能的关键因素。优化内存管理可以减少交换(swap)使用,提高响应速度。

1.1.1 调整虚拟内存参数

编辑 /etc/sysctl.conf 文件,添加以下参数:

# 减少交换倾向,提高内存使用效率
vm.swappiness = 10
# 优化内存回收策略,避免过度回收
vm.vfs_cache_pressure = 50
# 增加内存分配的延迟,减少内存碎片
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

解释

  • vm.swappiness:控制内核将数据交换到磁盘的倾向。值越低,越倾向于使用物理内存。默认值为60,建议设置为10-30。
  • vm.vfs_cache_pressure:控制内核回收用于文件系统缓存的内存的倾向。默认值为100,设置为50可以保留更多缓存。
  • vm.dirty_ratiovm.dirty_background_ratio:控制脏页(未写入磁盘的数据)的比例。降低这些值可以减少I/O峰值,提高系统响应性。

1.1.2 大页内存(Huge Pages)

对于内存密集型应用(如数据库),使用大页内存可以减少TLB(Translation Lookaside Buffer)未命中,提高性能。

# 查看当前大页配置
cat /proc/meminfo | grep HugePages

# 临时设置大页数量(例如,1024个2MB大页)
echo 1024 > /proc/sys/vm/nr_hugepages

# 永久设置:在/etc/sysctl.conf中添加
vm.nr_hugepages = 1024

# 应用配置
sysctl -p

实战示例:在 PostgreSQL 数据库中启用大页内存。

  1. 安装 PostgreSQL:

    sudo dnf install postgresql-server
    sudo postgresql-setup --initdb
    
  2. 配置 PostgreSQL 使用大页:

    sudo vi /var/lib/pgsql/data/postgresql.conf
    

    添加:

    huge_pages = on
    shared_buffers = 4GB  # 根据实际内存调整
    
  3. 重启 PostgreSQL:

    sudo systemctl restart postgresql
    

1.2 CPU 调度优化

CPU 调度策略影响进程执行效率。AlmaLinux 默认使用 CFS(Completely Fair Scheduler),但可根据场景调整。

1.2.1 调整 CPU 调度策略

# 查看当前调度策略
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 设置为性能模式(适用于服务器)
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# 永久设置:安装 cpupowerutils
sudo dnf install cpupowerutils
sudo cpupower frequency-set -g performance

1.2.2 中断亲和性(IRQ Affinity)

将中断分配到特定 CPU 核心,减少上下文切换。

# 查看中断分布
cat /proc/interrupts

# 安装 irqbalance 服务
sudo dnf install irqbalance
sudo systemctl enable --now irqbalance

# 手动设置中断亲和性(示例:将网卡中断绑定到 CPU 0-3)
echo 0xF > /proc/irq/123/smp_affinity  # 123 是网卡中断号

实战示例:优化网络密集型应用(如 Nginx)的中断处理。

  1. 安装 Nginx:

    sudo dnf install nginx
    sudo systemctl enable --now nginx
    
  2. 配置中断亲和性: “`bash

    查找网卡中断号

    grep eth0 /proc/interrupts | awk ‘{print $1}’ | cut -d: -f1

# 假设中断号为 123,绑定到 CPU 0-3 echo 0xF > /proc/irq/123/smp_affinity


3. 验证:
   ```bash
   cat /proc/irq/123/smp_affinity

1.3 文件系统优化

文件系统参数影响 I/O 性能。常见文件系统如 ext4 和 XFS。

1.3.1 ext4 优化

# 挂载时添加优化参数
/dev/sda1 /data ext4 defaults,noatime,nodiratime,data=writeback 0 0

# 永久生效:编辑 /etc/fstab
/dev/sda1 /data ext4 defaults,noatime,nodiratime,data=writeback 0 0

参数说明

  • noatime:禁止更新文件访问时间,减少 I/O。
  • nodiratime:禁止更新目录访问时间。
  • data=writeback:提高写入性能,但可能增加数据丢失风险(适合非关键数据)。

1.3.2 XFS 优化

# 挂载时添加优化参数
/dev/sdb1 /data xfs defaults,noatime,nodiratime 0 0

# 调整 XFS 日志大小(适用于高写入负载)
sudo xfs_admin -L /dev/sdb1  # 查看日志大小
sudo xfs_admin -l /dev/sdb1  # 调整日志大小(需卸载)

二、系统资源管理

系统资源管理包括进程监控、资源限制和自动化调整。

2.1 进程监控与调整

使用 tophtoppidstat 等工具监控进程。

2.1.1 使用 pidstat 监控

# 安装 sysstat
sudo dnf install sysstat

# 监控进程 CPU 使用率(每秒一次,共10次)
pidstat -u 1 10

# 监控进程内存使用
pidstat -r 1 10

# 监控进程 I/O
pidstat -d 1 10

实战示例:优化高 CPU 使用率的 Java 应用。

  1. 使用 pidstat 找到高 CPU 进程:

    pidstat -u 1 10 | grep java
    
  2. 分析线程:

    # 查看 Java 进程的线程
    top -H -p <java_pid>
    
  3. 调整 JVM 参数:

    # 编辑启动脚本,添加 JVM 参数
    java -Xms4g -Xmx4g -XX:+UseG1GC -jar app.jar
    

2.2 资源限制(cgroups)

使用 cgroups 限制进程资源,防止资源耗尽。

2.2.1 安装 cgroups 工具

sudo dnf install libcgroup-tools

2.2.2 创建 cgroup 限制 CPU

# 创建 cgroup
sudo cgcreate -g cpu:/myapp

# 设置 CPU 限制(例如,最多使用 2 个 CPU 核心)
sudo cgset -r cpu.cfs_quota_us=200000 myapp
sudo cgset -r cpu.cfs_period_us=100000 myapp

# 将进程加入 cgroup
sudo cgexec -g cpu:myapp --sticky <command>

实战示例:限制 Nginx 进程的 CPU 使用。

  1. 创建 cgroup:

    sudo cgcreate -g cpu:/nginx
    sudo cgset -r cpu.cfs_quota_us=100000 nginx  # 100% 单核
    sudo cgset -r cpu.cfs_period_us=100000 nginx
    
  2. 启动 Nginx 在 cgroup 中:

    sudo cgexec -g cpu:nginx --sticky /usr/sbin/nginx
    
  3. 验证:

    cat /sys/fs/cgroup/cpu/nginx/cpu.stat
    

三、网络优化

网络性能对服务器至关重要,尤其是 Web 服务和数据库。

3.1 TCP/IP 参数调优

编辑 /etc/sysctl.conf

# 增加 TCP 连接队列大小
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# 优化 TCP 窗口大小
net.ipv4.tcp_window_scaling = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 减少 TIME_WAIT 状态连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

# 启用 TCP Fast Open
net.ipv4.tcp_fastopen = 3

# 应用配置
sysctl -p

3.2 网卡多队列(RSS/RPS/RFS)

现代网卡支持多队列,可以将中断分配到多个 CPU 核心。

3.2.1 启用多队列

# 查看网卡队列
ethtool -l eth0

# 设置队列数量(例如,设置为 8)
sudo ethtool -L eth0 combined 8

# 启用 RSS(Receive Side Scaling)
sudo ethtool -K eth0 rxhash on

3.2.2 配置 RPS(Receive Packet Steering)

# 查看当前 RPS 配置
cat /sys/class/net/eth0/queues/rx-0/rps_cpus

# 设置 RPS(例如,使用 CPU 0-7)
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus

# 永久设置:创建 udev 规则
sudo vi /etc/udev/rules.d/99-network.rules

添加:

ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth0", RUN+="/bin/sh -c 'echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus'"

3.3 网络工具监控

使用 ssnetstatiftop 等工具监控网络。

# 安装工具
sudo dnf install net-tools iftop

# 查看连接状态
ss -tunap

# 实时监控网络流量
sudo iftop -i eth0

实战示例:优化高并发 Web 服务器。

  1. 调整 TCP 参数:

    # 在 /etc/sysctl.conf 中添加
    net.core.netdev_max_backlog = 300000
    net.ipv4.tcp_max_tw_buckets = 2000000
    
  2. 配置 Nginx:

    sudo vi /etc/nginx/nginx.conf
    

    添加:

    worker_processes auto;
    worker_connections 10240;
    use epoll;
    
  3. 重启 Nginx:

    sudo systemctl restart nginx
    

四、存储优化

存储 I/O 是常见瓶颈,尤其是数据库和文件服务器。

4.1 I/O 调度器

AlmaLinux 支持多种 I/O 调度器,如 noopdeadlinecfqkybermq-deadline

4.1.1 查看和设置调度器

# 查看当前调度器
cat /sys/block/sda/queue/scheduler

# 设置为 deadline(适合数据库)
echo deadline > /sys/block/sda/queue/scheduler

# 永久设置:编辑 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="... elevator=deadline"
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

4.2 RAID 配置

RAID 可以提高 I/O 性能和冗余。

4.2.1 软件 RAID(mdadm)

# 安装 mdadm
sudo dnf install mdadm

# 创建 RAID 10(4 个磁盘)
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde

# 格式化并挂载
sudo mkfs.ext4 /dev/md0
sudo mount /dev/md0 /data

# 永久挂载:编辑 /etc/fstab
/dev/md0 /data ext4 defaults 0 0

4.3 文件系统优化(续)

4.3.1 调整文件系统参数

# 调整 ext4 的保留块(减少空间浪费)
sudo tune2fs -m 1 /dev/sda1  # 保留 1% 空间给 root

# 调整 XFS 的分配策略
sudo xfs_io -c "falloc 0 1G" /data/testfile  # 测试分配

实战示例:优化 MySQL 数据库的存储。

  1. 配置 I/O 调度器:

    echo deadline > /sys/block/sda/queue/scheduler
    
  2. 调整 MySQL 配置:

    sudo vi /etc/my.cnf
    

    添加:

    [mysqld]
    innodb_buffer_pool_size = 4G
    innodb_log_file_size = 512M
    innodb_flush_method = O_DIRECT
    innodb_flush_log_at_trx_commit = 2
    
  3. 重启 MySQL:

    sudo systemctl restart mysqld
    

五、应用层实战

应用层优化涉及具体软件的配置,如 Web 服务器、数据库、缓存等。

5.1 Web 服务器优化(Nginx)

5.1.1 Nginx 配置优化

# /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 100000;

events {
    worker_connections 10240;
    use epoll;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

    # 缓存静态文件
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

5.1.2 使用 HTTP/2

# 安装 Nginx 支持 HTTP/2
sudo dnf install nginx-mod-http-ssl

# 配置 SSL 和 HTTP/2
sudo vi /etc/nginx/conf.d/ssl.conf

添加:

server {
    listen 443 ssl http2;
    ssl_certificate /etc/ssl/certs/nginx.crt;
    ssl_certificate_key /etc/ssl/private/nginx.key;
    # ... 其他配置
}

5.2 数据库优化(PostgreSQL)

5.2.1 PostgreSQL 配置优化

# 编辑配置文件
sudo vi /var/lib/pgsql/data/postgresql.conf

关键参数:

# 内存设置
shared_buffers = 4GB  # 通常为总内存的 25%
effective_cache_size = 12GB  # 通常为总内存的 75%
work_mem = 64MB  # 每个操作的内存,根据并发调整

# 日志设置
wal_level = replica
max_wal_size = 2GB
min_wal_size = 512MB

# 连接设置
max_connections = 200
shared_preload_libraries = 'pg_stat_statements'

5.2.2 使用 pg_stat_statements 监控

-- 启用扩展
CREATE EXTENSION pg_stat_statements;

-- 查看慢查询
SELECT query, calls, total_time, mean_time, rows
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;

5.3 缓存优化(Redis)

5.3.1 Redis 配置优化

# 编辑 Redis 配置
sudo vi /etc/redis.conf

关键参数:

# 内存设置
maxmemory 4GB
maxmemory-policy allkeys-lru  # LRU 淘汰策略

# 持久化
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec

# 网络
tcp-keepalive 300
timeout 0

5.3.2 使用 Redis Benchmark 测试

# 安装 redis-tools
sudo dnf install redis-tools

# 运行基准测试
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

5.4 容器化应用优化(Docker)

5.4.1 Docker 配置优化

# 编辑 Docker 守护进程配置
sudo vi /etc/docker/daemon.json

添加:

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65536,
      "Soft": 65536
    }
  }
}

5.4.2 使用 Docker Compose 优化

# docker-compose.yml
version: '3.8'
services:
  web:
    image: nginx:latest
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - app-network

  db:
    image: postgres:latest
    deploy:
      resources:
        limits:
          cpus: '2'
          memory: 2G
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - app-network

volumes:
  db-data:

networks:
  app-network:
    driver: bridge

六、监控与自动化

性能优化是一个持续过程,需要监控和自动化调整。

6.1 监控工具

6.1.1 Prometheus + Grafana

# 安装 Prometheus
sudo dnf install prometheus

# 配置 Prometheus
sudo vi /etc/prometheus/prometheus.yml

添加:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

6.1.2 Node Exporter

# 安装 Node Exporter
sudo dnf install node_exporter

# 启动服务
sudo systemctl enable --now node_exporter

6.2 自动化脚本

6.2.1 性能调优脚本

#!/bin/bash
# optimize_alma.sh

# 调整内核参数
echo "vm.swappiness=10" >> /etc/sysctl.conf
echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
sysctl -p

# 调整 I/O 调度器
echo deadline > /sys/block/sda/queue/scheduler

# 调整网络参数
echo "net.core.somaxconn=65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog=65535" >> /etc/sysctl.conf
sysctl -p

# 启用大页内存
echo 1024 > /proc/sys/vm/nr_hugepages

echo "优化完成!"

6.2.2 使用 Ansible 自动化

# playbook.yml
- hosts: all
  become: yes
  tasks:
    - name: 安装 sysstat
      dnf:
        name: sysstat
        state: present

    - name: 调整内核参数
      sysctl:
        name: "{{ item.key }}"
        value: "{{ item.value }}"
        state: present
        reload: yes
      loop:
        - { key: "vm.swappiness", value: "10" }
        - { key: "vm.vfs_cache_pressure", value: "50" }
        - { key: "net.core.somaxconn", value: "65535" }

    - name: 设置 I/O 调度器
      shell: echo deadline > /sys/block/sda/queue/scheduler
      args:
        creates: /sys/block/sda/queue/scheduler

七、总结

AlmaLinux 性能优化是一个系统工程,需要从内核、系统、网络、存储到应用层全面考虑。通过本文的指南,您可以:

  1. 内核调优:调整内存、CPU、文件系统参数,提升基础性能。
  2. 系统资源管理:使用 cgroups 和监控工具管理进程资源。
  3. 网络优化:优化 TCP 参数和网卡配置,提高网络吞吐量。
  4. 存储优化:选择合适的 I/O 调度器和 RAID 配置,加速 I/O。
  5. 应用层实战:针对 Nginx、PostgreSQL、Redis 等常见应用进行配置优化。
  6. 监控与自动化:使用 Prometheus、Grafana 和脚本实现持续优化。

性能优化没有银弹,需要根据实际负载和硬件环境进行测试和调整。建议在生产环境应用前,在测试环境中充分验证。持续监控和迭代优化是保持系统高性能的关键。

通过本文的实战指南,您将能够构建一个高效、稳定的 AlmaLinux 服务器环境,满足各种业务需求。