Open starnightcyber opened 1 month ago
https://github.com/al0ne/LinuxCheck/blob/bebca8ca774963526e2e39d59bce95373e7aa2c8/LinuxCheck.sh#L135-L140
计算逻辑问题: /proc/stat 文件中,CPU 时间是以计时单位(jiffies)提供的,各列分别代表不同状态的累计时间。不能简单地加和然后除来计算 CPU 使用率。导致这种计算值偏差太大。
下面的代码是 GPT 写的,供参考 :)
cpu_use() { echo "CPU Core | Usage % | Idle %" echo "---------|---------|-------" # 读取 CPU 数据前的延迟 sleep_duration=0.1 # 第一次读取 /proc/stat 并获取初始值 read prev_idle prev_total < <(awk '/^cpu /{print $5, $2+$3+$4+$5+$6+$7+$8+$9+$10+$11}' /proc/stat) sleep $sleep_duration # 第二次读取 /proc/stat 并获取新值 read idle total < <(awk '/^cpu /{print $5, $2+$3+$4+$5+$6+$7+$8+$9+$10+$11}' /proc/stat) # 计算差异和 CPU 使用率 idle_diff=$((idle - prev_idle)) total_diff=$((total - prev_total)) usage=$(awk -v total_diff="$total_diff" -v idle_diff="$idle_diff" 'BEGIN {printf "%.2f", (100 * (total_diff - idle_diff) / total_diff)}') idle_rate=$(awk -v idle_diff="$idle_diff" -v total_diff="$total_diff" 'BEGIN {printf "%.2f", (100 * idle_diff / total_diff)}') echo "Overall | $usage% | $idle_rate%" # 对每个 CPU 核心进行相同的操作 cpu_count=$(grep -c '^processor' /proc/cpuinfo) for ((i=0; i<cpu_count; i++)); do read prev_idle prev_total < <(awk -v cpu_id="$i" '/^cpu[0-9]+/{if (NR == cpu_id+2) print $5, $2+$3+$4+$5+$6+$7+$8+$9+$10+$11}' /proc/stat) sleep $sleep_duration read idle total < <(awk -v cpu_id="$i" '/^cpu[0-9]+/{if (NR == cpu_id+2) print $5, $2+$3+$4+$5+$6+$7+$8+$9+$10+$11}' /proc/stat) idle_diff=$((idle - prev_idle)) total_diff=$((total - prev_total)) usage=$(awk -v total_diff="$total_diff" -v idle_diff="$idle_diff" 'BEGIN {printf "%.2f", (100 * (total_diff - idle_diff) / total_diff)}') idle_rate=$(awk -v idle_diff="$idle_diff" -v total_diff="$total_diff" 'BEGIN {printf "%.2f", (100 * idle_diff / total_diff)}') echo "CPU$i | $usage% | $idle_rate%" done }
print_msg 大大简化了代码,采用 markdown 进行输出简直就是格式的救星
https://github.com/al0ne/LinuxCheck/blob/bebca8ca774963526e2e39d59bce95373e7aa2c8/LinuxCheck.sh#L135-L140
计算逻辑问题: /proc/stat 文件中,CPU 时间是以计时单位(jiffies)提供的,各列分别代表不同状态的累计时间。不能简单地加和然后除来计算 CPU 使用率。导致这种计算值偏差太大。
下面的代码是 GPT 写的,供参考 :)