引言

AlmaLinux 作为 CentOS 的替代者,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。性能优化是系统管理员和开发者的核心技能之一。本文将从内核调优、系统配置、应用层优化等多个维度,提供一套完整的 AlmaLinux 性能优化指南,并结合实战案例进行详细说明。


一、内核调优:系统性能的基石

内核是操作系统的核心,其参数直接影响系统性能。AlmaLinux 基于 RHEL,内核调优工具和方法与 RHEL 高度一致。

1.1 内核参数调整工具

1.1.1 sysctl 命令

sysctl 是动态修改内核参数的工具,无需重启即可生效。

示例:调整网络缓冲区大小

# 查看当前网络缓冲区设置
sysctl net.core.rmem_max
sysctl net.core.wmem_max

# 临时调整(重启后失效)
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.wmem_max=16777216

# 永久调整:编辑 /etc/sysctl.conf
echo "net.core.rmem_max=16777216" | sudo tee -a /etc/sysctl.conf
echo "net.core.wmem_max=16777216" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p  # 重新加载配置

1.1.2 tuned 服务

tuned 是 RHEL/CentOS/AlmaLinux 官方推荐的性能调优工具,提供预设的优化方案。

示例:启用 tuned 并选择优化方案

# 安装 tuned(通常已预装)
sudo dnf install tuned -y

# 启动并启用 tuned
sudo systemctl enable --now tuned

# 查看可用方案
sudo tuned-adm list

# 选择优化方案(例如:虚拟机优化)
sudo tuned-adm profile virtual-guest

# 查看当前方案
sudo tuned-adm active

1.2 关键内核参数详解

1.2.1 虚拟内存管理

虚拟内存参数影响系统内存分配和交换行为。

示例:优化虚拟内存参数

# 编辑 /etc/sysctl.conf
# 减少交换倾向,提高响应速度
vm.swappiness=10
# 内存不足时,优先回收缓存而非交换
vm.vfs_cache_pressure=50
# 增加脏页比例,减少磁盘写入频率
vm.dirty_ratio=10
vm.dirty_background_ratio=5

参数说明:

  • vm.swappiness:控制内核使用交换空间的倾向(0-100),值越低越倾向于使用物理内存。
  • vm.vfs_cache_pressure:控制内核回收目录项和 inode 缓存的倾向(默认100)。
  • vm.dirty_ratio:系统内存中脏页比例达到此值时,进程将被阻塞直到脏页写入磁盘。
  • vm.dirty_background_ratio:后台进程开始写入脏页的比例阈值。

1.2.2 网络参数

网络参数对高并发服务器至关重要。

示例:优化高并发网络服务器参数

# 编辑 /etc/sysctl.conf
# 增加 TCP 连接队列大小
net.core.somaxconn=65535
# 增加 TCP 最大连接数
net.ipv4.tcp_max_syn_backlog=65535
# 启用 TCP 快速回收
net.ipv4.tcp_tw_recycle=1
# 增加端口范围
net.ipv4.ip_local_port_range=1024 65535
# 增加 TCP 缓冲区
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
# 启用 TCP 时间戳
net.ipv4.tcp_timestamps=1
# 启用 TCP 窗口缩放
net.ipv4.tcp_window_scaling=1

1.2.3 文件系统参数

文件系统参数影响磁盘 I/O 性能。

示例:优化 ext4 文件系统参数

# 编辑 /etc/fstab,为挂载点添加参数
# 例如:/dev/sda1 /data ext4 defaults,noatime,nodiratime,barrier=0 0 0

# 参数说明:
# noatime: 不更新文件访问时间,减少磁盘写入
# nodiratime: 不更新目录访问时间
# barrier=0: 禁用写入屏障(仅在 UPS 保护下使用,否则有数据丢失风险)

二、系统配置优化

2.1 资源限制与控制组 (cgroups)

cgroups 是 Linux 内核功能,用于限制、记录和隔离进程组的资源使用。

2.1.1 使用 systemd-cgtop 监控

# 查看 cgroups 资源使用情况
systemd-cgtop

# 输出示例:
# Path               Tasks   %CPU   Memory  Input/s Output/s
# /system.slice/ssh.service   1    0.1%   12.3M   0B      0B
# /system.slice/mariadb.service  10   25.3%  1.2G    0B      0B

2.1.2 为服务设置资源限制

示例:限制 MariaDB 服务的 CPU 和内存使用

# 编辑服务单元文件
sudo systemctl edit mariadb

# 在编辑器中添加以下内容:
[Service]
# 限制 CPU 使用率(100% = 1个核心)
CPUQuota=50%
# 限制内存使用(例如:2GB)
MemoryLimit=2G
# 限制进程数
TasksMax=1000

