引言

AlmaLinux 作为 CentOS 的替代品,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。性能优化是系统管理员和开发人员必须掌握的技能,它直接影响应用的响应速度、资源利用率和系统稳定性。本文将从内核参数调优、文件系统优化、网络配置、应用层调优等多个维度,提供一套完整的实战指南,帮助您最大化 AlmaLinux 系统的性能。

一、内核参数调优

内核参数是系统性能的基础,通过调整 /etc/sysctl.conf 或使用 sysctl 命令可以动态修改。以下是一些关键参数及其优化建议。

1.1 内存管理优化

内存是系统性能的关键因素,合理配置可以避免频繁的磁盘交换(swap),提高响应速度。

参数说明:

  • vm.swappiness:控制系统使用 swap 的倾向。值越低,越倾向于使用物理内存。
  • vm.vfs_cache_pressure:控制内核回收用于目录和 inode 缓存的内存倾向。值越高,内核越倾向于回收这些缓存。
  • vm.dirty_ratiovm.dirty_background_ratio:控制脏页(未写入磁盘的数据)的比例,影响 I/O 性能。

实战配置:

# 编辑 sysctl.conf 文件
sudo vi /etc/sysctl.conf

# 添加或修改以下参数
vm.swappiness = 10
vm.vfs_cache_pressure = 50
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5

# 应用配置
sudo sysctl -p

解释:

  • vm.swappiness = 10:减少 swap 使用,优先使用物理内存,适合内存充足的服务器。
  • vm.vfs_cache_pressure = 50:平衡目录缓存和内存回收,避免过度回收导致文件系统性能下降。
  • vm.dirty_ratio = 10vm.dirty_background_ratio = 5:限制脏页比例,避免大量数据同时写入磁盘导致 I/O 峰值。

1.2 网络参数优化

网络性能对 Web 服务器、数据库等应用至关重要。以下参数可优化 TCP 连接和吞吐量。

参数说明:

  • net.core.somaxconn:定义每个监听端口的最大连接队列长度。
  • net.ipv4.tcp_max_syn_backlog:定义 SYN 请求队列的最大长度。
  • net.ipv4.tcp_tw_reuse:允许 TIME_WAIT 状态的 socket 被重用,提高短连接场景的性能。
  • net.ipv4.tcp_fin_timeout:调整 TIME_WAIT 状态的超时时间,减少资源占用。

实战配置:

# 在 /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

# 应用配置
sudo sysctl -p

解释:

  • net.core.somaxconn = 65535:提高连接队列长度,适合高并发场景(如 Nginx、Apache)。
  • net.ipv4.tcp_tw_reuse = 1:允许重用 TIME_WAIT 状态的 socket,减少连接建立延迟,但需注意安全性。
  • net.ipv4.tcp_fin_timeout = 30:缩短 TIME_WAIT 状态时间,释放资源更快。

1.3 文件系统参数优化

文件系统参数影响磁盘 I/O 性能,特别是对于数据库和文件服务器。

参数说明:

  • fs.file-max:系统可打开的最大文件数。
  • fs.aio-max-nr:异步 I/O 请求的最大数量。
  • fs.inotify.max_user_watches:inotify 监控的最大文件数,影响文件监控工具(如 logrotate)。

实战配置:

# 在 /etc/sysctl.conf 中添加
fs.file-max = 2097152
fs.aio-max-nr = 1048576
fs.inotify.max_user_watches = 524288

# 应用配置
sudo sysctl -p

解释:

  • fs.file-max = 2097152:提高文件描述符上限,适合高并发应用。
  • fs.aio-max-nr = 1048576:增加异步 I/O 请求数,提升数据库(如 MySQL)的 I/O 性能。
  • fs.inotify.max_user_watches = 524288:增加监控文件数,避免日志轮转或文件监控工具失败。

二、文件系统优化

文件系统的选择和挂载选项直接影响磁盘 I/O 性能。AlmaLinux 默认使用 XFS 或 ext4,以下以 XFS 为例进行优化。

