4

我正在运行这个命令

grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'

然而它只输出像 0.99xxxx% 这样的东西

如果我进行 apt-get upgrade 或任何过程,我想它会超过 1%。即使运行 stress -c 1 也不会使它发生任何变化。

有没有办法准确记录 CPU 使用率?服务器有 1 个 vCPU。

需要每 5 秒生成一次此日志。

while sleep 5; do "code" >> logfile; done
4

3 回答 3

5

为什么cpu负载变化不超过百分之几?

因为/proc/stat自系统上次启动以来返回汇总的 CPU 负载统计信息,而不是实时的。如果您在重新启动后立即运行脚本,则只要 CPU 负载本身发生变化,报告的负载可能会发生显着变化。但是,脚本运行的时间越长,负载变化对显示值的影响就越小,一段时间后,该值将基本保持不变。

如果要计算负载/proc/stat而不使用已经可用的工具,则需要计算两个连续样本的差异,例如:

while sleep 5; do grep -w cpu /proc/stat ; done | \
    awk '{
        print (o2+o4-$2-$4)*100/(o2+o4+o5-$2-$4-$5) "%"
        o2=$2;o4=$4;o5=$5}'

否则,更简单但不太准确的方法可能是:

vmstat -n 5 | \
    awk '{used=$13+$14;total=used+$15
          if(total>0) print used*100/total "%"}'
于 2015-08-15T22:24:48.537 回答
2

如果要记录最高 cpu 百分比(即查询时刻 cpu 使用率最高的进程),可以使用:

ps -e -o %cpu | tail -n +2 | sort -r | head -n 1 > cpu-usage.log

命令解释:

  • ps -e -o %cpu以输出格式为您提供e非常进程的进程信息,仅包含cpu使用百分比

  • tail -n +2从第二行开始过滤前一个输出(因此忽略打印的标题ps

  • sort -r以相反的顺序对值进行排序(最高优先)

  • head -n 1过滤返回的数据,sort因此您丢弃除第一行之外的所有数据

于 2015-08-15T21:01:02.923 回答
0

为我自己的用途稍微修改了#3:

for x in $(seq 1 11);do sleep 5;grep -w cpu /proc/stat ; done | \
awk '{
    print (o2+o4-$2-$4)*100/(o2+o4+o5-$2-$4-$5) "%"
    o2=$2;o4=$4;o5=$5}'

其中 seq 是采集的样本数, Sleep 仍然是样本之间的时间长度

于 2016-04-11T09:07:23.527 回答