Linux 系统调优实战复盘
日均千万级请求的 Java 微服务,P99 响应 500ms+。通过两周 Linux 系统级深度调优,降至 100ms 以内。本文完整复盘从发现问题到解决问题的全流程。
架构与环境
| 组件 | 配置 |
|---|---|
| 应用 | Java Spring Boot 微服务,Docker 容器部署 |
| 服务器 | 阿里云 ECS,8 核 16G,CentOS 7.9 |
| 数据库 | MySQL 5.7,独立 RDS |
| 缓存 | Redis Cluster |
| 负载 | Nginx 反向代理 → 应用集群 |
调优方法论:USE 方法
| 维度 | Utilization(使用率) | Saturation(饱和度) | Errors(错误) |
|---|---|---|---|
| CPU | us/sy/wa/id 分布 | run queue 长度 | 调度失败 |
| 内存 | used/available | SWAP si/so | OOM Kill |
| 磁盘 | %util | avgqu-sz | IO error |
| 网络 | 带宽占用 | 连接队列/丢包 | 重传/超时 |
排查与调优路径
发现问题
# 确认瓶颈方向
top -bn1 | head -5
vmstat 1 10
sar -u -r -n DEV 1 10
初步诊断:CPU us% 和 sy% 都偏高、磁盘 iowait 偶发飙升、网络软中断占用高、SWAP 使用异常。
CPU 调优
问题: CPU 上下文切换过于频繁,每秒超过 10 万次。Java 线程数过多导致大量调度开销。
pidstat -w 1 5 # 确认上下文切换量
ps -eLf | grep java | wc -l # Java 线程数
优化:
- 调整 Tomcat 线程池
max-threads: 200(原来 500+) - Java
-XX:ParallelGCThreads=4限制 GC 线程 - CPU 亲和性绑定关键进程
- 开启
CONFIG_NO_HZ_FULL减少定时中断
内存调优
问题: SWAP 使用率 30%,频繁 swap in/out 拖慢响应。
free -h
vmstat 1 5 | awk '{print "si:"$7" so:"$8}'
优化:
vm.swappiness = 10(降低 swap 倾向)vm.vfs_cache_pressure = 50(保留 inode/dentry 缓存)- JVM
-Xmx设为容器的 75%,避免超出 cgroup limit - 清理 Page Cache 碎片
磁盘 IO 调优
问题: 日志文件疯狂写入,磁盘 %util 接近 100%。
iostat -xz 1 5
iotop -oP
优化:
- 日志级别从 DEBUG → INFO
- 日志异步写入(Logback AsyncAppender)
- 文件系统从 ext4 → xfs(并发写入性能更好)
- IO 调度器从 cfq → deadline(SSD 环境)
网络栈调优
问题: TIME-WAIT 连接数过万,短连接频繁。
ss -tan state time-wait | wc -l
netstat -s | grep -i retrans
优化:
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
应用层调优
JVM 参数优化:
-Xms4g -Xmx4g # 堆大小固定,避免动态扩缩
-XX:+UseG1GC # G1 垃圾回收器
-XX:MaxGCPauseMillis=100 # GC 暂停目标
-XX:+UseStringDeduplication # 字符串去重
-Djava.security.egd=file:/dev/urandom # 加速随机数生成
Spring Boot 配置:
server:
tomcat:
max-connections: 10000
threads:
max: 200
accept-count: 100
容器环境调优
# Docker daemon 配置
{
"log-driver": "json-file",
"log-opts": { "max-size": "10m", "max-file": "3" },
"default-ulimits": {
"nofile": { "Name": "nofile", "Hard": 65535, "Soft": 65535 }
}
}
容器内 JVM 正确识别 cgroup 限制(-XX:+UseContainerSupport,Java 10+ 默认开启)。
调优效果对比
| 指标 | 调优前 | 调优后 | 提升 |
|---|---|---|---|
| 接口 P50 响应 | 280ms | 45ms | ⬇️ 84% |
| 接口 P99 响应 | 520ms | 80ms | ⬇️ 85% |
| CPU 使用率 | 85% | 55% | ⬇️ 35% |
| 上下文切换 | 120K/s | 35K/s | ⬇️ 71% |
| SWAP 使用 | 30% | 0% | ✅ |
| TIME-WAIT | 12,000 | 800 | ⬇️ 93% |
| 磁盘 %util | 92% | 15% | ⬇️ 84% |
调优参数汇总
# /etc/sysctl.conf
vm.swappiness = 10
vm.vfs_cache_pressure = 50
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_tw_buckets = 5000
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
fs.file-max = 6553500
关联页面
| 页面 | 关联点 |
|---|---|
| server-performance-four-dimensions | 五维排查总纲(CPU/内存/磁盘/网络) |
| linux-kernel-tuning-production | 内核参数调优(sysctl 详解) |
| linux-memory-management-deep-dive | 内存管理深潜(swappiness/cache 压力) |
| linux-disk-io-tuning | 磁盘 IO 调优(调度器/文件系统) |
| linux-port-inspection-tools | 网络连接诊断(TIME-WAIT 排查) |
| fullstack-performance-troubleshooting | 全栈性能排障方法论 |
| jvm-container-oom-offheap-troubleshooting | JVM 堆外内存(DirectByteBuffer/Metaspace/线程栈)导致容器 OOMKi |
| k8s-java-memory-tuning-production-guide | Kubernetes 下 Java 内存调优完整指南 — 内存预算模型、生产参数配置、四层诊断流程、 |
| linux-load-average-guide | Load Average 与 CPU 压力解读 |