2.1 XFS 文件系统优化

XFS 在高并发和大文件场景下表现优异,适合数据库和文件服务器。

挂载选项优化:

  • noatime:禁止更新文件访问时间,减少磁盘写入。
  • nodiratime:禁止更新目录访问时间。
  • logbufs=8:增加日志缓冲区数量,提升写入性能。
  • logbsize=256k:设置日志缓冲区大小。

实战配置:

# 查看当前挂载选项
mount | grep xfs

# 编辑 /etc/fstab,添加挂载选项
/dev/sda1 /data xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0

# 重新挂载
sudo mount -o remount /data

解释:

  • noatimenodiratime:减少不必要的磁盘写入,提升读写性能。
  • logbufs=8logbsize=256k:优化 XFS 日志性能,适合写入密集型应用。

2.2 磁盘调度器优化

磁盘调度器决定 I/O 请求的处理顺序,不同场景适合不同调度器。

常见调度器:

  • deadline:适合数据库等随机读写场景,保证请求的截止时间。
  • noop:适合 SSD,减少调度开销。
  • cfq:适合多进程公平调度,但性能一般。

实战配置:

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

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

# 永久生效(通过 udev 规则)
sudo vi /etc/udev/rules.d/60-scheduler.rules
# 添加以下内容
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"

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

解释:

  • 对于数据库(如 MySQL、PostgreSQL),deadline 调度器能更好地处理随机读写,避免请求饥饿。
  • 对于 SSD,使用 noopnone 调度器,减少 CPU 开销。

三、网络优化

网络优化涉及接口配置、协议栈调整和负载均衡,以下从多个方面展开。

3.1 网络接口优化

调整网卡参数可以提升网络吞吐量和降低延迟。

参数说明:

  • txqueuelen:发送队列长度,增加可提高吞吐量。
  • rx/tx 缓冲区大小:调整接收和发送缓冲区。

实战配置:

# 查看当前配置
ethtool -g eth0

# 设置发送队列长度
sudo ip link set eth0 txqueuelen 4096

# 调整缓冲区大小(以 10G 网卡为例)
sudo ethtool -G eth0 rx 4096 tx 4096

# 永久生效(通过 NetworkManager 或 systemd)
sudo vi /etc/NetworkManager/system-connections/eth0.nmconnection
# 添加以下内容
[ethernet]
mtu=9000
txqueuelen=4096

解释:

  • txqueuelen=4096:增加发送队列,适合高吞吐量场景。
  • mtu=9000:启用 Jumbo Frame,减少数据包开销,提升大文件传输效率。

3.2 TCP 协议栈优化

TCP 协议栈参数对网络性能影响显著,特别是高延迟或高带宽场景。

参数说明:

  • net.ipv4.tcp_rmemnet.ipv4.tcp_wmem:调整 TCP 接收和发送缓冲区。
  • net.ipv4.tcp_congestion_control:拥塞控制算法,bbr 适合高带宽延迟积(BDP)场景。
  • net.ipv4.tcp_mtu_probing:启用 MTU 探测,避免分片。

实战配置:

# 在 /etc/sysctl.conf 中添加
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 65536 6291456
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_mtu_probing = 1

# 应用配置
sudo sysctl -p

解释:

  • tcp_rmemtcp_wmem:设置缓冲区最小、默认和最大值,适应不同网络条件。
  • tcp_congestion_control = bbr:Google 的 BBR 算法,适合高带宽延迟积网络,提升吞吐量。
  • tcp_mtu_probing = 1:自动探测 MTU,避免分片,减少延迟。

四、应用层调优

应用层调优针对具体应用(如 Web 服务器、数据库)进行配置,以下以 Nginx 和 MySQL 为例。

4.1 Nginx 性能优化

Nginx 是高性能 Web 服务器,优化配置可显著提升并发处理能力。

