引言
AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和企业级特性,广泛应用于服务器环境。性能优化是确保系统高效运行的关键,涉及从底层内核参数到上层应用配置的全方位调整。本文将深入探讨 AlmaLinux 的性能优化策略,涵盖内核调优、系统资源管理、网络优化、存储优化以及应用层实战,帮助您构建高性能的服务器环境。
一、内核调优
内核是操作系统的核心,其参数直接影响系统性能。AlmaLinux 基于 RHEL,可以通过 sysctl 命令动态调整内核参数。
1.1 内存管理优化
内存是系统性能的关键因素。优化内存管理可以减少交换(swap)使用,提高响应速度。
1.1.1 调整虚拟内存参数
编辑 /etc/sysctl.conf 文件,添加以下参数:
# 减少交换倾向,提高内存使用效率
vm.swappiness = 10
# 优化内存回收策略,避免过度回收
vm.vfs_cache_pressure = 50
# 增加内存分配的延迟,减少内存碎片
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
解释:
vm.swappiness:控制内核将数据交换到磁盘的倾向。值越低,越倾向于使用物理内存。默认值为60,建议设置为10-30。vm.vfs_cache_pressure:控制内核回收用于文件系统缓存的内存的倾向。默认值为100,设置为50可以保留更多缓存。vm.dirty_ratio和vm.dirty_background_ratio:控制脏页(未写入磁盘的数据)的比例。降低这些值可以减少I/O峰值,提高系统响应性。
1.1.2 大页内存(Huge Pages)
对于内存密集型应用(如数据库),使用大页内存可以减少TLB(Translation Lookaside Buffer)未命中,提高性能。
# 查看当前大页配置
cat /proc/meminfo | grep HugePages
# 临时设置大页数量(例如,1024个2MB大页)
echo 1024 > /proc/sys/vm/nr_hugepages
# 永久设置:在/etc/sysctl.conf中添加
vm.nr_hugepages = 1024
# 应用配置
sysctl -p
实战示例:在 PostgreSQL 数据库中启用大页内存。
安装 PostgreSQL:
sudo dnf install postgresql-server sudo postgresql-setup --initdb配置 PostgreSQL 使用大页:
sudo vi /var/lib/pgsql/data/postgresql.conf添加:
huge_pages = on shared_buffers = 4GB # 根据实际内存调整重启 PostgreSQL:
sudo systemctl restart postgresql
1.2 CPU 调度优化
CPU 调度策略影响进程执行效率。AlmaLinux 默认使用 CFS(Completely Fair Scheduler),但可根据场景调整。
1.2.1 调整 CPU 调度策略
# 查看当前调度策略
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 设置为性能模式(适用于服务器)
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 永久设置:安装 cpupowerutils
sudo dnf install cpupowerutils
sudo cpupower frequency-set -g performance
1.2.2 中断亲和性(IRQ Affinity)
将中断分配到特定 CPU 核心,减少上下文切换。
# 查看中断分布
cat /proc/interrupts
# 安装 irqbalance 服务
sudo dnf install irqbalance
sudo systemctl enable --now irqbalance
# 手动设置中断亲和性(示例:将网卡中断绑定到 CPU 0-3)
echo 0xF > /proc/irq/123/smp_affinity # 123 是网卡中断号
实战示例:优化网络密集型应用(如 Nginx)的中断处理。
安装 Nginx:
sudo dnf install nginx sudo systemctl enable --now nginx配置中断亲和性: “`bash
查找网卡中断号
grep eth0 /proc/interrupts | awk ‘{print $1}’ | cut -d: -f1
# 假设中断号为 123,绑定到 CPU 0-3 echo 0xF > /proc/irq/123/smp_affinity
3. 验证:
```bash
cat /proc/irq/123/smp_affinity
1.3 文件系统优化
文件系统参数影响 I/O 性能。常见文件系统如 ext4 和 XFS。
1.3.1 ext4 优化
# 挂载时添加优化参数
/dev/sda1 /data ext4 defaults,noatime,nodiratime,data=writeback 0 0
# 永久生效:编辑 /etc/fstab
/dev/sda1 /data ext4 defaults,noatime,nodiratime,data=writeback 0 0
参数说明:
noatime:禁止更新文件访问时间,减少 I/O。nodiratime:禁止更新目录访问时间。data=writeback:提高写入性能,但可能增加数据丢失风险(适合非关键数据)。
1.3.2 XFS 优化
# 挂载时添加优化参数
/dev/sdb1 /data xfs defaults,noatime,nodiratime 0 0
# 调整 XFS 日志大小(适用于高写入负载)
sudo xfs_admin -L /dev/sdb1 # 查看日志大小
sudo xfs_admin -l /dev/sdb1 # 调整日志大小(需卸载)
二、系统资源管理
系统资源管理包括进程监控、资源限制和自动化调整。
2.1 进程监控与调整
使用 top、htop、pidstat 等工具监控进程。
2.1.1 使用 pidstat 监控
# 安装 sysstat
sudo dnf install sysstat
# 监控进程 CPU 使用率(每秒一次,共10次)
pidstat -u 1 10
# 监控进程内存使用
pidstat -r 1 10
# 监控进程 I/O
pidstat -d 1 10
实战示例:优化高 CPU 使用率的 Java 应用。
使用
pidstat找到高 CPU 进程:pidstat -u 1 10 | grep java分析线程:
# 查看 Java 进程的线程 top -H -p <java_pid>调整 JVM 参数:
# 编辑启动脚本,添加 JVM 参数 java -Xms4g -Xmx4g -XX:+UseG1GC -jar app.jar
2.2 资源限制(cgroups)
使用 cgroups 限制进程资源,防止资源耗尽。
2.2.1 安装 cgroups 工具
sudo dnf install libcgroup-tools
2.2.2 创建 cgroup 限制 CPU
# 创建 cgroup
sudo cgcreate -g cpu:/myapp
# 设置 CPU 限制(例如,最多使用 2 个 CPU 核心)
sudo cgset -r cpu.cfs_quota_us=200000 myapp
sudo cgset -r cpu.cfs_period_us=100000 myapp
# 将进程加入 cgroup
sudo cgexec -g cpu:myapp --sticky <command>
实战示例:限制 Nginx 进程的 CPU 使用。
创建 cgroup:
sudo cgcreate -g cpu:/nginx sudo cgset -r cpu.cfs_quota_us=100000 nginx # 100% 单核 sudo cgset -r cpu.cfs_period_us=100000 nginx启动 Nginx 在 cgroup 中:
sudo cgexec -g cpu:nginx --sticky /usr/sbin/nginx验证:
cat /sys/fs/cgroup/cpu/nginx/cpu.stat
三、网络优化
网络性能对服务器至关重要,尤其是 Web 服务和数据库。
3.1 TCP/IP 参数调优
编辑 /etc/sysctl.conf:
# 增加 TCP 连接队列大小
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 优化 TCP 窗口大小
net.ipv4.tcp_window_scaling = 1
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 减少 TIME_WAIT 状态连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 启用 TCP Fast Open
net.ipv4.tcp_fastopen = 3
# 应用配置
sysctl -p
3.2 网卡多队列(RSS/RPS/RFS)
现代网卡支持多队列,可以将中断分配到多个 CPU 核心。
3.2.1 启用多队列
# 查看网卡队列
ethtool -l eth0
# 设置队列数量(例如,设置为 8)
sudo ethtool -L eth0 combined 8
# 启用 RSS(Receive Side Scaling)
sudo ethtool -K eth0 rxhash on
3.2.2 配置 RPS(Receive Packet Steering)
# 查看当前 RPS 配置
cat /sys/class/net/eth0/queues/rx-0/rps_cpus
# 设置 RPS(例如,使用 CPU 0-7)
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
# 永久设置:创建 udev 规则
sudo vi /etc/udev/rules.d/99-network.rules
添加:
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth0", RUN+="/bin/sh -c 'echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus'"
3.3 网络工具监控
使用 ss、netstat、iftop 等工具监控网络。
# 安装工具
sudo dnf install net-tools iftop
# 查看连接状态
ss -tunap
# 实时监控网络流量
sudo iftop -i eth0
实战示例:优化高并发 Web 服务器。
调整 TCP 参数:
# 在 /etc/sysctl.conf 中添加 net.core.netdev_max_backlog = 300000 net.ipv4.tcp_max_tw_buckets = 2000000配置 Nginx:
sudo vi /etc/nginx/nginx.conf添加:
worker_processes auto; worker_connections 10240; use epoll;重启 Nginx:
sudo systemctl restart nginx
四、存储优化
存储 I/O 是常见瓶颈,尤其是数据库和文件服务器。
4.1 I/O 调度器
AlmaLinux 支持多种 I/O 调度器,如 noop、deadline、cfq、kyber、mq-deadline。
4.1.1 查看和设置调度器
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 设置为 deadline(适合数据库)
echo deadline > /sys/block/sda/queue/scheduler
# 永久设置:编辑 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="... elevator=deadline"
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
4.2 RAID 配置
RAID 可以提高 I/O 性能和冗余。
4.2.1 软件 RAID(mdadm)
# 安装 mdadm
sudo dnf install mdadm
# 创建 RAID 10(4 个磁盘)
sudo mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdd /dev/sde
# 格式化并挂载
sudo mkfs.ext4 /dev/md0
sudo mount /dev/md0 /data
# 永久挂载:编辑 /etc/fstab
/dev/md0 /data ext4 defaults 0 0
4.3 文件系统优化(续)
4.3.1 调整文件系统参数
# 调整 ext4 的保留块(减少空间浪费)
sudo tune2fs -m 1 /dev/sda1 # 保留 1% 空间给 root
# 调整 XFS 的分配策略
sudo xfs_io -c "falloc 0 1G" /data/testfile # 测试分配
实战示例:优化 MySQL 数据库的存储。
配置 I/O 调度器:
echo deadline > /sys/block/sda/queue/scheduler调整 MySQL 配置:
sudo vi /etc/my.cnf添加:
[mysqld] innodb_buffer_pool_size = 4G innodb_log_file_size = 512M innodb_flush_method = O_DIRECT innodb_flush_log_at_trx_commit = 2重启 MySQL:
sudo systemctl restart mysqld
五、应用层实战
应用层优化涉及具体软件的配置,如 Web 服务器、数据库、缓存等。
5.1 Web 服务器优化(Nginx)
5.1.1 Nginx 配置优化
# /etc/nginx/nginx.conf
worker_processes auto;
worker_rlimit_nofile 100000;
events {
worker_connections 10240;
use epoll;
multi_accept on;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# Gzip 压缩
gzip on;
gzip_vary on;
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;
# 缓存静态文件
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
5.1.2 使用 HTTP/2
# 安装 Nginx 支持 HTTP/2
sudo dnf install nginx-mod-http-ssl
# 配置 SSL 和 HTTP/2
sudo vi /etc/nginx/conf.d/ssl.conf
添加:
server {
listen 443 ssl http2;
ssl_certificate /etc/ssl/certs/nginx.crt;
ssl_certificate_key /etc/ssl/private/nginx.key;
# ... 其他配置
}
5.2 数据库优化(PostgreSQL)
5.2.1 PostgreSQL 配置优化
# 编辑配置文件
sudo vi /var/lib/pgsql/data/postgresql.conf
关键参数:
# 内存设置
shared_buffers = 4GB # 通常为总内存的 25%
effective_cache_size = 12GB # 通常为总内存的 75%
work_mem = 64MB # 每个操作的内存,根据并发调整
# 日志设置
wal_level = replica
max_wal_size = 2GB
min_wal_size = 512MB
# 连接设置
max_connections = 200
shared_preload_libraries = 'pg_stat_statements'
5.2.2 使用 pg_stat_statements 监控
-- 启用扩展
CREATE EXTENSION pg_stat_statements;
-- 查看慢查询
SELECT query, calls, total_time, mean_time, rows
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
5.3 缓存优化(Redis)
5.3.1 Redis 配置优化
# 编辑 Redis 配置
sudo vi /etc/redis.conf
关键参数:
# 内存设置
maxmemory 4GB
maxmemory-policy allkeys-lru # LRU 淘汰策略
# 持久化
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
# 网络
tcp-keepalive 300
timeout 0
5.3.2 使用 Redis Benchmark 测试
# 安装 redis-tools
sudo dnf install redis-tools
# 运行基准测试
redis-benchmark -h localhost -p 6379 -c 100 -n 100000
5.4 容器化应用优化(Docker)
5.4.1 Docker 配置优化
# 编辑 Docker 守护进程配置
sudo vi /etc/docker/daemon.json
添加:
{
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
}
}
5.4.2 使用 Docker Compose 优化
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:latest
deploy:
resources:
limits:
cpus: '1'
memory: 512M
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- app-network
db:
image: postgres:latest
deploy:
resources:
limits:
cpus: '2'
memory: 2G
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
volumes:
- db-data:/var/lib/postgresql/data
networks:
- app-network
volumes:
db-data:
networks:
app-network:
driver: bridge
六、监控与自动化
性能优化是一个持续过程,需要监控和自动化调整。
6.1 监控工具
6.1.1 Prometheus + Grafana
# 安装 Prometheus
sudo dnf install prometheus
# 配置 Prometheus
sudo vi /etc/prometheus/prometheus.yml
添加:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
6.1.2 Node Exporter
# 安装 Node Exporter
sudo dnf install node_exporter
# 启动服务
sudo systemctl enable --now node_exporter
6.2 自动化脚本
6.2.1 性能调优脚本
#!/bin/bash
# optimize_alma.sh
# 调整内核参数
echo "vm.swappiness=10" >> /etc/sysctl.conf
echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
sysctl -p
# 调整 I/O 调度器
echo deadline > /sys/block/sda/queue/scheduler
# 调整网络参数
echo "net.core.somaxconn=65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog=65535" >> /etc/sysctl.conf
sysctl -p
# 启用大页内存
echo 1024 > /proc/sys/vm/nr_hugepages
echo "优化完成!"
6.2.2 使用 Ansible 自动化
# playbook.yml
- hosts: all
become: yes
tasks:
- name: 安装 sysstat
dnf:
name: sysstat
state: present
- name: 调整内核参数
sysctl:
name: "{{ item.key }}"
value: "{{ item.value }}"
state: present
reload: yes
loop:
- { key: "vm.swappiness", value: "10" }
- { key: "vm.vfs_cache_pressure", value: "50" }
- { key: "net.core.somaxconn", value: "65535" }
- name: 设置 I/O 调度器
shell: echo deadline > /sys/block/sda/queue/scheduler
args:
creates: /sys/block/sda/queue/scheduler
七、总结
AlmaLinux 性能优化是一个系统工程,需要从内核、系统、网络、存储到应用层全面考虑。通过本文的指南,您可以:
- 内核调优:调整内存、CPU、文件系统参数,提升基础性能。
- 系统资源管理:使用 cgroups 和监控工具管理进程资源。
- 网络优化:优化 TCP 参数和网卡配置,提高网络吞吐量。
- 存储优化:选择合适的 I/O 调度器和 RAID 配置,加速 I/O。
- 应用层实战:针对 Nginx、PostgreSQL、Redis 等常见应用进行配置优化。
- 监控与自动化:使用 Prometheus、Grafana 和脚本实现持续优化。
性能优化没有银弹,需要根据实际负载和硬件环境进行测试和调整。建议在生产环境应用前,在测试环境中充分验证。持续监控和迭代优化是保持系统高性能的关键。
通过本文的实战指南,您将能够构建一个高效、稳定的 AlmaLinux 服务器环境,满足各种业务需求。
