引言

AlmaLinux 作为 CentOS 的直接替代品,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。性能优化是确保系统高效运行的关键,涉及从内核参数调整到应用层配置的多个层面。本文将深入探讨 AlmaLinux 的性能优化策略,提供从理论到实践的全方位指南,帮助您系统性地提升服务器性能。

一、性能优化基础:监控与基准测试

1.1 性能监控工具

在优化之前,必须先了解系统当前状态。AlmaLinux 提供了丰富的监控工具:

  • top/htop:实时查看进程和系统资源使用情况
  • vmstat:监控虚拟内存统计信息
  • iostat:监控磁盘 I/O 统计信息
  • netstat/ss:监控网络连接和统计信息
  • sar:系统活动报告工具(需安装 sysstat 包)
# 安装 sysstat 工具
sudo dnf install sysstat -y

# 启动 sysstat 服务并设置开机自启
sudo systemctl enable --now sysstat

# 查看 CPU 使用情况(每秒采样一次,共3次)
sar -u 1 3

# 查看内存使用情况
sar -r 1 3

# 查看磁盘 I/O 情况
sar -d 1 3

1.2 基准测试工具

  • CPU 基准测试:sysbench, stress-ng
  • 内存基准测试:sysbench, stream
  • 磁盘 I/O 基准测试:fio, iozone
  • 网络基准测试:iperf3, netperf
# 安装基准测试工具
sudo dnf install sysbench stress-ng fio iperf3 -y

# CPU 基准测试示例
sysbench cpu --cpu-max-prime=20000 run

# 磁盘 I/O 基准测试示例
fio --name=randread --ioengine=libaio --iodepth=64 --rw=randread --bs=4k --direct=1 --size=1G --numjobs=8 --runtime=60 --group_reporting

二、内核参数调优

2.1 虚拟内存管理

虚拟内存参数直接影响系统内存使用效率。关键参数包括:

  • vm.swappiness:控制内核将内存页交换到磁盘的倾向性(0-100)
  • vm.vfs_cache_pressure:控制内核回收 inode 和 dentry 缓存的倾向性(默认100)
  • vm.dirty_ratiovm.dirty_background_ratio:控制脏页写入磁盘的阈值
# 查看当前虚拟内存参数
sysctl vm.swappiness
sysctl vm.vfs_cache_pressure

# 临时修改(重启后失效)
sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=50

# 永久修改(编辑 /etc/sysctl.conf)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
echo "vm.vfs_cache_pressure=50" | sudo tee -a /etc/sysctl.conf

# 应用配置
sudo sysctl -p

实战场景:对于数据库服务器,建议降低 swappiness(如设置为1-10),避免频繁交换影响性能。对于文件服务器,可适当提高 vfs_cache_pressure 以释放更多缓存。

2.2 网络参数调优

网络性能对服务器至关重要,特别是 Web 服务器和数据库服务器:

  • net.core.somaxconn:TCP 连接队列的最大长度
  • net.ipv4.tcp_max_syn_backlog:SYN 队列的最大长度
  • net.ipv4.tcp_tw_reuse:允许 TIME_WAIT 状态的套接字重用
  • net.ipv4.tcp_fin_timeout:FIN 超时时间(秒)
# 查看当前网络参数
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_max_syn_backlog

# 优化网络参数(适用于高并发 Web 服务器)
sudo sysctl -w net.core.somaxconn=65535
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
sudo sysctl -w net.ipv4.tcp_fin_timeout=30

# 永久修改
cat <<EOF | sudo tee -a /etc/sysctl.conf
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=30
EOF

sudo sysctl -p

2.3 文件系统参数

  • fs.file-max:系统可打开的最大文件数
  • fs.nr_open:每个进程可打开的最大文件数
  • fs.inotify.max_user_watches:inotify 监控的最大文件数
# 查看当前文件系统参数
sysctl fs.file-max
sysctl fs.nr_open

