引言:为什么需要关注 AlmaLinux 性能调优?
AlmaLinux 作为 CentOS 的继任者,继承了 RHEL 的稳定性和企业级特性。在生产环境中,无论是运行高并发 Web 服务、数据库集群还是容器化应用,系统性能都直接影响业务体验和成本。本文将从内核参数调优、CPU/内存/磁盘 I/O 优化、网络性能提升到容器环境优化,提供一套完整的实战指南。
第一章:内核参数调优
1.1 内核参数调优基础
Linux 内核参数控制着系统资源的分配和使用方式。通过调整 /proc/sys/ 下的参数,可以优化系统行为。
1.1.1 常用调优工具
# 查看当前内核参数
sysctl -a | grep <关键词>
# 临时修改参数(重启失效)
sysctl -w net.core.somaxconn=65535
# 永久修改参数(写入配置文件)
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
sysctl -p # 立即生效
1.2 网络性能调优
1.2.1 TCP/IP 栈优化
对于高并发 Web 服务器,需要调整 TCP 连接队列和缓冲区大小:
# /etc/sysctl.conf 配置示例
# 增大 TCP 连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 优化 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 Fast Open
net.ipv4.tcp_fastopen = 3
# 减少 TIME_WAIT 连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 增大端口范围
net.ipv4.ip_local_port_range = 1024 65535
1.2.2 网络性能测试
使用 iperf3 测试网络吞吐量:
# 在服务器端启动
iperf3 -s
# 在客户端测试
iperf3 -c <服务器IP> -t 30 -P 10 # 10个并行连接测试30秒
1.3 内存管理调优
1.3.1 虚拟内存参数
# /etc/sysctl.conf 内存优化配置
# 减少交换倾向,优先使用物理内存
vm.swappiness = 10
# 优化内存回收策略
vm.vfs_cache_pressure = 50
# 增大内存映射文件限制
vm.max_map_count = 262144
# 调整脏页写回策略
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
1.3.2 大页内存(HugePages)配置
对于数据库等内存密集型应用,启用大页内存可以减少 TLB miss:
# 计算需要的大页数量(以 2MB 大页为例)
# 假设需要 64GB 大页内存
HUGEPAGES_COUNT=$((64 * 1024 / 2))
# 临时设置
echo $HUGEPAGES_COUNT > /proc/sys/vm/nr_hugepages
# 永久设置(/etc/sysctl.conf)
vm.nr_hugepages = 32768
# 验证大页状态
cat /proc/meminfo | grep Huge
# 在应用中使用大页(以 PostgreSQL 为例)
# postgresql.conf
# huge_pages = on
# shared_buffers = 16GB # 需要与大页大小对齐
1.4 I/O 调度器优化
1.4.1 选择合适的 I/O 调度器
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 设置调度器(根据硬件类型选择)
# SSD/NVMe: none 或 noop
# HDD: deadline 或 bfq
echo noop > /sys/block/sda/queue/scheduler
# 永久设置(通过 udev 规则)
cat > /etc/udev/rules.d/60-ioscheduler.rules << 'EOF'
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="noop"
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="deadline"
EOF
1.4.2 I/O 性能监控
# 使用 iostat 监控磁盘 I/O
iostat -x 1 # 每秒刷新,显示扩展统计信息
# 使用 iotop 查看进程级 I/O
sudo iotop -o
# 使用 blktrace 跟踪块设备操作
blktrace -d /dev/sda -o trace
blkparse -i trace.blktrace.0 -o trace.txt
第二章:CPU 性能优化
2.1 CPU 调度策略
2.1.1 CPU 亲和性(Affinity)
将进程绑定到特定 CPU 核心,减少上下文切换:
# 查看 CPU 信息
lscpu
# 使用 taskset 绑定进程到 CPU 核心
# 绑定进程 PID 1234 到 CPU 0-3
taskset -cp 0-3 1234
# 启动时绑定进程
taskset -c 0-3 /path/to/application
# 使用 numactl 进行 NUMA 节点绑定
numactl --cpunodebind=0 --membind=0 /path/to/application
2.1.2 CPU 调度器选择
AlmaLinux 默认使用 CFS(完全公平调度器),但可以调整:
# 查看当前调度器
cat /sys/kernel/debug/sched/debug 2>/dev/null | head -20
# 调整 CFS 参数(/etc/sysctl.conf)
# 减少调度延迟
kernel.sched_latency_ns = 10000000 # 10ms
kernel.sched_min_granularity_ns = 1000000 # 1ms
kernel.sched_wakeup_granularity_ns = 1000000 # 1ms
# 对于实时任务,可以使用 SCHED_FIFO
# 需要 root 权限
chrt -f -p 99 <PID> # 设置 FIFO 调度,优先级 99
2.2 多线程应用优化
2.2.1 线程池配置
对于高并发应用,合理配置线程池大小:
# Python 示例:使用 concurrent.futures
import concurrent.futures
import psutil
def get_optimal_thread_count():
"""根据 CPU 核心数和负载计算最优线程数"""
cpu_count = psutil.cpu_count()
# I/O 密集型:2-4倍 CPU 核心数
# CPU 密集型:等于 CPU 核心数
return cpu_count * 2
# 创建线程池
with concurrent.futures.ThreadPoolExecutor(
max_workers=get_optimal_thread_count()
) as executor:
# 提交任务
futures = [executor.submit(process_task, i) for i in range(100)]
# 处理结果
for future in concurrent.futures.as_completed(futures):
result = future.result()
2.2.2 NUMA 感知编程
对于多路服务器,NUMA 感知至关重要:
// C 示例:NUMA 感知内存分配
#include <numa.h>
#include <numaif.h>
#include <stdio.h>
void numa_aware_allocation() {
// 检查 NUMA 支持
if (numa_available() < 0) {
printf("NUMA not available\n");
return;
}
// 获取当前节点
int node = numa_node_of_cpu(sched_getcpu());
printf("Current NUMA node: %d\n", node);
// 在特定节点分配内存
void *ptr = numa_alloc_onnode(1024 * 1024, node); // 1MB
if (ptr == NULL) {
printf("Allocation failed\n");
return;
}
// 绑定内存到节点
unsigned long nodemask = 1 << node;
mbind(ptr, 1024 * 1024, MPOL_BIND, &nodemask, 64, 0);
// 使用内存...
// 释放
numa_free(ptr, 1024 * 1024);
}
2.3 CPU 性能监控
2.3.1 使用 perf 进行性能分析
# 安装 perf
sudo dnf install perf
# 记录 CPU 性能事件
perf record -g -p <PID> sleep 30
# 生成报告
perf report
# 实时监控 CPU 使用率
perf stat -e cycles,instructions,cache-misses -p <PID> sleep 10
# 分析热点函数
perf record -F 99 -g -- sleep 30
perf script | flamegraph.pl > flamegraph.svg
2.3.2 使用 htop 和 mpstat
# htop 交互式监控
htop
# mpstat 多核 CPU 统计
mpstat -P ALL 1
# 查看每个 CPU 核心的使用情况
cat /proc/stat | grep '^cpu[0-9]'
第三章:内存管理优化
3.1 内存使用分析
3.1.1 内存使用情况监控
# 查看内存使用详情
free -h
cat /proc/meminfo
# 使用 smem 按进程统计内存
smem -s rss -r
# 使用 pmap 查看进程内存映射
pmap -x <PID>
3.1.2 内存泄漏检测
# 使用 valgrind 检测 C/C++ 程序内存泄漏
valgrind --leak-check=full --show-leak-kinds=all ./your_program
# 使用 mtrace 进行内存跟踪
export MALLOC_TRACE=/tmp/mtrace.log
./your_program
mtrace your_program /tmp/mtrace.log
# 使用 heaptrack 进行堆分析(需要安装)
heaptrack ./your_program
heaptrack_gui heaptrack.your_program.12345.gz
3.2 内存压缩与交换优化
3.2.1 zswap 配置
zswap 是一种内核级内存压缩技术,可以减少交换延迟:
# 检查 zswap 是否可用
cat /proc/sys/kernel/zswap/enabled
# 启用 zswap(临时)
echo 1 > /proc/sys/kernel/zswap/enabled
# 指定压缩算法(zstd 通常比 lzo 更好)
echo zstd > /proc/sys/kernel/zswap/compressor
# 设置最大压缩比例(默认 2:1)
echo 2 > /proc/sys/kernel/zswap/max_pool_percent
# 永久启用(/etc/default/grub)
GRUB_CMDLINE_LINUX_DEFAULT="... zswap.enabled=1 zswap.compressor=zstd zswap.max_pool_percent=20"
# 更新 GRUB 并重启
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
sudo reboot
3.2.2 交换分区优化
# 创建交换文件(如果需要更多交换空间)
dd if=/dev/zero of=/swapfile bs=1M count=8192 # 8GB
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# 永久添加到 fstab
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# 调整交换倾向(vm.swappiness)
# 值越低,越倾向于使用物理内存
# 0-10: 尽可能避免交换
# 60: 默认值
# 100: 积极交换
sysctl vm.swappiness=10
3.3 应用级内存优化
3.3.1 Java 应用内存优化
# JVM 内存参数示例(/etc/default/tomcat)
JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap"
# 使用 jstat 监控 GC
jstat -gcutil <PID> 1000
# 使用 jmap 生成堆转储
jmap -dump:format=b,file=heap.hprof <PID>
# 使用 jconsole 或 jvisualvm 监控
jconsole <PID>
3.3.2 Python 应用内存优化
# 使用 memory_profiler 分析内存使用
# 安装:pip install memory_profiler
from memory_profiler import profile
@profile
def memory_intensive_function():
# 创建大列表
large_list = [i for i in range(1000000)]
# 处理数据
processed = [x * 2 for x in large_list]
return processed
# 使用 gc 模块控制垃圾回收
import gc
# 禁用自动垃圾回收
gc.disable()
# 手动触发垃圾回收
gc.collect()
# 设置垃圾回收阈值
gc.set_threshold(700, 10, 10)
第四章:磁盘 I/O 优化
4.1 文件系统选择与优化
4.1.1 文件系统性能对比
| 文件系统 | 适用场景 | 性能特点 |
|---|---|---|
| XFS | 大文件、高并发 | 优秀的大文件性能,适合数据库 |
| ext4 | 通用场景 | 稳定,适合大多数应用 |
| Btrfs | 快照、压缩 | 支持快照和压缩,但性能略低 |
| ZFS | 数据存储、RAID | 强大的数据完整性,但内存消耗大 |
4.1.2 XFS 文件系统优化
# 创建 XFS 文件系统时优化参数
mkfs.xfs -f -i size=512 -l size=128m -d agcount=4 /dev/sdb1
# 挂载时优化参数
mount -o noatime,nodiratime,allocsize=64m /dev/sdb1 /data
# 永久挂载(/etc/fstab)
/dev/sdb1 /data xfs noatime,nodiratime,allocsize=64m 0 0
# 调整 XFS 日志大小(对于大文件操作)
xfs_admin -L 128m /dev/sdb1
4.1.3 ext4 文件系统优化
# 创建 ext4 时优化
mkfs.ext4 -E stride=128,stripe-width=256 -O extent,uninit_bg /dev/sdb1
# 挂载优化
mount -o noatime,nodiratime,data=writeback /dev/sdb1 /data
# 调整日志大小
tune2fs -J size=128 /dev/sdb1
# 调整保留空间(默认 5%)
tune2fs -m 1 /dev/sdb1 # 保留 1% 空间给 root
4.2 I/O 调度器深度优化
4.2.1 不同调度器的适用场景
# 查看所有可用调度器
cat /sys/block/*/queue/scheduler
# 设置调度器(根据硬件类型)
# SSD/NVMe: none 或 noop(避免不必要的排序)
# HDD: deadline 或 bfq(减少寻道时间)
# 对于 NVMe SSD,使用 none 调度器
echo none > /sys/block/nvme0n1/queue/scheduler
# 对于 HDD,使用 deadline 调度器
echo deadline > /sys/block/sda/queue/scheduler
# 调整 deadline 参数(/etc/udev/rules.d/60-ioscheduler.rules)
# 增加读写超时
echo 500 > /sys/block/sda/queue/iosched/read_expire
echo 5000 > /sys/block/sda/queue/iosched/write_expire
4.2.2 使用 fio 进行 I/O 性能测试
# 安装 fio
sudo dnf install fio
# 随机读测试
fio --name=randread --ioengine=libaio --direct=1 --rw=randread --bs=4k --size=1G --numjobs=1 --runtime=30 --group_reporting
# 顺序写测试
fio --name=seqwrite --ioengine=libaio --direct=1 --rw=write --bs=1M --size=10G --numjobs=1 --runtime=30 --group_reporting
# 混合读写测试(模拟数据库负载)
fio --name=mixed --ioengine=libaio --direct=1 --rw=randrw --rwmixread=70 --bs=8k --size=10G --numjobs=4 --runtime=60 --group_reporting
# 生成测试配置文件
cat > fio-test.fio << 'EOF'
[global]
ioengine=libaio
direct=1
runtime=60
group_reporting
[randread]
rw=randread
bs=4k
size=1G
numjobs=4
[seqwrite]
rw=write
bs=1M
size=10G
numjobs=1
[mixed]
rw=randrw
rwmixread=70
bs=8k
size=10G
numjobs=4
EOF
fio fio-test.fio
4.3 RAID 配置优化
4.3.1 硬件 RAID 优化
# 查看 RAID 卡信息
lspci | grep -i raid
megacli -AdpAllInfo -aALL
# 调整 RAID 卡缓存策略
# 写缓存策略(Write-Back vs Write-Through)
megacli -LDSetProp -Cached -WB -Direct -a0 # 启用写回缓存
# 调整预读策略
megacli -LDSetProp -RAID -Cached -a0 # 启用预读
# 调整缓存大小(如果支持)
megacli -LDSetProp -Cached -CachedPd -a0
4.3.2 软件 RAID(mdadm)优化
# 创建 RAID 10
mdadm --create /dev/md0 --level=10 --raid-devices=4 /dev/sd[b-e]
# 优化 RAID 10 参数
echo 1024 > /sys/block/md0/md/stripe_cache_size # 增加条带缓存
# 调整 RAID 重建速度
echo 50000 > /sys/block/md0/md/sync_speed_min # 最小重建速度(KB/s)
echo 200000 > /sys/block/md0/md/sync_speed_max # 最大重建速度(KB/s)
# 监控 RAID 状态
cat /proc/mdstat
mdadm --detail /dev/md0
第五章:网络性能优化
5.1 网络栈深度调优
5.1.1 TCP 参数优化
# /etc/sysctl.conf 网络优化配置
# 增大 TCP 连接队列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 优化 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 Fast Open
net.ipv4.tcp_fastopen = 3
# 减少 TIME_WAIT 连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
# 增大端口范围
net.ipv4.ip_local_port_range = 1024 65535
# TCP 拥塞控制算法选择
# cubic: 默认,适合大多数场景
# bbr: Google 的 BBR 算法,适合高延迟网络
net.ipv4.tcp_congestion_control = bbr
# 启用 TCP 拥塞窗口缩放
net.ipv4.tcp_window_scaling = 1
5.1.2 网络接口优化
# 查看网卡信息
ethtool eth0
# 调整网卡参数
# 启用多队列(RSS)
ethtool -L eth0 combined 8 # 设置 8 个队列
# 调整接收/发送缓冲区
ethtool -G eth0 rx 4096 tx 4096
# 启用 TCP Segmentation Offload (TSO)
ethtool -K eth0 tso on
# 启用 Generic Receive Offload (GRO)
ethtool -K eth0 gro on
# 启用 Large Receive Offload (LRO)
ethtool -K eth0 lro on
# 永久设置(创建 udev 规则)
cat > /etc/udev/rules.d/99-network.rules << 'EOF'
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -L %k combined 8"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -G %k rx 4096 tx 4096"
ACTION=="add", SUBSYSTEM=="net", KERNEL=="eth*", RUN+="/usr/bin/ethtool -K %k tso on gro on"
EOF
5.2 网络性能测试
5.2.1 使用 iperf3 进行吞吐量测试
# 服务器端
iperf3 -s -p 5201
# 客户端测试
# 单线程测试
iperf3 -c <服务器IP> -p 5201 -t 30
# 多线程测试(模拟高并发)
iperf3 -c <服务器IP> -p 5201 -t 30 -P 10
# 反向测试(服务器到客户端)
iperf3 -c <服务器IP> -p 5201 -t 30 -R
# 使用 UDP 测试
iperf3 -c <服务器IP> -p 5201 -t 30 -u -b 1G
5.2.2 使用 netperf 进行延迟测试
# 安装 netperf
sudo dnf install netperf
# 服务器端
netserver
# 客户端测试
# TCP 流测试
netperf -H <服务器IP> -t TCP_STREAM
# TCP 请求/响应测试
netperf -H <服务器IP> -t TCP_RR
# UDP 流测试
netperf -H <服务器IP> -t UDP_STREAM
5.3 网络监控工具
5.3.1 实时网络监控
# 使用 nload 查看实时带宽
nload
# 使用 iftop 查看连接级流量
iftop -i eth0
# 使用 iptraf-ng 查看详细统计
iptraf-ng
# 使用 ss 查看连接状态
ss -tunap
# 使用 netstat 查看网络统计
netstat -s
5.3.2 网络流量分析
# 使用 tcpdump 捕获流量
tcpdump -i eth0 -w capture.pcap
# 使用 Wireshark 分析(需要图形界面)
wireshark capture.pcap
# 使用 tshark 命令行分析
tshark -r capture.pcap -z "io,stat,1"
# 使用 bmon 查看带宽使用情况
bmon
第六章:容器环境优化
6.1 Docker 容器优化
6.1.1 Docker 守护进程优化
# 编辑 Docker 守护进程配置
cat > /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"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65536,
"Soft": 65536
}
},
"live-restore": true,
"max-concurrent-downloads": 3,
"max-concurrent-uploads": 3,
"registry-mirrors": ["https://mirror.gcr.io"]
}
EOF
# 重启 Docker
systemctl restart docker
6.1.2 容器资源限制
# 运行容器时限制资源
docker run -d \
--name myapp \
--cpus="2" \
--memory="4g" \
--memory-swap="8g" \
--memory-swappiness=0 \
--restart=unless-stopped \
myimage:latest
# 使用 cgroup 限制(更精细的控制)
docker run -d \
--name myapp \
--cpu-quota=50000 \
--cpu-period=100000 \
--memory="4g" \
--memory-reservation="3g" \
--memory-swap="8g" \
--kernel-memory="512m" \
myimage:latest
6.1.3 容器网络优化
# 使用 host 网络模式(减少网络开销)
docker run -d --network host myimage:latest
# 使用 macvlan 网络(直接暴露容器到物理网络)
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 macvlan0
docker run -d --network macvlan0 --ip=192.168.1.100 myimage:latest
# 使用 bridge 网络并优化
docker network create \
--driver bridge \
--subnet=172.18.0.0/16 \
--gateway=172.18.0.1 \
--opt com.docker.network.bridge.name=mybridge \
--opt com.docker.network.bridge.enable_icc=true \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
--opt com.docker.network.bridge.mtu=9000 \
mybridge
6.2 Kubernetes 优化
6.2.1 节点优化
# 调整 kubelet 参数
cat > /etc/systemd/system/kubelet.service.d/10-kubeadm.conf << 'EOF'
[Service]
Environment="KUBELET_EXTRA_ARGS=--max-pods=110 --system-reserved=cpu=500m,memory=1Gi --kube-reserved=cpu=500m,memory=1Gi --eviction-hard=nodefs.available<10%,nodefs.inodesFree<5%,imagefs.available<15%,memory.available<100Mi"
EOF
# 调整内核参数(/etc/sysctl.conf)
# 为 Kubernetes 优化
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
6.2.2 Pod 资源优化
# Kubernetes Pod 资源配置示例
apiVersion: v1
kind: Pod
metadata:
name: optimized-app
spec:
containers:
- name: app
image: myapp:latest
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
# 资源限制策略
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
# 健康检查
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
# 节点选择器
nodeSelector:
workload: "high-performance"
# 亲和性规则
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- myapp
topologyKey: "kubernetes.io/hostname"
6.2.3 CNI 插件优化
# 使用 Cilium 作为 CNI(高性能网络)
# 安装 Cilium
kubectl create -f https://raw.githubusercontent.com/cilium/cilium/main/install/kubernetes/quick-install.yaml
# 配置 Cilium 优化
cat > cilium-config.yaml << 'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
name: cilium-config
namespace: kube-system
data:
# 启用 eBPF 优化
enable-bpf-masquerade: "true"
enable-host-legacy-routing: "false"
# 调整连接跟踪
conntrack-gc-interval: "0s"
# 启用带宽管理
enable-bandwidth-manager: "true"
# 调整资源限制
bpf-ct-global-tcp-max: "1000000"
bpf-ct-global-any-max: "500000"
EOF
第七章:监控与告警
7.1 系统监控工具
7.1.1 Prometheus + Grafana 监控栈
# 安装 Prometheus
sudo dnf install prometheus
# 配置 Prometheus(/etc/prometheus/prometheus.yml)
cat > /etc/prometheus/prometheus.yml << 'EOF'
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
- job_name: 'docker'
static_configs:
- targets: ['localhost:9323']
- job_name: 'kubernetes'
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- default
EOF
# 安装 Node Exporter
sudo dnf install node_exporter
# 启动服务
systemctl enable --now prometheus node_exporter
7.1.2 使用 cAdvisor 监控容器
# 运行 cAdvisor
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
gcr.io/cadvisor/cadvisor:latest
7.2 日志管理
7.2.1 使用 ELK Stack
# 使用 Docker Compose 部署 ELK
cat > docker-compose.yml << 'EOF'
version: '3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.5.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
volumes:
- esdata:/usr/share/elasticsearch/data
logstash:
image: docker.elastic.co/logstash/logstash:8.5.0
ports:
- "5044:5044"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
kibana:
image: docker.elastic.co/kibana/kibana:8.5.0
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
volumes:
esdata:
EOF
# 启动
docker-compose up -d
7.3 告警配置
7.3.1 使用 Alertmanager
# 配置 Alertmanager(/etc/prometheus/alertmanager.yml)
cat > /etc/prometheus/alertmanager.yml << 'EOF'
global:
smtp_smarthost: 'smtp.gmail.com:587'
smtp_from: 'alert@yourdomain.com'
smtp_auth_username: 'your-email@gmail.com'
smtp_auth_password: 'your-password'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: 'admin@yourdomain.com'
subject: 'Alert: {{ .GroupLabels.alertname }}'
body: |
{{ range .Alerts }}
Alert: {{ .Annotations.summary }}
Description: {{ .Annotations.description }}
{{ end }}
EOF
第八章:实战案例
8.1 高并发 Web 服务器优化
8.1.1 Nginx 优化配置
# /etc/nginx/nginx.conf
user nginx;
worker_processes auto; # 自动设置为 CPU 核心数
worker_rlimit_nofile 65536; # 每个 worker 进程的最大文件描述符
events {
worker_connections 65536; # 每个 worker 的最大连接数
use epoll; # 使用 epoll 事件模型
multi_accept on; # 一次接受多个连接
}
http {
# 基础配置
sendfile on;
tcp_nopush on;
tcp_nodelay on;
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/javascript
application/xml+rss
application/json;
# 隐藏版本号
server_tokens off;
# 限制请求
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
# 日志优化
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main buffer=32k flush=1m;
error_log /var/log/nginx/error.log warn;
# 虚拟主机配置
server {
listen 80;
server_name _;
# 限制并发连接
limit_conn one 10;
# 位置配置
location / {
root /usr/share/nginx/html;
index index.html index.htm;
# 启用 HTTP/2
http2 on;
# 启用 Brotli 压缩(需要安装模块)
# brotli on;
# brotli_comp_level 6;
# brotli_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
}
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
}
8.1.2 PHP-FPM 优化
; /etc/php-fpm.d/www.conf
[www]
user = nginx
group = nginx
; 进程管理
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
php_admin_value[post_max_size] = 10M
php_admin_value[upload_max_filesize] = 10M
; 慢日志
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log
; 进程空闲时间
pm.process_idle_timeout = 10s
; 最大执行时间
max_execution_time = 30
request_terminate_timeout = 30
8.2 数据库服务器优化
8.2.1 PostgreSQL 优化
# /var/lib/pgsql/data/postgresql.conf
# 内存配置
shared_buffers = 16GB # 通常为总内存的 25%
effective_cache_size = 48GB # 通常为总内存的 75%
work_mem = 64MB # 每个查询的排序内存
maintenance_work_mem = 1GB # 维护操作内存
# 日志配置
log_min_duration_statement = 1000 # 记录慢查询
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on
# 检查点配置
checkpoint_timeout = 15min
max_wal_size = 4GB
min_wal_size = 1GB
# 并发配置
max_connections = 200
shared_preload_libraries = 'pg_stat_statements'
# 启用并行查询
max_parallel_workers_per_gather = 4
max_parallel_workers = 8
# 启用 WAL 归档(用于备份)
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/wal_archive/%f'
8.2.2 MySQL 优化
# /etc/my.cnf.d/server.cnf
[mysqld]
# 内存配置
innodb_buffer_pool_size = 16G # 通常为总内存的 70-80%
innodb_buffer_pool_instances = 8 # 缓冲池实例数
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M
# I/O 配置
innodb_flush_log_at_trx_commit = 2 # 平衡性能与数据安全
innodb_flush_method = O_DIRECT # 绕过文件系统缓存
innodb_file_per_table = ON
# 并发配置
innodb_thread_concurrency = 0 # 自动调整
innodb_read_io_threads = 8
innodb_write_io_threads = 8
# 查询缓存(MySQL 8.0 已移除,此处为旧版本)
# query_cache_type = 1
# query_cache_size = 64M
# 连接配置
max_connections = 200
thread_cache_size = 50
table_open_cache = 2000
# 慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
# 日志配置
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
expire_logs_days = 7
8.3 容器化应用优化
8.3.1 多阶段构建优化 Dockerfile
# 多阶段构建示例
# 第一阶段:构建阶段
FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
# 第二阶段:运行阶段
FROM alpine:3.17
WORKDIR /app
# 安装必要的工具(最小化)
RUN apk --no-cache add ca-certificates tzdata
# 复制构建产物
COPY --from=builder /app/main .
# 设置非 root 用户
RUN addgroup -g 1001 appgroup && \
adduser -D -u 1001 -G appgroup appuser
USER appuser
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1
# 启动命令
CMD ["./main"]
8.3.2 Kubernetes 资源优化配置
# Kubernetes Deployment 优化配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: optimized-app
labels:
app: optimized-app
spec:
replicas: 3
selector:
matchLabels:
app: optimized-app
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: optimized-app
spec:
# 节点选择器
nodeSelector:
workload: "high-performance"
# 亲和性规则
affinity:
# Pod 亲和性
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- optimized-app
topologyKey: "kubernetes.io/hostname"
# 节点亲和性
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-type
operator: In
values:
- compute-optimized
# 容忍度
tolerations:
- key: "dedicated"
operator: "Equal"
value: "compute"
effect: "NoSchedule"
# 容器配置
containers:
- name: app
image: myapp:latest
imagePullPolicy: IfNotPresent
# 资源限制
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
# 环境变量
env:
- name: JAVA_OPTS
value: "-Xms512m -Xmx512m -XX:+UseG1GC"
# 端口
ports:
- containerPort: 8080
name: http
# 健康检查
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
# 生命周期钩子
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo 'Container started' > /tmp/start.log"]
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 30"] # 给应用 30 秒优雅关闭
# 安全上下文
securityContext:
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
# 挂载卷
volumeMounts:
- name: config
mountPath: /etc/app/config
readOnly: true
# 初始化容器
initContainers:
- name: init-db
image: busybox:1.28
command: ['sh', '-c', 'until nslookup db; do echo waiting for db; sleep 2; done;']
# 卷配置
volumes:
- name: config
configMap:
name: app-config
第九章:性能调优最佳实践
9.1 调优流程
- 基准测试:使用
sysbench、fio、iperf3等工具建立性能基线 - 监控分析:使用
perf、vmstat、iostat、netstat等工具分析瓶颈 - 参数调整:根据分析结果调整内核参数和应用配置
- 验证测试:重新运行基准测试,验证调优效果
- 持续监控:部署监控系统,持续跟踪性能变化
9.2 常见性能问题排查
9.2.1 CPU 使用率高
# 1. 查看哪个进程占用 CPU
top -p $(pgrep -d',' -f <process_name>)
# 2. 使用 perf 分析 CPU 热点
perf top -p <PID>
# 3. 检查上下文切换
vmstat 1
# 或
pidstat -w -p <PID> 1
# 4. 检查中断
cat /proc/interrupts
9.2.2 内存不足
# 1. 查看内存使用详情
cat /proc/meminfo
# 2. 查看进程内存使用
smem -s rss -r
# 3. 检查交换空间使用
vmstat 1
# 或
free -h
# 4. 检查内存泄漏
valgrind --leak-check=full ./your_program
9.2.3 I/O 瓶颈
# 1. 查看磁盘 I/O
iostat -x 1
# 2. 查看进程 I/O
iotop -o
# 3. 检查文件系统
df -h
# 或
du -sh /var/lib/* | sort -hr
# 4. 检查 RAID 状态
cat /proc/mdstat
# 或
megacli -LDInfo -Lall -aALL
9.2.4 网络问题
# 1. 查看网络连接
ss -tunap
# 或
netstat -tunap
# 2. 查看网络流量
iftop -i eth0
# 或
nload
# 3. 检查丢包
netstat -s | grep -i "drop"
# 或
cat /proc/net/dev
# 4. 检查网络延迟
ping -c 10 <目标IP>
# 或
mtr <目标IP>
9.3 性能调优工具箱
| 工具 | 用途 | 安装命令 |
|---|---|---|
sysbench |
综合性能测试 | sudo dnf install sysbench |
fio |
I/O 性能测试 | sudo dnf install fio |
iperf3 |
网络吞吐量测试 | sudo dnf install iperf3 |
perf |
CPU 性能分析 | sudo dnf install perf |
vmstat |
虚拟内存统计 | sudo dnf install sysstat |
iostat |
I/O 统计 | sudo dnf install sysstat |
netstat |
网络统计 | sudo dnf install net-tools |
ss |
套接字统计 | sudo dnf install iproute |
htop |
交互式进程监控 | sudo dnf install htop |
iotop |
I/O 进程监控 | sudo dnf install iotop |
iftop |
网络流量监控 | sudo dnf install iftop |
nload |
实时带宽监控 | sudo dnf install nload |
smem |
内存使用统计 | sudo dnf install smem |
pmap |
进程内存映射 | sudo dnf install psmisc |
valgrind |
内存泄漏检测 | sudo dnf install valgrind |
heaptrack |
堆分析 | sudo dnf install heaptrack |
strace |
系统调用跟踪 | sudo dnf install strace |
ltrace |
库函数跟踪 | sudo dnf install ltrace |
tcpdump |
网络抓包 | sudo dnf install tcpdump |
wireshark |
网络分析 | sudo dnf install wireshark |
tshark |
命令行网络分析 | sudo dnf install wireshark-cli |
bmon |
带宽监控 | sudo dnf install bmon |
iptraf-ng |
网络统计 | sudo dnf install iptraf-ng |
nmon |
综合监控 | sudo dnf install nmon |
dstat |
综合监控 | sudo dnf install dstat |
sar |
系统活动报告 | sudo dnf install sysstat |
pidstat |
进程统计 | sudo dnf install sysstat |
mpstat |
多核 CPU 统计 | sudo dnf install sysstat |
numactl |
NUMA 控制 | sudo dnf install numactl |
taskset |
CPU 亲和性 | sudo dnf install util-linux |
chrt |
实时调度 | sudo dnf install util-linux |
blktrace |
块设备跟踪 | sudo dnf install blktrace |
blkparse |
块设备解析 | sudo dnf install blktrace |
bpftrace |
eBPF 跟踪 | sudo dnf install bpftrace |
bcc |
eBPF 工具集 | sudo dnf install bcc-tools |
prometheus |
监控系统 | sudo dnf install prometheus |
node_exporter |
节点监控 | sudo dnf install node_exporter |
cadvisor |
容器监控 | docker run ... |
grafana |
可视化 | sudo dnf install grafana |
alertmanager |
告警管理 | sudo dnf install alertmanager |
第十章:总结
AlmaLinux 性能调优是一个持续的过程,需要根据具体业务场景和硬件配置进行调整。本文从内核参数、CPU、内存、磁盘 I/O、网络、容器环境等多个维度提供了详细的调优指南和实战案例。
关键要点:
- 基准测试先行:任何调优前都应建立性能基线
- 监控驱动优化:使用监控工具识别瓶颈,针对性调整
- 渐进式调整:每次只调整一个参数,验证效果后再继续
- 文档化:记录所有调整和效果,便于回滚和复盘
- 持续优化:性能调优不是一次性工作,需要持续监控和调整
推荐的调优顺序:
- 应用层优化:优化应用代码和配置
- 系统层优化:调整内核参数和系统配置
- 硬件层优化:升级硬件或调整硬件配置
- 架构层优化:考虑分布式架构或负载均衡
通过本文的指南,您应该能够系统地优化 AlmaLinux 系统的性能,满足不同业务场景的需求。记住,没有”一刀切”的调优方案,最佳实践是结合监控数据和业务需求,找到最适合您环境的配置。