# 重新加载并重启服务
sudo systemctl daemon-reload
sudo systemctl restart mariadb

2.2 磁盘 I/O 调度器

磁盘 I/O 调度器决定磁盘请求的处理顺序,影响 I/O 性能。

2.2.1 查看和修改调度器

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

# 输出示例:noop [deadline] cfq

# 修改调度器(临时)
echo deadline > /sys/block/sda/queue/scheduler

# 永久修改:创建 udev 规则
sudo tee /etc/udev/rules.d/60-scheduler.rules <<EOF
# 对所有块设备使用 deadline 调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"
EOF

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

2.2.2 不同调度器适用场景

  • noop:适用于 SSD,因为 SSD 本身有垃圾回收机制,不需要复杂的调度。
  • deadline:适用于数据库等需要保证响应时间的场景,避免饥饿。
  • cfq:适用于多用户桌面环境,公平分配 I/O 带宽。

2.3 服务管理与优化

2.3.1 禁用不必要的服务

# 查看所有服务
systemctl list-unit-files --type=service

# 禁用不需要的服务(例如:bluetooth)
sudo systemctl disable --now bluetooth

# 查看服务依赖
systemctl list-dependencies bluetooth

2.3.2 优化服务启动顺序

使用 systemdAfterBefore 指令调整服务启动顺序,减少启动时间。

示例:优化 Web 服务器启动顺序

# 编辑 Nginx 服务单元
sudo systemctl edit nginx

# 添加以下内容:
[Unit]
After=network.target
Before=php-fpm.service

[Service]
# 确保网络就绪后再启动
ExecStartPre=/bin/sleep 5

三、应用层优化实战技巧

3.1 Web 服务器优化(Nginx)

3.1.1 Nginx 配置优化

示例:优化 Nginx 配置文件

# /etc/nginx/nginx.conf
worker_processes auto;  # 自动设置为 CPU 核心数
worker_rlimit_nofile 65535;  # 每个 worker 进程可打开的最大文件数

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

http {
    # 开启 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;

    # 缓存静态文件
    open_file_cache max=1000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;

    # 连接超时设置
    keepalive_timeout 65;
    keepalive_requests 100;

    # 上传文件大小限制
    client_max_body_size 100M;

    # 日志优化(减少磁盘 I/O)
    access_log /var/log/nginx/access.log combined buffer=32k flush=1m;
    error_log /var/log/nginx/error.log warn;
}

3.1.2 使用 nginx -t 测试配置

# 测试配置语法
sudo nginx -t

# 重新加载配置(不中断服务)
sudo nginx -s reload

3.2 数据库优化(MySQL/MariaDB)

3.2.1 配置文件优化

示例:优化 MariaDB 配置文件

# /etc/my.cnf.d/server.cnf
[mysqld]
# 内存相关
innodb_buffer_pool_size = 2G  # 设置为总内存的 50-70%
innodb_log_file_size = 512M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2  # 平衡性能与数据安全

# 连接相关
max_connections = 200
thread_cache_size = 50
table_open_cache = 2000

# 查询缓存(MariaDB 10.2+ 已弃用,使用其他缓存)
# query_cache_type = 0

# 日志相关(生产环境可关闭)
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 2

3.2.2 使用 mysqltuner 进行性能分析

# 安装 mysqltuner
sudo dnf install mysqltuner -y

# 运行分析
mysqltuner --user root --pass your_password

# 输出示例:
# [!!] Query cache may be disabled by MariaDB 10.2+
# [!!] Key buffer size > 80% of RAM
# [OK] Read Key buffer size / total MyISAM indexes: 128.0M / 8.0M

3.3 应用服务器优化(Java 应用)

3.3.1 JVM 参数优化

示例:优化 Tomcat 启动参数

# 编辑 /etc/tomcat/tomcat.conf
JAVA_OPTS="-Xms2G -Xmx2G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45 -XX:+ExplicitGCInvokesConcurrent -Djava.awt.headless=true"

参数说明:

  • -Xms2G -Xmx2G:初始和最大堆内存,设置为相同值避免动态调整。
  • -XX:+UseG1GC:使用 G1 垃圾回收器,适合大内存应用。
  • -XX:MaxGCPauseMillis=200:目标最大 GC 暂停时间(毫秒)。
  • -XX:InitiatingHeapOccupancyPercent=45:堆占用率达到 45% 时开始并发标记周期。

3.3.2 使用 jstat 监控 JVM

# 查看 GC 统计信息(每秒输出一次)
jstat -gcutil $(pgrep -f tomcat) 1000

# 输出示例:
# S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
# 0.00   0.00  45.23  12.45  98.76  95.34     12    0.456    1     0.123    0.579

四、监控与诊断工具

4.1 系统级监控

4.1.1 sar(系统活动报告)

