甲骨文云 VPS 运行 Docker 容器 CPU 占用过高怎么排查?

文章导读
先说结论:甲骨文云 VPS Docker CPU 过高,通常是容器内应用死循环、挖矿病毒或未限制资源。优先通过 docker stats 定位,结合甲骨文控制台监控验证,必要时限制资源但需注意业务影响。
📋 目录
  1. 1. 确认宿主机负载与甲骨文控制台监控
  2. 2. 定位高占用容器
  3. 3. 进入容器内部排查
  4. 4. 设置资源限制(含风险提示)
  5. 5. 验证与防御
  6. 常见坑与注意事项
A A

先说结论:甲骨文云 VPS Docker CPU 过高,通常是容器内应用死循环、挖矿病毒或未限制资源。优先通过 docker stats 定位,结合甲骨文控制台监控验证,必要时限制资源但需注意业务影响。

  • 定位:docker stats 找出 CPU 最高的容器。
  • 排查:进入容器 top 查看进程,Java 应用用 jstack 分析线程。
  • 限制:docker update `--cpus` 限制配额,但可能导致服务超时。
  • 验证:观察 docker stats 数值及甲骨文控制台监控图表。

1. 确认宿主机负载与甲骨文控制台监控

先在宿主机确认整体负载,同时登录甲骨文云控制台核对监控数据,排除实例本身性能波动(尤其是 ARM 免费实例)。

宿主机命令:

uptime
# 输出示例:
# 10:30:05 up 10 days,  2:00,  1 user,  load average: 4.50, 3.20, 2.10

若 load average 持续高于 CPU 核心数,说明负载过高。登录 甲骨文云控制台 -> 实例详情 -> 监控,查看 CPU 利用率图表。若控制台显示 CPU 已满但宿主机 top 找不到对应进程,可能是实例规格限制(如 Always Free ARM 实例共享核心性能波动)。

2. 定位高占用容器

使用 docker stats 查看实时资源占用,注意观察 CPU % 是否超过 100%(代表占用多核)。

甲骨文云 VPS 运行 Docker 容器 CPU 占用过高怎么排查?
docker stats `--no-stream`
# 输出示例:
# CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT
# a1b2c3d4e5f6   web-app   150.00%   500MiB / 1GiB
# b2c3d4e5f6a7   redis     0.05%     10MiB / 500MiB

找到 CPU % 持续居高不下的容器 ID。

3. 进入容器内部排查

进入容器内部查看具体进程。注意甲骨文 ARM 实例需使用 arm64 镜像,部分 amd64 工具可能无法运行。

docker exec -it <容器 ID> /bin/bash
# 容器内查看进程
top -H -p $(pgrep -f java)  # 如果是 Java 应用
# 或普通 top 按 P 排序

Java 应用线程分析:若发现 Java 进程占用高,导出线程栈分析死锁或密集计算。

# 查找 Java 进程 PID
jps -l
# 导出线程 dump
jstack -l <PID> > /tmp/thread_dump.txt

排查挖矿病毒:检查是否有未知进程名、连接异常外网 IP。检查定时任务 crontab -l。

甲骨文云 VPS 运行 Docker 容器 CPU 占用过高怎么排查?

4. 设置资源限制(含风险提示)

若应用无法立即优化,可临时限制 CPU 防止拖垮宿主机。但强制限制可能导致关键业务进程超时、请求堆积甚至崩溃,生产环境慎用。

docker update `--cpus`="1.0" <容器 ID>

注意命令格式,不要混用反引号。限制值建议根据实际核心数设定,如 2 核实例限制为 1.5 留有余量。

5. 验证与防御

验证生效:再次运行 docker stats,观察 CPU % 是否被限制在设定值附近。检查甲骨文控制台监控图表是否回落。

安全组配置:防止挖矿入侵,确保安全组仅开放必要端口(如 80/443),不要暴露 Docker API 端口(2375/2376)到公网。

常见坑与注意事项

  • ARM 架构差异:甲骨文免费层多为 ARM 实例,部分镜像不兼容,排查工具需适配 arm64。
  • 误判宿主机负载:有时是甲骨文监控 agent(osms)占用高,而非容器。
  • 限制过死:CPU 限制过低会导致应用响应变慢,需根据业务 QPS 调整。