Linux 服务性能优化与调优实战:CPU、内存、磁盘、网络全栈优化
一、性能诊断方法论与黄金指标
USE 方法(Utilization、Saturation、Errors):
- Utilization:资源利用率(CPU 80% 以上为高)
RED 方法(适用于服务):
核心诊断工具链:
# 基础工具
top/htop、iotop、iftop、ss、netstat
# 进阶工具
sar(sysstat)、perf、ftrace、bcc(eBPF)、flamegraph
# 监控集成
Prometheus + node_exporter + Grafana
系统负载查看:
uptime
cat /proc/loadavg
vmstat 1 10
iostat -x 1
二、CPU 性能优化实战
1. CPU 诊断命令
top -c -o %CPU # 按 CPU 使用排序
mpstat -P ALL 1 # 每核 CPU 使用率
pidstat -u 1 # 进程 CPU 统计
perf top # 实时采样
2. CPU 亲和性与调度优化 在 Systemd 服务中绑定 CPU:
[Service]
AllowedCPUs=0-7,16-23 # 绑定到特定核
CPUQuota=300% # 限制 3 核
CPUShares=2048 # 提高优先级
3. 内核参数调优(/etc/sysctl.conf)
kernel.sched_autogroup_enabled=1
kernel.sched_migration_cost_ns=5000000
vm.stat_interval=10
4. 中断亲和性优化(IRQ Balance)
systemctl enable --now irqbalance
# 或手动绑定
echo"1" > /proc/irq/XX/smp_affinity_list
生产案例:Nginx 高并发时,使用 taskset 或 Systemd AllowedCPUs 将 worker 进程绑定到不同 NUMA 节点,降低跨 NUMA 访问延迟。
三、内存优化与 OOM 防控
1. 内存诊断
free -h
cat /proc/meminfo
vmstat 1
sar -r 1
关键指标:
2. Systemd 内存控制
[Service]
MemoryMax=8G
MemoryHigh=6G
MemorySwapMax=2G
OOMPolicy=continue # 推荐重要服务
OOMScoreAdjust=-200 # 降低被 Kill 优先级
3. 内核内存参数
vm.swappiness=10 # 降低 Swap 使用倾向
vm.vfs_cache_pressure=50 # 倾向回收目录缓存
vm.overcommit_memory=1 # 允许适度 overcommit
vm.dirty_ratio=5
vm.dirty_background_ratio=2
4. 内存泄漏排查
valgrind --tool=memcheck ./app
# 或使用 heaptrack、perf mem
生产技巧:对 Java 服务调整 -Xmx 与容器内存限制保持一致;对 Redis 设置 maxmemory 并配置淘汰策略(allkeys-lru)。
四、磁盘与 IO 优化
1. IO 诊断
iotop -o
iostat -x 1 10
fio --name=test --filename=/dev/nvme0n1 --rw=randrw --bs=4k --numjobs=4
2. IO Scheduler 选择
# 查看当前调度器
cat /sys/block/nvme0n1/queue/scheduler
# 设置为多队列(mq-deadline 或 none)
echo"none" > /sys/block/nvme0n1/queue/scheduler
3. 文件系统优化(ext4 / xfs)
# 挂载参数
mount -o noatime,nodiratime,barrier=0 /dev/nvme0n1 /data
# XFS 推荐
mkfs.xfs -f -i size=512 /dev/nvme0n1
4. Systemd IO 控制
[Service]
IOWeight=900 # 数据库提高权重
IOReadBandwidthMax=/dev/nvme0n1 200M
IOWriteBandwidthMax=/dev/nvme0n1 150M
生产建议:数据库使用独立 NVMe 盘 + RAID10;日志分区使用 HDD + 单独 Slice 低 IOWeight,避免影响业务 IO。
五、网络性能优化
1. 网络诊断
ss -s
netstat -s | grep -i retrans
sar -n DEV 1
tcpdump -i eth0 -c 100 port 80
2. 核心 sysctl 网络参数
net.core.somaxconn=65535
net.core.netdev_max_backlog=5000
net.ipv4.tcp_max_syn_backlog=8192
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=15
net.ipv4.tcp_keepalive_time=300
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.ip_local_port_range=1024 65535
3. NIC 优化(多队列、RSS)
ethtool -L eth0 combined 8
ethtool -C eth0 rx-usecs 50
4. HAProxy / Nginx 网络调优
生产案例:高并发 API 服务通过增大 somaxconn + tcp_max_syn_backlog + Nginx worker_connections,将 QPS 从 8000 提升至 25000+。
六、综合性能工具与火焰图
1. perf + FlameGraph
perf record -F 99 -p $(pgrep nginx) -g -- sleep 30
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > nginx.svg
2. eBPF 工具(bcc)
# 安装 bcc-tools
execsnoop
biolatency
biosnoop
3. Grafana + Prometheus 全栈监控
- CPU:node_cpu_seconds_total
- 内存:node_memory_MemAvailable_bytes
- IO:node_disk_io_time_seconds_total
- 网络:node_network_receive_bytes_total
七、生产环境性能优化最佳实践
- 应用代码 → 数据库查询 → 缓存 → 系统内核 → 硬件
八、常见性能瓶颈排查案例
案例1:CPU 上下文切换过高 症状:cs 值极高,负载高但 CPU 使用率不高。 解决:减少线程数、使用线程池、优化锁争用。
案例2:内存缓存命中率低 解决:增大 innodb_buffer_pool_size 或调整 vm.vfs_cache_pressure。
案例3:磁盘 util 100% 解决:更换 SSD、使用 RAID 10、分离日志与数据盘、优化 IO Scheduler。
案例4:TCP 重传率高 解决:检查 MTU、网卡驱动、增加 backlog、优化 keepalive。
案例5:服务启动后逐渐变慢 解决:内存泄漏(监控 resident memory)、连接池耗尽、日志刷盘过频。