关键配置项:

  • worker_processes:工作进程数,通常设置为 CPU 核心数。
  • worker_connections:每个进程的最大连接数。
  • keepalive_timeout:保持连接超时时间。
  • gzip:启用压缩,减少传输数据量。

实战配置:

# /etc/nginx/nginx.conf
worker_processes auto;  # 自动设置为 CPU 核心数
worker_rlimit_nofile 65535;  # 文件描述符上限

events {
    worker_connections 65535;  # 每个进程的最大连接数
    use epoll;  # 使用 epoll 事件模型
}

http {
    # 启用 gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    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;

    # 连接保持
    keepalive_timeout 65;
    keepalive_requests 100;

    # 缓冲区优化
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 4k;

    # 日志优化
    access_log /var/log/nginx/access.log combined buffer=32k flush=5s;
    error_log /var/log/nginx/error.log warn;
}

解释:

  • worker_processes auto:充分利用多核 CPU。
  • worker_connections 65535:支持高并发连接。
  • gzip 压缩:减少传输数据量,提升加载速度。
  • keepalive_timeout:保持连接,减少 TCP 握手开销。

4.2 MySQL 性能优化

MySQL 是常用数据库,优化配置可提升查询速度和并发处理能力。

关键配置项:

  • innodb_buffer_pool_size:InnoDB 缓冲池大小,通常设置为物理内存的 70%-80%。
  • innodb_log_file_size:重做日志文件大小,影响写入性能。
  • max_connections:最大连接数。
  • query_cache_size:查询缓存大小(MySQL 8.0 已移除,此处以 5.7 为例)。

实战配置:

# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
# 内存相关
innodb_buffer_pool_size = 16G  # 根据内存调整,例如 64GB 内存服务器设置为 48G
innodb_buffer_pool_instances = 8  # 缓冲池实例数,避免争用

# 日志相关
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M

# 连接相关
max_connections = 2000
thread_cache_size = 50

# 查询缓存(MySQL 5.7)
query_cache_type = 1
query_cache_size = 256M

# 其他优化
innodb_flush_log_at_trx_commit = 2  # 平衡性能和数据安全
innodb_flush_method = O_DIRECT  # 避免双缓冲

解释:

  • innodb_buffer_pool_size:缓存数据和索引,减少磁盘 I/O。
  • innodb_log_file_size:较大的日志文件减少日志切换频率,提升写入性能。
  • max_connections:根据应用需求调整,避免连接数不足。
  • innodb_flush_log_at_trx_commit = 2:每秒提交事务,提升性能,但可能丢失 1 秒数据。

五、监控与调优验证

优化后需监控系统性能,验证调优效果。常用工具包括 tophtopiostatvmstatnetstat 等。

5.1 系统监控工具

使用 htop 监控 CPU 和内存:

# 安装 htop
sudo dnf install htop -y

# 运行 htop
htop
  • 查看 CPU 使用率、内存占用、进程列表。
  • 按 F6 排序,按 F9 杀死进程。

使用 iostat 监控磁盘 I/O:

# 安装 sysstat
sudo dnf install sysstat -y

# 查看磁盘 I/O 统计(每秒刷新)
iostat -dx 1
  • 关注 %util(磁盘利用率)和 await(平均 I/O 等待时间)。
  • 如果 %util 接近 100% 或 await 过高,说明磁盘是瓶颈。

使用 vmstat 监控内存和进程:

vmstat 1
  • 关注 si(swap in)和 so(swap out),如果非零,说明内存不足。
  • wa(I/O 等待)高,说明磁盘 I/O 瓶颈。

5.2 网络监控工具

使用 ssnetstat 监控网络连接:

# 查看 TCP 连接状态
ss -tunap

# 查看端口监听情况
netstat -tuln
  • 关注 TIME_WAIT 连接数,过多可能需调整 tcp_tw_reuse

使用 iftop 监控网络流量:

