引言
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_ratio 和 vm.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+ 并发请求。
优化步骤:
- 内核参数优化:
# 编辑 /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
- 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;
}
}
}
- 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"
- 系统资源限制:
# /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,需要处理高并发读写操作。
优化步骤:
- 内核参数优化:
# 编辑 /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
- 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
- 监控与调优:
# 安装监控工具
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 优化流程
- 基准测试:优化前进行基准测试,建立性能基线
- 监控分析:使用监控工具识别瓶颈
- 逐步调整:一次只调整一个参数,观察效果
- 记录变更:详细记录所有配置变更
- 持续监控:优化后持续监控系统性能
7.2 常见陷阱
- 过度优化:不要盲目调整所有参数,应根据实际需求
- 忽略硬件限制:软件优化无法突破硬件瓶颈
- 忽视应用特性:不同应用需要不同的优化策略
- 缺乏测试:生产环境变更前必须充分测试
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 性能优化是一个系统工程,需要从内核参数、系统配置、应用层调优等多个层面综合考虑。本文详细介绍了从监控工具使用到具体优化策略的完整流程,并提供了多个实战案例。
关键要点:
- 监控先行:优化前必须了解系统当前状态
- 分层优化:从内核到应用逐层优化
- 场景化调整:不同应用场景需要不同的优化策略
- 持续迭代:性能优化是一个持续的过程
通过本文的指导,您应该能够系统地优化 AlmaLinux 服务器性能,满足不同业务场景的需求。记住,最好的优化策略是基于实际监控数据和业务需求的定制化方案。