# 优化文件系统参数
sudo sysctl -w fs.file-max=2097152
sudo sysctl -w fs.nr_open=2097152
sudo sysctl -w fs.inotify.max_user_watches=524288

# 永久修改
cat <<EOF | sudo tee -a /etc/sysctl.conf
fs.file-max=2097152
fs.nr_open=2097152
fs.inotify.max_user_watches=524288
EOF

sudo sysctl -p

三、系统级优化

3.1 资源限制调整

使用 ulimit 调整用户级资源限制:

# 查看当前限制
ulimit -a

# 临时修改(仅当前会话)
ulimit -n 65535  # 最大打开文件数
ulimit -u 65535  # 最大进程数

# 永久修改(编辑 /etc/security/limits.conf)
cat <<EOF | sudo tee -a /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
EOF

# 需要重新登录或重启服务生效

3.2 CPU 调度器优化

AlmaLinux 支持多种 CPU 调度器,适用于不同场景:

  • performance:高性能模式,适合计算密集型任务
  • powersave:节能模式,适合低负载场景
  • schedutil:动态调整,平衡性能和功耗(默认)
# 查看当前 CPU 调度器
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 临时修改为 performance 模式
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

# 永久修改(安装 cpupower 工具)
sudo dnf install cpupower -y

# 编辑配置文件
cat <<EOF | sudo tee /etc/sysconfig/cpupower
CPUPOWER_GOVERNOR="performance"
EOF

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

3.3 磁盘 I/O 调度器

磁盘 I/O 调度器影响磁盘读写性能:

  • deadline:适合数据库等随机读写场景
  • cfq:公平队列,适合多用户环境(默认)
  • noop:适合虚拟机或 SSD
# 查看当前磁盘调度器
cat /sys/block/sda/queue/scheduler

# 临时修改(假设磁盘为 sda)
echo deadline | sudo tee /sys/block/sda/queue/scheduler

# 永久修改(使用 udev 规则)
cat <<EOF | sudo tee /etc/udev/rules.d/60-scheduler.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"
EOF

# 重新加载 udev 规则
sudo udevadm control --reload-rules
sudo udevadm trigger

四、应用层调优

4.1 Web 服务器优化(Nginx)

Nginx 是 AlmaLinux 上常用的 Web 服务器,优化配置可显著提升性能:

# /etc/nginx/nginx.conf 优化配置示例
user nginx;
worker_processes auto;  # 自动设置为 CPU 核心数
worker_rlimit_nofile 65535;  # 工作进程可打开的最大文件数

events {
    worker_connections 65535;  # 每个工作进程的最大连接数
    use epoll;  # 使用 epoll 事件模型(Linux 2.6+)
    multi_accept on;  # 一次接受多个连接
}

http {
    # 基础优化
    sendfile on;  # 启用 sendfile,减少数据拷贝
    tcp_nopush on;  # 在一个包中发送响应头
    tcp_nodelay on;  # 禁用 Nagle 算法,减少延迟
    keepalive_timeout 65;  # 保持连接超时时间
    keepalive_requests 1000;  # 单个连接的最大请求数
    
    # 缓冲区优化
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;
    
    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml+rss application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
    
    # 缓存配置
    open_file_cache max=10000 inactive=30s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    # 虚拟主机配置
    server {
        listen 80;
        server_name example.com;
        
        # 静态资源缓存
        location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
            expires 365d;
            add_header Cache-Control "public, immutable";
        }
        
        # PHP-FPM 配置(如果使用 PHP)
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            
            # FastCGI 缓冲区优化
            fastcgi_buffers 16 16k;
            fastcgi_buffer_size 32k;
            fastcgi_busy_buffers_size 64k;
            fastcgi_temp_file_write_size 64k;
        }
    }
}

4.2 数据库优化(MySQL/MariaDB)

数据库性能优化是服务器调优的重点:

# /etc/my.cnf.d/server.cnf 优化配置示例
[mysqld]
# 基础配置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