sudo dnf install iftop -y
sudo iftop -i eth0
  • 实时显示网络流量,识别带宽占用高的进程。

5.3 应用层监控

Nginx 状态监控:

# 在 nginx.conf 中添加
server {
    listen 80;
    server_name localhost;
    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}
  • 访问 http://localhost/nginx_status 查看活动连接、请求处理等信息。

MySQL 状态监控:

-- 查看 InnoDB 缓冲池命中率
SHOW STATUS LIKE 'Innodb_buffer_pool_read%';
-- 计算命中率:(1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100
-- 理想值 > 99%

-- 查看慢查询
SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';

六、实战案例:高并发 Web 服务器优化

假设我们有一台 AlmaLinux 服务器,运行 Nginx 和 PHP-FPM,处理高并发 Web 请求。以下是完整优化步骤。

6.1 系统层面优化

# 1. 调整内核参数
sudo vi /etc/sysctl.conf
# 添加以下内容
vm.swappiness = 10
vm.vfs_cache_pressure = 50
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
fs.file-max = 2097152
sudo sysctl -p

# 2. 调整用户进程限制
sudo vi /etc/security/limits.conf
# 添加以下内容
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535

# 3. 优化文件系统挂载选项
sudo vi /etc/fstab
# 修改 /data 挂载选项
/dev/sda1 /data xfs defaults,noatime,nodiratime,logbufs=8,logbsize=256k 0 0
sudo mount -o remount /data

6.2 Nginx 优化

# /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
worker_rlimit_nofile 65535;

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

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # 日志格式优化
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    'rt=$request_time uct="$upstream_connect_time" '
                    'uht="$upstream_header_time" urt="$upstream_response_time"';

    access_log /var/log/nginx/access.log main buffer=32k flush=5s;
    error_log /var/log/nginx/error.log warn;

    # 性能优化
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    keepalive_requests 100;
    client_body_buffer_size 128k;
    client_max_body_size 10m;
    client_header_buffer_size 1k;
    large_client_header_buffers 4 4k;

    # Gzip 压缩
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    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;

    # 虚拟主机配置
    server {
        listen 80;
        server_name example.com;
        root /var/www/html;
        index index.php index.html;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        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_buffer_size 128k;
            fastcgi_buffers 4 256k;
            fastcgi_busy_buffers_size 256k;
        }
    }
}

6.3 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 = 500

; 进程空闲时间
pm.process_idle_timeout = 10s

; 内存限制
php_admin_value[memory_limit] = 256M

; 慢日志
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log

; 错误日志
catch_workers_output = yes
error_log = /var/log/php-fpm/error.log

6.4 验证与监控

# 1. 重启服务
sudo systemctl restart nginx
sudo systemctl restart php-fpm

# 2. 使用 ab 压力测试
sudo dnf install httpd-tools -y
ab -n 10000 -c 100 http://localhost/

# 3. 监控系统资源
htop
iostat -dx 1
vmstat 1

# 4. 查看 Nginx 状态
curl http://localhost/nginx_status

# 5. 查看 PHP-FPM 状态
curl http://localhost/status  # 需在 php-fpm 配置中启用 status 页面

七、总结

AlmaLinux 性能优化是一个系统工程,涉及内核参数、文件系统、网络和应用层多个方面。通过合理配置,可以显著提升系统性能和稳定性。关键点包括:

  1. 内核参数调优:根据应用场景调整内存、网络和文件系统参数。
  2. 文件系统优化:选择合适的挂载选项和磁盘调度器。
  3. 网络优化:调整接口参数和 TCP 协议栈。
  4. 应用层调优:针对具体应用(如 Nginx、MySQL)进行配置。
  5. 监控与验证:使用工具监控性能,验证调优效果。

优化是一个持续的过程,需要根据实际负载和监控数据不断调整。建议在生产环境变更前,在测试环境中充分验证。通过本文的指南,您可以系统地优化 AlmaLinux 服务器,应对各种性能挑战。