返回首页

Linux 系统调优实战 — 接口响应从 500ms 降到 100ms 全复盘

📅 创建于 2026-05-13 🔄 更新于 2026-05-13 📝 586 字

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 压力解读