引言
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 优化服务启动顺序
使用 systemd 的 After 和 Before 指令调整服务启动顺序,减少启动时间。
示例:优化 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 netstat 与 ss(网络连接监控)
# 查看所有 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 性能优化是一个系统工程,需要从内核、系统、应用多个层面入手。通过合理配置内核参数、优化系统服务、调整应用配置,并结合监控工具持续分析,可以显著提升系统性能。记住,优化前务必进行基准测试,优化后也要持续监控,确保优化效果符合预期。
关键点回顾:
- 内核调优:使用
sysctl和tuned调整关键参数。 - 系统配置:合理使用 cgroups、磁盘调度器和服务管理。
- 应用优化:针对不同应用(Web、数据库、Java)进行专项优化。
- 监控诊断:利用
sar、vmstat、strace等工具定位问题。 - 实战验证:通过压力测试和监控验证优化效果。
通过本文的指南,您应该能够系统地优化 AlmaLinux 环境,应对各种性能挑战。