# 内存配置(根据服务器内存调整)
innodb_buffer_pool_size = 4G  # 通常设置为总内存的 50-70%
innodb_buffer_pool_instances = 8  # 缓冲池实例数,通常 4-8
innodb_log_file_size = 512M  # 日志文件大小
innodb_log_buffer_size = 64M  # 日志缓冲区大小

# I/O 配置
innodb_flush_method = O_DIRECT  # 直接 I/O,避免双缓存
innodb_flush_log_at_trx_commit = 2  # 平衡性能和数据安全
innodb_file_per_table = ON  # 每个表独立表空间
innodb_io_capacity = 2000  # I/O 能力(SSD 可设置更高)

# 连接配置
max_connections = 200  # 最大连接数
thread_cache_size = 50  # 线程缓存
table_open_cache = 2000  # 表缓存

# 查询缓存(MySQL 5.7 及以下)
query_cache_type = 0  # MySQL 8.0 已移除,建议禁用
query_cache_size = 0

# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2  # 慢查询阈值(秒)

# 其他优化
tmp_table_size = 256M
max_heap_table_size = 256M
join_buffer_size = 8M
sort_buffer_size = 8M
read_buffer_size = 4M
read_rnd_buffer_size = 8M

4.3 应用服务器优化(Java/Tomcat)

对于 Java 应用服务器,JVM 参数调优至关重要:

# Tomcat 启动脚本优化(/etc/tomcat/tomcat.conf)
CATALINA_OPTS="
-Xms4G -Xmx4G  # 初始和最大堆内存(根据应用需求调整)
-XX:+UseG1GC  # 使用 G1 垃圾回收器(适合大内存)
-XX:MaxGCPauseMillis=200  # 目标最大 GC 暂停时间
-XX:+ParallelRefProcEnabled  # 并行处理引用对象
-XX:+ExplicitGCInvokesConcurrent  # 显式 GC 并行执行
-XX:+HeapDumpOnOutOfMemoryError  # OOM 时生成堆转储
-XX:HeapDumpPath=/var/log/tomcat/heapdump.hprof
-XX:+PrintGCDetails  # 打印 GC 详情
-XX:+PrintGCDateStamps  # 打印 GC 时间戳
-XX:+PrintTenuringDistribution  # 打印对象年龄分布
-XX:+UseStringDeduplication  # 字符串去重(G1GC 特有)
-XX:+OptimizeStringConcat  # 优化字符串连接
-XX:+UseCompressedOops  # 使用压缩对象指针(32位地址空间)
-XX:+UseCompressedClassPointers  # 使用压缩类指针
-XX:MaxMetaspaceSize=256M  # 元空间最大大小
-XX:MetaspaceSize=128M  # 元空间初始大小
-XX:+DisableExplicitGC  # 禁用 System.gc() 调用
-XX:+ExitOnOutOfMemoryError  # OOM 时直接退出
-XX:ErrorFile=/var/log/tomcat/hs_err_pid%p.log  # 错误日志路径
"

五、容器化环境优化

5.1 Docker 容器优化

在 AlmaLinux 上运行 Docker 容器时,需要特别注意资源限制和配置:

# 优化 Docker 守护进程配置
sudo tee /etc/docker/daemon.json <<EOF
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ],
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 65535,
      "Soft": 65535
    }
  },
  "exec-opts": ["native.cgroupdriver=systemd"],
  "max-concurrent-downloads": 3,
  "max-concurrent-uploads": 3,
  "live-restore": true,
  "no-new-privileges": true
}
EOF

# 重启 Docker 服务
sudo systemctl restart docker

# 运行优化后的容器
docker run -d \
  --name myapp \
  --memory=2g \
  --memory-swap=2g \
  --cpus=2 \
  --ulimit nofile=65535:65535 \
  --restart unless-stopped \
  myapp:latest

5.2 Kubernetes 节点优化