# 安装 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

4.1.2 vmstat(虚拟内存统计)

# 每秒输出一次,共 5 次
vmstat 1 5

# 输出示例:
# procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
# r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
# 1  0      0 123456  12345 234567   0    0     0     0  100  200  5  2 93  0  0

4.2 应用级监控

4.2.1 netstatss(网络连接监控)

# 查看所有 TCP 连接
ss -tunap

# 查看特定端口的连接
ss -tunap sport = :80

# 查看连接状态分布
ss -s

4.2.2 strace(系统调用跟踪)

# 跟踪进程的系统调用(例如:跟踪 Nginx worker 进程)
sudo strace -p $(pgrep -f nginx:worker) -c

# 输出示例:
# % time     seconds  usecs/call     calls    errors syscall
# ------ ----------- ----------- --------- --------- ----------------
#  45.23    0.123456          12     10234           read
#  32.10    0.087654          15      5843           write
#  12.34    0.034567           8      4321           openat

五、实战案例:优化一个高并发 Web 应用

5.1 场景描述

  • 应用:基于 Nginx + PHP-FPM + MariaDB 的电商网站
  • 问题:高峰期响应慢,CPU 使用率高,内存占用大
  • 目标:提升并发处理能力,降低响应时间

5.2 优化步骤

5.2.1 内核调优

# 编辑 /etc/sysctl.conf
# 网络参数
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
net.ipv4.ip_local_port_range=1024 65535

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

# 应用参数
fs.file-max=2097152

5.2.2 Nginx 优化

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

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

http {
    # 启用 Gzip
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;

    # 缓存静态文件
    open_file_cache max=1000 inactive=20s;

    # 连接超时
    keepalive_timeout 65;
    keepalive_requests 100;

    # 限制请求大小
    client_max_body_size 100M;

    # 日志优化
    access_log /var/log/nginx/access.log combined buffer=32k flush=1m;
}

5.2.3 PHP-FPM 优化

# /etc/php-fpm.d/www.conf
[www]
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 30
pm.max_requests = 500

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

5.2.4 MariaDB 优化

# /etc/my.cnf.d/server.cnf
[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2
max_connections = 200
thread_cache_size = 50
table_open_cache = 2000

5.2.5 监控与验证

# 使用 sar 监控优化前后性能
sar -u 1 10  # CPU
sar -r 1 10  # 内存
sar -d 1 10  # 磁盘 I/O

# 使用 ab 进行压力测试
ab -n 10000 -c 100 http://your-site.com/

# 查看 Nginx 状态
curl http://your-site.com/nginx_status

六、常见问题与解决方案

6.1 高 CPU 使用率

可能原因

  • 死循环或无限递归
  • 频繁的上下文切换
  • 大量计算密集型任务

解决方案

# 使用 top 查看 CPU 使用率最高的进程
top -p $(pgrep -f your-app)

# 使用 perf 分析 CPU 热点
sudo perf top -p $(pgrep -f your-app)

# 检查上下文切换
vmstat 1 10 | awk '{print $12, $13}'  # cs, in 列

6.2 内存泄漏

可能原因

  • 应用未释放内存
  • 缓存未设置上限

解决方案

# 使用 valgrind 检测内存泄漏(C/C++ 应用)
valgrind --leak-check=full ./your-app

# 使用 jmap 分析 Java 内存
jmap -heap $(pgrep -f java-app)

# 监控内存使用趋势
watch -n 1 'free -h'

6.3 磁盘 I/O 瓶颈

可能原因

  • 磁盘性能不足
  • 频繁的小文件读写
  • 日志写入过多

解决方案

# 使用 iostat 查看磁盘 I/O
iostat -x 1 10

# 使用 iotop 查看进程级 I/O
sudo iotop

# 优化日志写入(使用缓冲或异步写入)
# 例如:Nginx 日志使用 buffer 和 flush
access_log /var/log/nginx/access.log combined buffer=32k flush=1m;

七、总结

AlmaLinux 性能优化是一个系统工程,需要从内核、系统、应用多个层面入手。通过合理配置内核参数、优化系统服务、调整应用配置,并结合监控工具持续分析,可以显著提升系统性能。记住,优化前务必进行基准测试,优化后也要持续监控,确保优化效果符合预期。

关键点回顾

  1. 内核调优:使用 sysctltuned 调整关键参数。
  2. 系统配置:合理使用 cgroups、磁盘调度器和服务管理。
  3. 应用优化:针对不同应用(Web、数据库、Java)进行专项优化。
  4. 监控诊断:利用 sarvmstatstrace 等工具定位问题。
  5. 实战验证:通过压力测试和监控验证优化效果。

通过本文的指南,您应该能够系统地优化 AlmaLinux 环境,应对各种性能挑战。