引言:为什么需要优化 AlmaLinux 系统性能
AlmaLinux 作为 CentOS 的稳定替代品,继承了企业级 Linux 的可靠性和安全性。然而,即使是最优秀的操作系统,在默认配置下也可能无法充分发挥硬件潜力。当服务器出现响应缓慢、高负载或资源瓶颈时,系统性能优化就显得尤为重要。
性能优化不仅仅是技术挑战,更是系统稳定性的保障。通过合理的优化策略,我们可以:
- 提升系统响应速度:减少延迟,提高用户体验
- 提高资源利用率:让有限的硬件资源发挥最大效能
- 增强系统稳定性:避免因资源耗尽导致的服务中断
- 降低运营成本:通过优化减少对昂贵硬件升级的依赖
本文将从多个维度深入探讨 AlmaLinux 的性能优化策略,涵盖内核参数调整、资源管理、文件系统优化、网络调优等关键领域,并提供完整的实战案例和代码示例。
一、系统监控与性能分析基础
在进行任何优化之前,我们必须首先了解系统的当前状态。这一部分将介绍关键的监控工具和分析方法。
1.1 系统资源概览工具
1.1.1 使用 top 和 htop 实时监控
top 是最基本的系统监控工具,但 htop 提供了更友好的界面和更多功能。
# 安装 htop
sudo dnf install htop -y
# 运行 htop
htop
在 htop 中,我们可以:
- 查看 CPU、内存、交换空间的使用情况
- 识别占用资源最多的进程
- 按不同维度排序(F6键)
- 发送信号或结束进程
1.1.2 使用 vmstat 分析系统整体状态
vmstat 提供了关于进程、内存、I/O、中断和 CPU 活动的详细信息。
# 每2秒输出一次,共5次
vmstat 2 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 45678 789012 0 0 10 25 150 200 5 2 92 1 0
0 0 0 123400 45678 789012 0 0 0 0 120 180 3 1 96 0 0
关键指标解读:
r:运行队列长度(大于CPU核心数表示CPU瓶颈)b:阻塞进程数swpd:已使用的虚拟内存si/so:交换区输入/输出(应接近0)bi/bo:块设备I/Ous/sy:用户/系统CPU时间id:CPU空闲时间wa:I/O等待时间
1.1.3 使用 iostat 监控磁盘I/O
# 安装 sysstat 包
sudo dnf install sysstat -y
# 查看磁盘I/O统计(每2秒一次,共3次)
iostat -dx 2 3
# 输出示例:
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
sda 2.50 15.00 10.00 60.00 0.00 2.00 0.00 11.76 0.50 1.20 0.02 4.00 4.00 0.30 0.50
关键指标:
r/s、w/s:每秒读/写次数rkB/s、wkB/s:每秒读/写KB数await:平均I/O等待时间(ms)%util:磁盘利用率(接近100%表示磁盘瓶颈)
1.2 性能分析工具集
1.2.1 sar 系统活动报告
sar 可以收集、报告和保存系统活动信息。
# 安装 sysstat
sudo dnf install sysstat -y
# 启用 sar 自动收集(每10分钟收集一次,保留30天)
sudo systemctl enable --now sysstat
# 查看历史CPU使用情况
sar -u
# 查看历史内存使用情况
sar -r
# 查看特定时间的数据
sar -u -s 10:00:00 -e 12:00:00
1.2.2 perf 性能剖析工具
perf 是 Linux 内核自带的性能分析工具,可以深入到函数级别。
# 安装 perf
sudo dnf install perf -y
# 记录系统范围内的CPU事件(10秒)
perf record -a -g sleep 10
# 生成报告
perf report
# 分析特定进程
perf top -p <PID>
1.2.3 strace 系统调用跟踪
用于调试程序和分析系统调用。
# 跟踪特定进程的系统调用
strace -p <PID>
# 跟踪新命令的执行
strace ls -l
# 只跟踪特定系统调用
strace -e trace=open,read,write ls -l
# 输出到文件并统计
strace -c ls -l
二、内核参数优化策略
内核参数是系统性能调优的核心。通过调整 /proc/sys/ 下的参数,我们可以优化内存管理、网络性能、文件系统缓存等。
2.1 内核参数调整基础
2.1.1 临时调整与永久生效
临时调整(重启后失效):
# 临时调整TCP缓冲区大小
echo 8388608 > /proc/sys/net/core/rmem_max
永久调整:
# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf
# 添加参数
net.core.rmem_max = 8388608
# 立即生效
sudo sysctl -p
2.2 内存管理优化
2.2.1 虚拟内存参数
# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf
# 添加以下内存优化参数
# 最大虚拟内存使用量(物理内存的1.5倍)
vm.max_map_count = 262144
# 内存过度分配策略(0:禁止过度分配, 1:允许过度分配, 2:保守策略)
vm.overcommit_memory = 1
# 过度分配百分比(仅当vm.overcommit_memory=2时有效)
vm.overcommit_ratio = 80
# 交换区使用策略(0:最佳性能, 1:最佳内存利用)
vm.swappiness = 10
# 内存回收策略(默认值 100)
vm.zone_reclaim_mode = 0
# 设置保留内存百分比
vm.admin_reserve_kbytes = 8192
# 用户进程可分配的最大物理内存(字节)
vm.user_reserve_kbytes = 131072
# 应用设置
sudo sysctl -p
参数详解:
vm.max_map_count:限制进程的内存映射区域数量,对Elasticsearch、PostgreSQL等应用很重要vm.overcommit_memory:控制内核是否允许过度分配内存vm.swappiness:控制系统使用交换区的倾向性(0-100),值越低越倾向于使用物理内存vm.zone_reclaim_mode:控制NUMA系统中的内存回收策略
2.2.2 缓存和缓冲区优化
# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf
# 添加缓存优化参数
# 控制脏页比例(占总内存的百分比)
vm.dirty_ratio = 15
# 控制后台脏页比例
vm.dirty_background_ratio = 5
# 脏页写入时间(秒)
vm.dirty_writeback_centisecs = 500
# 脏页到期时间(秒)
vm.dirty_expire_centisecs = 3000
# 页面缓存最大值(占总内存的百分比)
vm.vfs_cache_pressure = 100
# 应用设置
sudo sysctl -p
优化建议:
- 对于写密集型应用,适当降低
dirty_ratio和dirty_background_ratio可以减少数据丢失风险 - 对于读密集型应用,可以适当提高
vfs_cache_pressure(>100)来减少缓存压力
2.3 网络性能优化
2.3.1 TCP/IP 核心参数
# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf
# TCP核心优化参数
# 启用TCP快速打开(客户端和服务器端)
net.ipv4.tcp_fastopen = 3
# TCP缓冲区大小(字节)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP连接跟踪表大小
net.netfilter.nf_conntrack_max = 2000000
# TIME_WAIT状态连接的最大数量
net.ipv4.tcp_max_tw_buckets = 2000000
# 允许TIME_WAIT socket重新用于新TCP连接
net.ipv4.tcp_tw_reuse = 1
# 减少TIME_WAIT状态超时时间
net.ipv4.tcp_fin_timeout = 30
# TCP Keepalive参数
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
# 最大半连接队列
net.ipv4.tcp_max_syn_backlog = 65536
# 最大ESTABLISHED状态连接数
net.core.somaxconn = 65536
# 应用设置
sudo sysctl -p
2.3.2 高性能网络参数(针对高并发场景)
# 编辑 sysctl.conf
sudo vi /etc/sysctl.conf
# 高性能网络优化参数
# 增加接收队列
net.core.netdev_max_backlog = 50000
# 启用TCP时间戳
net.ipv4.tcp_timestamps = 1
# 启用TCP选择性确认
net.ipv4.tcp_sack = 1
# 启用TCP窗口缩放
net.ipv4.tcp_window_scaling = 1
# 增加内存压力下的TCP缓冲区自动调整
net.ipv4.tcp_moderate_rcvbuf = 1
# TCP拥塞控制算法(可选:bbr, cubic, htcp)
net.ipv4.tcp_congestion_control = bbr
# 禁用TCP慢启动
net.ipv4.tcp_slow_start_after_idle = 0
# 应用设置
sudo sysctl -p
BBR 拥塞控制算法: BBR (Bottleneck Bandwidth and RTT) 是 Google 开发的拥塞控制算法,特别适合高延迟、高带宽的网络环境。
# 检查当前拥塞控制算法
sysctl net.ipv4.tcp_congestion_control
# 如果系统不支持BBR,需要升级内核
sudo dnf install kernel-ml -y
sudo grub2-set-default 0
sudo reboot
# 启用BBR
echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf
sudo sysctl -p
2.4 文件系统优化
2.4.1 文件系统挂载参数
编辑 /etc/fstab 文件优化挂载参数:
# 备份原始 fstab
sudo cp /etc/fstab /etc/fstab.backup
# 编辑 fstab
sudo vi /etc/fstab
# 优化示例(针对SSD)
UUID=xxxx-xxxx-xxxx / ext4 defaults,noatime,nodiratime,discard,errors=remount-ro 0 1
# 优化示例(针对HDD)
UUID=xxxx-xxxx-xxxx /data ext4 defaults,noatime,barrier=0,data=writeback 0 2
参数详解:
noatime:不更新文件访问时间,减少写操作nodiratime:不更新目录访问时间discard:启用SSD TRIM支持(SSD专用)barrier=0:禁用写屏障(提高性能,但有数据丢失风险)data=writeback:写回模式(提高性能,但一致性风险)
2.4.2 I/O调度器优化
# 查看当前I/O调度器
cat /sys/block/sda/queue/scheduler
# 输出示例:noop [deadline] cfq
# 临时修改I/O调度器
echo deadline > /sys/block/sda/queue/scheduler
# 永久修改(创建udev规则)
sudo tee /etc/udev/rules.d/60-ioscheduler.rules <<EOF
# 为所有NVMe设备设置none调度器
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
# 为所有SSD设备设置noop调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
# 为所有HDD设备设置deadline调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
EOF
# 重新加载udev规则
sudo udevadm control --reload-rules
sudo udevadm trigger
调度器选择指南:
none/noop:适合SSD,无调度开销deadline:适合HDD,保证请求截止时间cfq:适合桌面系统,公平分配I/O带宽kyber/mq-deadline:适合多队列设备(NVMe)
2.5 进程调度和CPU优化
2.5.1 CPU亲和性设置
# 查看CPU信息
lscpu
# 设置进程亲和性(将进程绑定到特定CPU核心)
taskset -p 0xF <PID> # 绑定到前4个核心(二进制1111)
# 启动新进程时设置亲和性
taskset -c 0,1,2,3 my_command
# 查看进程亲和性
taskset -p <PID>
2.5.2 调整进程调度策略
# 查看进程调度策略
chrt -p <PID>
# 设置实时调度策略(需要root权限)
chrt -f -p 99 <PID> # 设置为FIFO实时调度,优先级99
# 启动实时调度进程
chrt -f 99 my_command
# 设置普通调度策略
chrt -o -p 0 <PID> # 设置为普通调度,优先级0
注意:实时调度策略可能导致系统不稳定,仅在必要时使用。
三、资源高效利用策略
3.1 CPU资源优化
3.1.1 进程优先级调整
# 使用nice调整优先级(范围-20到19,值越低优先级越高)
nice -n -10 my_command # 高优先级运行
# 调整已运行进程的优先级
renice -n -10 -p <PID>
# 查看进程优先级
ps -o pid,ni,cmd -p <PID>
3.1.2 使用cgroups限制资源
# 安装cgroup工具
sudo dnf install libcgroup-tools -y
# 创建cgroup
sudo cgcreate -g cpu,memory:/limited
# 设置CPU使用限制(50%单核)
echo 50000 > /sys/fs/cgroup/cpu/limited/cpu.cfs_quota_us
echo 100000 > /sys/fs/cgroup/cpu/limited/cpu.cfs_period_us
# 设置内存限制(1GB)
echo 1G > /sys/fs/cgroup/memory/limited/memory.limit_in_bytes
# 在cgroup中运行进程
sudo cgexec -g cpu,memory:limited my_command
# 监控cgroup资源使用
sudo cgstat -l limited
3.1.3 多线程优化
对于多核系统,确保应用程序充分利用多线程:
# 设置环境变量优化多线程性能
export OMP_NUM_THREADS=4 # OpenMP线程数
export MKL_NUM_THREADS=4 # Intel MKL线程数
export OPENBLAS_NUM_THREADS=4 # OpenBLAS线程数
# 对于Java应用
java -XX:+UseNUMA -XX:+UseParallelGC -Xmx4g MyApp
# 对于Python多进程
import multiprocessing
multiprocessing.set_start_method('spawn')
multiprocessing.set_executable('/usr/bin/python3')
3.2 内存资源优化
3.2.1 内存使用分析
# 查看内存使用详情
free -h
# 查看进程内存使用
ps aux --sort=-%mem | head -10
# 查看共享内存使用
ipcs -m
# 查看内存映射
pmap -x <PID>
# 监控内存泄漏
valgrind --leak-check=full my_program
3.2.2 透明大页优化
# 查看当前透明大页状态
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
# 启用透明大页(对于内存密集型应用)
echo always > /sys/kernel/mm/transparent_hugepage/enabled
echo always > /sys/kernel/mm/transparent_hugepage/defrag
# 永久设置
sudo tee /etc/systemd/system/thp.service <<EOF
[Unit]
Description=Transparent Huge Pages
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo always > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/sh -c 'echo always > /sys/kernel/mm/transparent_hugepage/defrag'
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl enable --now thp.service
3.2.3 内存压缩
# 启用zswap(内存压缩交换)
# 编辑内核启动参数
sudo vi /etc/default/grub
# 添加参数
GRUB_CMDLINE_LINUX="... zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=25"
# 更新grub并重启
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
# 验证zswap状态
cat /sys/module/zswap/parameters/enabled
3.3 I/O资源优化
3.3.1 预读和缓存优化
# 调整块设备预读大小(单位:512字节扇区)
sudo blockdev --setra 8192 /dev/sda
# 永久设置(创建udev规则)
sudo tee /etc/udev/rules.d/60-blockdev.rules <<EOF
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/read_ahead_kb}="8192"
EOF
sudo udevadm control --reload-rules
sudo udevadm trigger
3.3.2 异步I/O优化
# 对于数据库应用,启用异步I/O
# PostgreSQL配置示例
sudo vi /var/lib/pgsql/data/postgresql.conf
# 添加或修改
shared_preload_libraries = 'pg_aio'
max_connections = 200
effective_io_concurrency = 200
maintenance_work_mem = 2GB
checkpoint_timeout = 15min
max_wal_size = 8GB
# MySQL配置示例
sudo vi /etc/my.cnf
# 添加
[mysqld]
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_size = 4G
innodb_read_io_threads = 8
innodb_write_io_threads = 8
3.3.3 RAID优化
# 查看RAID状态
cat /proc/mdstat
# 调整RAID读写策略
sudo mdadm --detail /dev/md0
# 设置RAID读策略(0:负载均衡, 1:优先读取奇偶校验, 2:优先读取数据)
echo "algorithm 2" > /sys/block/md0/md/algorithm
# 调整RAID同步速度
echo 50000 > /sys/block/md0/md/sync_speed_min
echo 200000 > /sys/block/md0/md/sync_speed_max
# 调整RAID重建速度
echo 50000 > /sys/block/md0/md/sync_force_parallel
四、网络性能优化实战
4.1 网络接口优化
4.1.1 网卡多队列
# 查看网卡队列数
ethtool -l eth0
# 启用多队列(如果支持)
sudo ethtool -L eth0 combined 8
# 调整队列长度
sudo ip link set eth0 txqueuelen 5000
# 查看和调整中断亲和性
cat /proc/interrupts | grep eth0
# 设置中断亲和性(将中断分配到不同CPU核心)
sudo systemctl enable irqbalance
sudo systemctl start irqbalance
4.1.2 网卡参数调优
# 查看当前设置
ethtool -k eth0
# 启用关键特性
sudo ethtool -K eth0 gro on # 通用接收卸载
sudo ethtool -K eth0 gso on # 通用发送卸载
sudo ethtool -K eth0 tso on # TCP分段卸载
sudo ethtool -K eth0 rx on tx on # 启用接收/发送校验和
# 调整环形缓冲区大小
sudo ethtool -G eth0 rx 4096 tx 4096
# 查看统计信息
ethtool -S eth0
4.2 防火墙优化
4.2.1 firewalld 性能优化
# 查看当前规则数量
sudo firewall-cmd --list-all
# 优化策略:减少不必要的规则
# 创建优化的区域配置
sudo firewall-cmd --permanent --new-policy optimized
sudo firewall-cmd --permanent --policy optimized --add-ingress-zone HOST
sudo firewall-cmd --permanent --policy optimized --add-egress-zone ANY
sudo firewall-cmd --permanent --policy optimized --set-target ACCEPT
# 对于高并发服务器,考虑使用nftables替代
sudo dnf install nftables -y
sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl enable --now nftables
4.2.2 nftables 优化配置
# 创建优化的nftables配置
sudo tee /etc/nftables.conf <<EOF
#!/usr/sbin/nft -f
# 清空现有规则
flush ruleset
table inet filter {
# 基础链
chain input {
type filter hook input priority 0; policy drop;
# 允许本地回环
iif "lo" accept
# 允许已建立和相关连接
ct state established,related accept
# 允许ICMP
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
# 允许SSH(限制速率)
tcp dport 22 ct state new limit rate 5/minute accept
# 允许HTTP/HTTPS
tcp dport {80, 443} accept
# 丢弃无效包
ct state invalid drop
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
EOF
# 应用配置
sudo nft -f /etc/nftables.conf
4.3 负载均衡与连接优化
4.3.1 使用 HAProxy 进行TCP负载均衡
# 安装HAProxy
sudo dnf install haproxy -y
# 配置优化
sudo tee /etc/haproxy/haproxy.cfg <<EOF
global
maxconn 100000
nbthread 8
tune.ssl.default-dh-param 2048
tune.maxrewrite 1024
tune.bufsize 32768
defaults
mode tcp
timeout connect 5s
timeout client 30s
timeout server 30s
timeout http-request 10s
option tcplog
option dontlognull
retries 3
option redispatch
maxconn 10000
frontend http_front
bind *:80
default_backend http_back
backend http_back
balance leastconn
option httpchk GET /health
server web1 192.168.1.101:80 check inter 2000 rise 2 fall 3
server web2 192.168.1.102:80 check inter 2000 rise 2 fall 3
server web3 192.168.1.103:80 check inter 2000 rise 2 fall 3
listen stats
bind *:8404
stats enable
stats uri /stats
stats refresh 10s
EOF
# 启动HAProxy
sudo systemctl enable --now haproxy
4.3.2 使用 ipvs 进行内核级负载均衡
# 安装ipvsadm
sudo dnf install ipvsadm -y
# 加载ipvs模块
sudo modprobe ip_vs
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_wlc
# 配置ipvs规则
sudo ipvsadm -A -t 192.168.1.100:80 -s wlc
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.101:80 -g
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.102:80 -g
sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.103:80 -g
# 查看ipvs状态
sudo ipvsadm -L -n --stats
# 保存配置
sudo ipvsadm-save > /etc/sysconfig/ipvsadm
sudo systemctl enable ipvsadm
五、应用层优化策略
5.1 Web服务器优化
5.1.1 Nginx 高性能配置
# 安装Nginx
sudo dnf install nginx -y
# 优化配置
sudo tee /etc/nginx/nginx.conf <<EOF
user nginx;
worker_processes auto;
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 4096;
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;
# 性能优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
reset_timedout_connection on;
client_body_timeout 10;
send_timeout 2;
# 缓冲区优化
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
output_buffers 1 32k;
postpone_output 1460;
# 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/javascript
application/xml+rss
application/json;
# 缓存配置
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# 包含其他配置
include /etc/nginx/conf.d/*.conf;
}
EOF
# 测试配置并重启
sudo nginx -t
sudo systemctl restart nginx
5.1.2 Apache 优化配置
# 安装Apache
sudo dnf install httpd -y
# 优化配置
sudo tee /etc/httpd/conf/httpd.conf <<EOF
ServerTokens Prod
ServerSignature Off
TraceEnable Off
# 性能优化
StartServers 8
MinSpareServers 8
MaxSpareServers 16
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
# 超时设置
Timeout 60
KeepAlive On
KeepAliveTimeout 5
MaxKeepAliveRequests 100
# 模块优化
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule expires_module modules/mod_expires.so
LoadModule headers_module modules/mod_headers.so
# MPM Event配置
<IfModule mpm_event_module>
StartServers 4
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000
</IfModule>
# Gzip压缩
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
DeflateCompressionLevel 6
</IfModule>
# 缓存控制
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/gif "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
</IfModule>
EOF
# 启动服务
sudo systemctl enable --now httpd
5.2 数据库优化
5.2.1 PostgreSQL 优化
# 安装PostgreSQL
sudo dnf install postgresql-server postgresql-contrib -y
sudo postgresql-setup --initdb
# 优化配置
sudo tee /var/lib/pgsql/data/postgresql.conf <<EOF
# 连接设置
max_connections = 200
shared_buffers = 2GB
effective_cache_size = 6GB
work_mem = 64MB
maintenance_work_mem = 512MB
# WAL设置
wal_level = replica
wal_buffers = 16MB
checkpoint_timeout = 15min
max_wal_size = 4GB
min_wal_size = 1GB
# 自动清理
autovacuum = on
autovacuum_max_workers = 4
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 50
# 日志设置
log_min_duration_statement = 500
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
# 查询优化
random_page_cost = 1.1
effective_io_concurrency = 200
default_statistics_target = 100
EOF
# 配置客户端认证
sudo tee /var/lib/pgsql/data/pg_hba.conf <<EOF
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host all all 192.168.1.0/24 md5
EOF
# 启动服务
sudo systemctl enable --now postgresql
# 调整内核参数以支持PostgreSQL
sudo tee -a /etc/sysctl.conf <<EOF
# PostgreSQL优化
kernel.shmmax = 2147483648
kernel.shmall = 524288
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
EOF
sudo sysctl -p
5.2.2 MySQL/MariaDB 优化
# 安装MariaDB
sudo dnf install mariadb-server -y
# 优化配置
sudo tee /etc/my.cnf.d/server.cnf <<EOF
[mysqld]
# 基础设置
user = mysql
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
# 连接设置
max_connections = 500
max_connect_errors = 100
connect_timeout = 10
# 内存优化
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
# I/O优化
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
innodb_flush_neighbors = 0
# 查询缓存
query_cache_type = 0
query_cache_size = 0
# 日志设置
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
# 其他优化
tmp_table_size = 256M
max_heap_table_size = 256M
table_open_cache = 2000
table_definition_cache = 1400
EOF
# 启动服务
sudo systemctl enable --now mariadb
# 运行MySQL安全脚本
sudo mysql_secure_installation
5.3 应用性能监控
5.3.1 使用 Prometheus + Grafana 监控
# 安装Prometheus
sudo dnf install prometheus -y
# 配置Prometheus
sudo tee /etc/prometheus/prometheus.yml <<EOF
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- "rules.yml"
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
- job_name: 'postgres'
static_configs:
- targets: ['localhost:9187']
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113']
- job_name: 'mysql'
static_configs:
- targets: ['localhost:9104']
EOF
# 安装Node Exporter
sudo dnf install node_exporter -y
sudo systemctl enable --now node_exporter
# 安装PostgreSQL Exporter
sudo dnf install postgres_exporter -y
sudo systemctl enable --now postgres_exporter
# 安装Nginx Exporter
sudo dnf install nginx-prometheus-exporter -y
sudo systemctl enable --now nginx-prometheus-exporter
# 安装MySQL Exporter
sudo dnf install prometheus-mysqld-exporter -y
sudo systemctl enable --now mysqld_exporter
# 启动Prometheus
sudo systemctl enable --now prometheus
六、实战案例:解决高负载服务器问题
6.1 案例背景
假设我们有一台 AlmaLinux 服务器,配置为:
- CPU:8核
- 内存:32GB
- 磁盘:2TB SSD
- 运行服务:Nginx + PHP-FPM + MySQL
- 问题:在高并发访问时,服务器响应缓慢,CPU使用率经常达到100%,内存使用率超过90%
6.2 诊断过程
6.2.1 初步诊断
# 1. 查看系统整体状态
top
# 2. 查看CPU使用详情
mpstat -P ALL 1
# 3. 查看内存使用详情
vmstat 1 10
# 4. 查看I/O情况
iostat -dx 1 5
# 5. 查看网络连接
ss -s
ss -tan | awk '{print $1}' | sort | uniq -c
# 6. 查看PHP-FPM进程
ps aux | grep php-fpm | wc -l
6.2.2 深入分析
# 1. 使用perf分析CPU热点
sudo perf top -p $(pgrep php-fpm)
# 2. 分析MySQL慢查询
sudo mysql -e "SHOW FULL PROCESSLIST;" | grep -v Sleep
# 3. 查看系统调用
sudo strace -c -p $(pgrep php-fpm)
# 4. 使用atop记录历史数据
sudo atop -w /var/log/atop.log 60 # 每60秒记录一次
# 5. 分析网络流量
sudo iftop -i eth0 -n
6.3 优化方案实施
6.3.1 内核参数优化
# 创建优化脚本
sudo tee /usr/local/bin/performance-tuning.sh <<'EOF'
#!/bin/bash
# 网络优化
cat >> /etc/sysctl.conf <<'SYSCTL'
# 网络优化
net.core.somaxconn = 65536
net.core.netdev_max_backlog = 50000
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 10
# 内存优化
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.max_map_count = 262144
vm.overcommit_memory = 1
# 文件系统
fs.file-max = 2097152
fs.nr_open = 2097152
SYSCTL
# 调整用户限制
cat >> /etc/security/limits.conf <<'LIMITS'
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65535
* hard nproc 65535
LIMITS
# 应用设置
sysctl -p
echo "内核参数优化完成"
EOF
sudo chmod +x /usr/local/bin/performance-tuning.sh
sudo /usr/local/bin/performance-tuning.sh
6.3.2 PHP-FPM 优化
# 备份原配置
sudo cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.backup
# 优化配置
sudo tee /etc/php-fpm.d/www.conf <<'EOF'
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.backlog = 65536
listen.allowed_clients = 127.0.0.1
; 进程管理
pm = dynamic
pm.max_children = 200
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 50
pm.max_requests = 5000
; 进程空闲时间
pm.process_idle_timeout = 10s
; 内存限制
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] = 50M
php_admin_value[upload_max_filesize] = 50M
; 慢日志
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log
; 错误日志
catch_workers_output = yes
php_admin_value[error_log] = /var/log/php-fpm/error.log
php_admin_flag[log_errors] = on
; Opcache
php_admin_value[opcache.enable] = 1
php_admin_value[opcache.memory_consumption] = 512
php_admin_value[opcache.interned_strings_buffer] = 64
php_admin_value[opcache.max_accelerated_files] = 100000
php_admin_value[opcache.validate_timestamps] = 0
php_admin_value[opcache.save_comments] = 1
php_admin_value[opcache.fast_shutdown] = 1
php_admin_value[opcache.enable_cli] = 1
EOF
# 重启PHP-FPM
sudo systemctl restart php-fpm
# 查看状态
sudo systemctl status php-fpm
sudo php-fpm -t
6.3.3 MySQL 优化
# 优化MySQL配置
sudo tee /etc/my.cnf.d/server.cnf <<'EOF'
[mysqld]
# 基础设置
user = mysql
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
# 连接设置
max_connections = 500
max_connect_errors = 100
connect_timeout = 10
wait_timeout = 600
# 内存优化
innodb_buffer_pool_size = 16G
innodb_buffer_pool_instances = 16
innodb_log_file_size = 2G
innodb_log_buffer_size = 128M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_read_io_threads = 16
innodb_write_io_threads = 16
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_neighbors = 0
# 查询缓存
query_cache_type = 0
query_cache_size = 0
# 日志设置
slow_query_log = 1
slow_query_log_file = /var/log/mariadb/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
# 临时表
tmp_table_size = 512M
max_heap_table_size = 512M
# 表缓存
table_open_cache = 4000
table_definition_cache = 2000
# 排序缓冲区
sort_buffer_size = 4M
join_buffer_size = 4M
# InnoDB额外设置
innodb_adaptive_hash_index = 1
innodb_change_buffering = all
innodb_old_blocks_time = 1000
innodb_stats_on_metadata = 0
innodb_stats_method = nulls_equal
EOF
# 重启MySQL
sudo systemctl restart mariadb
# 运行MySQL性能调优脚本
sudo mysql_tuner --user root --pass ''
6.3.4 Nginx 优化
# 优化Nginx配置
sudo tee /etc/nginx/nginx.conf <<'EOF'
user nginx;
worker_processes auto;
worker_rlimit_nofile 100000;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 4096;
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;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
reset_timedout_connection on;
client_body_timeout 10;
send_timeout 2;
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
output_buffers 1 32k;
postpone_output 1460;
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/javascript
application/xml+rss
application/json;
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
include /etc/nginx/conf.d/*.conf;
}
EOF
# 优化PHP-FPM上游配置
sudo tee /etc/nginx/conf.d/php-fpm.conf <<'EOF'
upstream php-fpm {
server 127.0.0.1:9000 max_fails=3 fail_timeout=30s;
keepalive 32;
}
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 php-fpm;
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;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}
location ~ /\.ht {
deny all;
}
}
EOF
# 测试并重启Nginx
sudo nginx -t
sudo systemctl restart nginx
6.4 验证优化效果
# 1. 监控CPU使用率
mpstat -P ALL 1 10
# 2. 监控内存使用
free -h
vmstat 1 10
# 3. 监控I/O性能
iostat -dx 1 10
# 4. 监控网络连接
ss -s
ss -tan | awk '{print $1}' | sort | uniq -c
# 5. 监控PHP-FPM状态
sudo systemctl status php-fpm
ps aux | grep php-fpm | wc -l
# 6. 监控MySQL性能
sudo mysql -e "SHOW STATUS LIKE 'Threads_%';"
sudo mysql -e "SHOW STATUS LIKE 'Innodb_buffer_pool_%';"
# 7. 使用ab进行压力测试
sudo dnf install httpd-tools -y
ab -n 10000 -c 100 http://localhost/
6.5 持续监控与调优
# 安装监控工具
sudo dnf install sysstat htop iotop -y
# 配置sysstat自动收集
sudo systemctl enable --now sysstat
# 创建监控脚本
sudo tee /usr/local/bin/monitor-performance.sh <<'EOF'
#!/bin/bash
LOG_DIR="/var/log/performance"
mkdir -p $LOG_DIR
# 收集系统指标
echo "=== $(date) ===" >> $LOG_DIR/system.log
echo "CPU:" >> $LOG_DIR/system.log
mpstat 1 1 >> $LOG_DIR/system.log
echo "Memory:" >> $LOG_DIR/system.log
free -h >> $LOG_DIR/system.log
echo "Disk I/O:" >> $LOG_DIR/system.log
iostat -dx 1 1 >> $LOG_DIR/system.log
echo "Network:" >> $LOG_DIR/system.log
ss -s >> $LOG_DIR/system.log
# 清理旧日志(保留7天)
find $LOG_DIR -name "*.log" -mtime +7 -delete
EOF
sudo chmod +x /usr/local/bin/monitor-performance.sh
# 添加到crontab(每5分钟执行一次)
sudo crontab -l | { cat; echo "*/5 * * * * /usr/local/bin/monitor-performance.sh"; } | sudo crontab -
七、高级优化技巧
7.1 使用 eBPF 进行深度监控
# 安装bcc工具集
sudo dnf install bcc-tools -y
# 使用bpftrace进行性能分析
sudo dnf install bpftrace -y
# 示例:跟踪MySQL查询延迟
sudo bpftrace -e 'kprobe:do_query { @start[tid] = nsecs; }
kretprobe:do_query /@start[tid]/ { @latency = hist(nsecs - @start[tid]); delete(@start[tid]); }'
# 跟踪系统调用延迟
sudo bpftrace -e 'kprobe:sys_* { @start[tid] = nsecs; }
kretprobe:sys_* /@start[tid]/ { @latency = hist(nsecs - @start[tid]); delete(@start[tid]); }'
7.2 使用 systemd 进行资源限制
# 创建服务单元文件
sudo tee /etc/systemd/system/myapp.service <<'EOF'
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=appuser
Group=appgroup
ExecStart=/usr/local/bin/myapp
# 资源限制
LimitNOFILE=1048576
LimitNPROC=65535
MemoryMax=4G
MemoryHigh=3G
CPUQuota=200%
CPUWeight=100
IOWeight=100
# 安全设置
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/myapp
NoNewPrivileges=true
# 重启策略
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now myapp.service
7.3 使用 cgroups v2 进行精细控制
# 挂载cgroup v2
sudo mount -t cgroup2 none /sys/fs/cgroup
# 创建cgroup
sudo mkdir -p /sys/fs/cgroup/app.slice
# 设置资源限制
echo "200000" > /sys/fs/cgroup/app.slice/cpu.max
echo "4G" > /sys/fs/cgroup/app.slice/memory.max
echo "100M" > /sys/fs/cgroup/app.slice/memory.high
# 将进程添加到cgroup
echo <PID> > /sys/fs/cgroup/app.slice/cgroup.procs
# 使用systemd集成
sudo systemctl set-property myapp.service MemoryMax=4G CPUQuota=200%
7.4 使用 NUMA 优化
# 查看NUMA拓扑
numactl --hardware
# 绑定进程到特定NUMA节点
numactl --cpunodebind=0 --membind=0 my_command
# 查看进程NUMA状态
numactl --show
# 优化MySQL使用NUMA
sudo tee /etc/systemd/system/mariadb.service.d/numa.conf <<'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/numactl --cpunodebind=0 --membind=0 /usr/sbin/mysqld $MYSQLD_OPTS
EOF
sudo systemctl daemon-reload
sudo systemctl restart mariadb
八、总结与最佳实践
8.1 优化检查清单
8.1.1 系统层面
- [ ] 内核参数已优化(vm.swappiness, dirty_ratio等)
- [ ] 文件系统挂载选项正确(noatime, discard等)
- [ ] I/O调度器适合硬件类型
- [ ] 用户资源限制已调整(ulimit)
- [ ] 定期系统监控已配置
8.1.2 网络层面
- [ ] TCP参数已优化(缓冲区、keepalive等)
- [ ] 网卡多队列已启用
- [ ] 防火墙规则已优化
- [ ] 负载均衡配置正确
8.1.3 应用层面
- [ ] Web服务器配置已优化
- [ ] 数据库参数已调整
- [ ] 缓存策略已实施
- [ ] 日志级别适当
8.1.4 监控层面
- [ ] 系统监控工具已安装
- [ ] 应用性能监控已配置
- [ ] 告警阈值已设置
- [ ] 日志轮转已配置
8.2 性能优化原则
- 测量优先:在优化之前,先测量当前性能,建立基准
- 逐步调整:一次只调整一个参数,观察效果
- 理解原理:不要盲目应用参数,理解其作用机制
- 测试验证:在生产环境应用前,先在测试环境验证
- 持续监控:优化不是一次性工作,需要持续监控和调整
- 平衡取舍:性能、稳定性、安全性之间需要权衡
8.3 常见误区
- 过度优化:不必要的优化可能引入复杂性和风险
- 盲目复制:不同场景需要不同的优化策略
- 忽视监控:没有监控的优化是盲目的
- 忽略硬件:软件优化无法弥补硬件瓶颈
- 一次性调整:系统负载变化需要动态调整
8.4 推荐工具集
# 安装完整的性能分析工具集
sudo dnf install -y \
sysstat \
htop \
iotop \
iftop \
nethogs \
perf \
bpftrace \
bcc-tools \
strace \
ltrace \
valgrind \
gdb \
tcpdump \
wireshark-cli \
atop \
vmstat \
iostat \
mpstat \
pidstat
8.5 持续优化流程
# 创建优化工作流脚本
sudo tee /usr/local/bin/optimization-workflow.sh <<'EOF'
#!/bin/bash
# 1. 收集当前性能数据
echo "=== 性能数据收集 $(date) ===" > /tmp/performance-report.txt
echo "系统负载:" >> /tmp/performance-report.txt
uptime >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt
echo "CPU使用率:" >> /tmp/performance-report.txt
mpstat 1 3 >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt
echo "内存使用:" >> /tmp/performance-report.txt
free -h >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt
echo "磁盘I/O:" >> /tmp/performance-report.txt
iostat -dx 1 3 >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt
echo "网络连接:" >> /tmp/performance-report.txt
ss -s >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt
echo "进程TOP10 CPU:" >> /tmp/performance-report.txt
ps aux --sort=-%cpu | head -11 >> /tmp/performance-report.txt
echo "" >> /tmp/performance-report.txt
echo "进程TOP10 内存:" >> /tmp/performance-report.txt
ps aux --sort=-%mem | head -11 >> /tmp/performance-report.txt
# 2. 分析瓶颈
echo "=== 瓶颈分析 ===" >> /tmp/performance-report.txt
if [ $(awk '/^r/ {print $1}' /proc/loadavg | cut -d. -f1) -gt $(nproc) ]; then
echo "警告: CPU负载过高" >> /tmp/performance-report.txt
fi
MEM_FREE=$(free | awk '/Mem:/ {printf "%.0f", $4/$2 * 100}')
if [ $MEM_FREE -lt 10 ]; then
echo "警告: 内存不足" >> /tmp/performance-report.txt
fi
# 3. 生成报告
cat /tmp/performance-report.txt | mail -s "性能报告 $(date)" admin@example.com
# 4. 清理
rm -f /tmp/performance-report.txt
EOF
sudo chmod +x /usr/local/bin/optimization-workflow.sh
# 添加到cron
sudo crontab -l | { cat; echo "0 */4 * * * /usr/local/bin/optimization-workflow.sh"; } | sudo crontab -
结语
AlmaLinux 性能优化是一个系统性工程,需要从内核参数、资源管理、应用配置、网络调优等多个维度综合考虑。通过本文提供的详细策略和实战案例,您应该能够:
- 系统性地诊断性能问题:使用各种监控工具识别瓶颈
- 科学地调整内核参数:理解每个参数的作用和适用场景
- 优化资源利用:合理分配CPU、内存、I/O资源
- 提升应用性能:针对不同应用进行专门优化
- 建立持续优化机制:通过监控和自动化工具保持系统最佳状态
记住,性能优化不是一蹴而就的,而是一个持续改进的过程。建议您:
- 建立性能基线,定期对比
- 在测试环境验证优化方案
- 使用版本控制管理配置变更
- 保持对新技术的关注和学习
- 建立完善的监控和告警体系
通过这些实践,您将能够打造极速稳定的 AlmaLinux 系统,为业务提供强有力的技术支撑。
