
使用 Docker Java API 获取容器 CPU 使用率时,需启用非流式响应并正确应用公式 (cpuDelta / systemDelta) * 100,否则 getPercpuUsage() 为空且计算结果错误。
使用 docker java api 获取容器 cpu 使用率时,需启用非流式响应并正确应用公式 `(cpudelta / systemdelta) * 100`,否则 `getpercpuusage()` 为空且计算结果错误。
在通过 Docker Java SDK(如 docker-java)调用 /containers/{id}/stats 接口获取实时资源统计时,默认行为是启用流式响应(streaming)。该模式下,Docker 守护进程持续推送 JSON 流,每条记录仅包含增量统计字段(如 cpu_usage.total_usage 和 system_cpu_usage),但不包含 percpu_usage 数组——这正是 getCpuUsage().getPercpuUsage() 恒为 null 的根本原因。
要获取完整、可比对的单次统计快照(含 percpu_usage),必须显式禁用流式传输:
// 正确示例:启用非流式响应
StatsCmd statsCmd = dockerClient.statsCmd(containerId);
statsCmd.exec(new StatsCallback() {
@Override
public void onNext(Statistics stats) {
// 此处 stats 现在包含完整的 percpu_usage(非 null)
List<long> perCpuUsage = stats.getCpuStats()
.getCpuUsage()
.getPercpuUsage(); // ✅ 不再为 null
// 计算 CPU 百分比的正确公式(依据 Docker API v1.43 规范)
long cpuDelta = stats.getCpuStats().getCpuUsage().getTotalUsage()
- stats.getPreCpuStats().getCpuUsage().getTotalUsage();
long systemDelta = stats.getCpuStats().getSystemCpuUsage()
- stats.getPreCpuStats().getSystemCpuUsage();
if (cpuDelta > 0 && systemDelta > 0 && perCpuUsage != null) {
int cpuCount = perCpuUsage.size(); // 实际逻辑 CPU 核心数
float cpuPercent = (float) cpuDelta / systemDelta * 100.0f;
System.out.printf("CPU Usage: %.2f%% (cores: %d)%n", cpuPercent, cpuCount);
}
}
}).withNoStream(true); // ⚠️ 关键:必须设置!</long>
✅ 关键要点总结:
withNoStream(true)是启用完整统计字段(包括percpu_usage)的前提;- CPU 使用率标准公式为
(cpuDelta / systemDelta) × 100,不是(cpuDelta − systemDelta)—— 后者无物理意义且必然导致负值或溢出;percpu_usage.size()可用于动态获取宿主机逻辑 CPU 核心数,但计算百分比时无需乘以该值(Docker 已在total_usage和system_cpu_usage中按核心数归一化);- 首次统计无
pre_cpu_stats,应跳过首帧或做空值校验;- 建议在生产环境添加
try-catch处理NullPointerException和ArithmeticException(如systemDelta == 0)。
遵循以上配置与公式,即可稳定、准确地从 Docker Java API 获取容器级 CPU 使用率。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