对于 Kubernetes 集群节点,需要调整内核参数和资源限制:

# kubelet 配置优化(/etc/kubernetes/kubelet.conf)
KUBELET_EXTRA_ARGS="
--max-pods=110
--kube-reserved=cpu=500m,memory=512Mi
--system-reserved=cpu=500m,memory=512Mi
--eviction-hard=nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<15%
--eviction-soft=nodefs.available<15%,nodefs.inodesFree<10%,imagefs.available<20%
--eviction-soft-grace-period=nodefs.available=2m,nodefs.inodesFree=2m,imagefs.available=2m
--eviction-max-pod-grace-period=30
--image-pull-progress-deadline=2m
--cgroups-per-qos=true
--enforce-node-allocatable=pods,kube-reserved,system-reserved
"

六、性能优化实战案例

6.1 高并发 Web 服务器优化案例

场景:一台 8 核 16GB 内存的 AlmaLinux 服务器运行 Nginx + PHP-FPM,需要处理 10,000+ 并发请求。

优化步骤

  1. 内核参数优化
# 编辑 /etc/sysctl.conf
cat <<EOF | sudo tee -a /etc/sysctl.conf
# 网络优化
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=600
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_intvl=15

# 文件系统
fs.file-max=2097152
fs.nr_open=2097152

# 虚拟内存
vm.swappiness=10
vm.vfs_cache_pressure=50
vm.dirty_ratio=10
vm.dirty_background_ratio=5

# 网络缓冲区
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_mem=16777216 16777216 16777216
EOF

sudo sysctl -p
  1. Nginx 配置优化
# /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 65535;

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

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 10000;
    
    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/xml text/javascript application/json;
    
    # 缓存配置
    open_file_cache max=100000 inactive=20s;
    open_file_cache_valid 60s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    # 客户端配置
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 8k;
    
    # FastCGI 配置
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_busy_buffers_size 64k;
    fastcgi_temp_file_write_size 64k;
    
    # 虚拟主机
    server {
        listen 80 backlog=65535;
        server_name example.com;
        
        # 静态资源缓存
        location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
            expires 365d;
            add_header Cache-Control "public, immutable";
            access_log off;
        }
        
        # PHP-FPM
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            
            # 超时设置
            fastcgi_connect_timeout 60;
            fastcgi_send_timeout 60;
            fastcgi_read_timeout 60;
        }
    }
}
  1. PHP-FPM 配置优化
# /etc/php-fpm.d/www.conf
[www]
user = nginx
group = nginx

; 进程管理
pm = dynamic
pm.max_children = 200
pm.start_servers = 50
pm.min_spare_servers = 20
pm.max_spare_servers = 100
pm.max_requests = 5000

; 资源限制
php_admin_value[memory_limit] = 256M
php_admin_value[max_execution_time] = 60
php_admin_value[max_input_time] = 60
php_admin_value[post_max_size] = 10M
php_admin_value[upload_max_filesize] = 10M

; 性能优化
php_admin_value[realpath_cache_size] = 4096K
php_admin_value[realpath_cache_ttl] = 600
php_admin_value[session.gc_maxlifetime] = 1440
php_admin_value[session.save_handler] = redis
php_admin_value[session.save_path] = "tcp://127.0.0.1:6379"
  1. 系统资源限制
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

# /etc/systemd/system/php-fpm.service.d/limits.conf
[Service]
LimitNOFILE=65535
LimitNPROC=65535

6.2 数据库服务器优化案例

场景:一台 16 核 64GB 内存的 AlmaLinux 服务器运行 MariaDB,需要处理高并发读写操作。

优化步骤

  1. 内核参数优化
# 编辑 /etc/sysctl.conf
cat <<EOF | sudo tee -a /etc/sysctl.conf
# 虚拟内存
vm.swappiness=1
vm.vfs_cache_pressure=50
vm.dirty_ratio=10
vm.dirty_background_ratio=5
vm.dirty_expire_centisecs=3000
vm.dirty_writeback_centisecs=500

