混合部署时需精准分配CPU核心:Tomcat预留N核则Nginx用剩余核心,通过worker_processes动态计算、worker_cpu_affinity绑定核心,并调优Tomcat线程池、连接器与JVM参数,最后用ps、top、mpstat验证隔离效果。

混合部署时,Nginx 和 Tomcat 共享同一台物理机的 CPU 资源,若不干预,两者 worker 进程可能在相同核心上频繁调度,引发上下文切换、缓存抖动和锁竞争,导致整体吞吐下降。关键不是“多开进程”,而是“精准分配”。
明确预留 CPU 核心给 Tomcat
先确认 Tomcat 实际可用的核心数:它通常不自动感知容器或 cgroup 限制,需人工对齐。例如,宿主机有 12 核,但通过 Kubernetes 设置了 resources.limits.cpu: "4",则 Tomcat 应按 4 核规划线程池与 JVM 参数;Nginx 就应主动让出这 4 核,只使用剩余核心。
- 用
nproc --all查宿主机总核数,再减去 Tomcat 预留数(如预留 4 核,则 Nginx 设为worker_processes 8) - 更稳妥写法是启动脚本中动态计算:
worker_processes $(($(nproc --all) - 4)); - 避免直接写死数字,防止迁移后配置失效
绑定 Nginx worker 到专属 CPU 核心
仅靠减少进程数还不够——Linux 调度器仍可能把 Nginx 的 worker 调度到 Tomcat 正在高负载运行的核心上。启用 worker_cpu_affinity 可强制隔离。
- 假设保留 CPU 0–3 给 Tomcat,则 Nginx 使用 4–11:
worker_cpu_affinity 00001111 00001111 11110000 11110000; - 每组 4 位对应一个 worker 进程,1 表示允许运行在该核,0 表示禁止
- 需配合
worker_processes 4使用(4 组二进制数),确保一一映射
协同调优 Tomcat 的线程与连接模型
Nginx 的优化效果受限于上游响应速度。若 Tomcat 因线程阻塞或连接池过小而延迟返回,Nginx worker 会长时间等待,变相放大 CPU 争抢。
- Tomcat 的
maxThreads建议设为预留核心数 × 2(如 4 核 → 8 线程),避免盲目堆高 - 禁用 BIO,启用 NIO 连接器,降低单请求 CPU 占用和 TIME_WAIT 积压
- JVM 添加
-XX:+UseParallelGC或-XX:+UseZGC(视 JDK 版本),减少 GC 停顿干扰 Nginx 调度
验证资源实际归属
配置生效后,不能只看 Nginx 启动日志。要确认隔离真实落地:
- 用
ps -eo pid,comm,psr | grep nginx查看各 worker 进程实际运行在哪颗 CPU 上(psr 列) - 用
top -p $(pgrep -f 'tomcat.*jvm')观察 Tomcat 进程 CPU 使用集中在哪些核 - 压力测试时对比
mpstat -P ALL 1输出,确认两组核心负载分离、无明显交叉峰值


















