You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过API获取CPU使用率失败及计算偏差问题求助

问题分析与解决方案

核心问题

当前脚本错误使用单个时间点的累计CPU时间计算使用率,而DigitalOcean提供的CPU指标是系统启动以来的累计jiffies值,正确计算需基于时间区间内的数值差值。

修正步骤

1. 提取时间区间内的数值差值

修改jq命令,分别提取每个CPU模式在起始、结束时间点的数值,计算差值后汇总:

# 调用API获取监控数据
response=$(curl -s -X GET -H 'Content-Type: application/json' -H 'Authorization: Bearer token' "$api_endpoint")

# 计算总CPU时间的区间差值
total_diff=$(echo "$response" | jq -r '[.data.result[] | (.values[1][1] | tonumber) - (.values[0][1] | tonumber)] | add')

# 计算空闲CPU时间的区间差值
idle_diff=$(echo "$response" | jq -r '[.data.result[] | select(.metric.mode == "idle") | (.values[1][1] | tonumber) - (.values[0][1] | tonumber)] | add')

2. 正确计算CPU使用率

用差值计算使用率,同时修复浮点运算的语法错误(全程用bc处理浮点计算):

# 计算已使用CPU时间的差值
used_diff=$(echo "scale=4; $total_diff - $idle_diff" | bc)

# 避免除以0,计算最终使用率
if (( $(echo "$total_diff > 0" | bc -l) )); then
    cpu_usage=$(echo "scale=2; ($used_diff / $total_diff) * 100" | bc)
    printf 'CPU Usage: %s%%\n' "$cpu_usage"
else
    echo "No valid CPU metrics data for the interval"
fi

3. 完整修正后的脚本

#!/bin/bash
set -euo pipefail

HOST_ID="390488586"
TOKEN="your_token_here"
INTERVAL=120  # 时间区间长度,单位秒

end_time=$(date +%s)
start_time=$((end_time - INTERVAL))
api_endpoint="https://api.digitalocean.com/v2/monitoring/metrics/droplet/cpu?host_id=$HOST_ID&start=$start_time&end=$end_time"

response=$(curl -s -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" "$api_endpoint")

# 计算总差值和空闲差值
total_diff=$(echo "$response" | jq -r '[.data.result[] | (.values[1][1]|tonumber) - (.values[0][1]|tonumber)] | add')
idle_diff=$(echo "$response" | jq -r '[.data.result[] | select(.metric.mode=="idle") | (.values[1][1]|tonumber) - (.values[0][1]|tonumber)] | add')

# 计算使用率
if (( $(echo "$total_diff > 0" | bc -l) )); then
    used_diff=$(echo "scale=4; $total_diff - $idle_diff" | bc)
    cpu_usage=$(echo "scale=2; ($used_diff / $total_diff) * 100" | bc)
    printf "CPU Usage: %s%%\n" "$cpu_usage"
else
    echo "No valid CPU metrics data for the interval"
fi

验证说明

基于你提供的API返回数据计算:

  • 空闲时间差值:353512.14 - 353393.29 = 118.85
  • 总CPU时间差值:120.02
  • 最终使用率:(120.02 - 118.85)/120.02 *100 ≈ 0.97%,符合实际低于1%的情况

内容的提问来源于stack exchange,提问作者serverstackqns

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:05:57