# 文件系统
fs.file-max=2097152
fs.nr_open=2097152

# 网络(如果涉及远程连接)
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.tcp_tw_reuse=1

# I/O 调度器(针对 SSD)
# 需要先确认磁盘类型
EOF

sudo sysctl -p

# 设置 I/O 调度器为 noop(SSD)或 deadline(HDD)
echo noop | sudo tee /sys/block/sda/queue/scheduler
  1. MariaDB 配置优化
# /etc/my.cnf.d/server.cnf
[mysqld]
# 基础配置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

# 内存配置(64GB 内存的 70%)
innodb_buffer_pool_size = 45G
innodb_buffer_pool_instances = 16
innodb_log_file_size = 2G
innodb_log_buffer_size = 256M

# I/O 配置
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = ON
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_neighbors = 0  # SSD 优化

# 连接配置
max_connections = 500
thread_cache_size = 100
table_open_cache = 4000
table_definition_cache = 2000

# 查询优化
tmp_table_size = 2G
max_heap_table_size = 2G
join_buffer_size = 8M
sort_buffer_size = 8M
read_buffer_size = 4M
read_rnd_buffer_size = 8M

# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1

# 其他优化
innodb_adaptive_hash_index = ON
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_thread_concurrency = 0
innodb_purge_threads = 4
innodb_lock_wait_timeout = 50
  1. 监控与调优
# 安装监控工具
sudo dnf install percona-toolkit -y

# 使用 pt-query-digest 分析慢查询
pt-query-digest /var/log/mysql/slow.log > slow_query_report.txt

# 使用 pt-mysql-summary 查看数据库状态
pt-mysql-summary --user=root --password=your_password

七、性能优化最佳实践

7.1 优化流程

  1. 基准测试:优化前进行基准测试,建立性能基线
  2. 监控分析:使用监控工具识别瓶颈
  3. 逐步调整:一次只调整一个参数,观察效果
  4. 记录变更:详细记录所有配置变更
  5. 持续监控:优化后持续监控系统性能

7.2 常见陷阱

  1. 过度优化:不要盲目调整所有参数,应根据实际需求
  2. 忽略硬件限制:软件优化无法突破硬件瓶颈
  3. 忽视应用特性:不同应用需要不同的优化策略
  4. 缺乏测试:生产环境变更前必须充分测试

7.3 自动化优化

使用自动化工具简化优化过程:

# 使用 tuned 进行自动性能调优
sudo dnf install tuned -y
sudo systemctl enable --now tuned

# 查看可用配置文件
tuned-adm list

# 应用配置文件(根据场景选择)
sudo tuned-adm profile throughput-performance  # 高吞吐量场景
sudo tuned-adm profile latency-performance     # 低延迟场景
sudo tuned-adm profile virtual-guest           # 虚拟机环境

# 自定义配置文件
sudo mkdir -p /etc/tuned/custom-profile
sudo tee /etc/tuned/custom-profile/tuned.conf <<EOF
[main]
include=throughput-performance

[cpu]
governor=performance
energy_perf_bias=performance

[vm]
swappiness=10
vfs_cache_pressure=50

[net]
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
EOF

sudo tuned-adm profile custom-profile

八、总结

AlmaLinux 性能优化是一个系统工程,需要从内核参数、系统配置、应用层调优等多个层面综合考虑。本文详细介绍了从监控工具使用到具体优化策略的完整流程,并提供了多个实战案例。

关键要点

  1. 监控先行:优化前必须了解系统当前状态
  2. 分层优化:从内核到应用逐层优化
  3. 场景化调整:不同应用场景需要不同的优化策略
  4. 持续迭代:性能优化是一个持续的过程

通过本文的指导,您应该能够系统地优化 AlmaLinux 服务器性能,满足不同业务场景的需求。记住,最好的优化策略是基于实际监控数据和业务需求的定制化方案。