当我top
在 ubuntu 系统上执行命令时,我看到以下结果
顶部 - 07:58:58 启动 1:21,1 个用户,平均负载:0.82、0.73、0.55 任务:总计 293 个,1 个正在运行,292 个正在休眠,0 个已停止,0 个僵尸 %Cpu(s):0.8 us,0.8 sy,...
我需要了解load average
和%cpu
。
我的理解基于我的知识和CPU 利用率高但平均负载低
平均负载
平均负载是衡量一段时间内内核运行队列中有多少任务在等待(不仅仅是 CPU 时间,还有磁盘活动)的指标。这是否意味着上述结果中 0.83 个任务正在等待?它怎么会是十进制数?另外,三个不同的数字又是什么意思0.83 0.73, 0.55
?
%中央处理器
这表示在过去 x 秒内 CPU 工作了多长时间。例如:- 如果 CPU 利用率显示 60%,则表示在过去 x 秒内 CPU 工作了 60% 的时间。我的理解正确吗?如果正确,那代表什么%Cpu(s): 0.8 us
?
另外,如果我有 4 个 CPU 处理器,并且 %CPU 显示 50%,这是否意味着所有核心都工作在 50% 或 2 个 CPU 工作在 100%?
答案1
了解平均负载:0.83、0.73、0.55
负载是系统执行的计算工作量的度量。这三个值是一段时间内的平均负载。时间间隔是最后 1 分钟、5 分钟和 15 分钟。平均负载计算为指数移动平均线。如果你愿意,你可以深入阅读检查平均负载
单核系统
平均负载值的范围各不相同。对于单核系统,该值
0.83
表示您的 CPU 在最后一分钟的容量为 83%。值为1.0
表示您的 CPU 容量正好为 100%。如果值为 ,1.0
即使只增加一点点额外的工作,系统也会超载。大于 的值1.0
表示系统负载超过了其处理能力。这并不坏,只是意味着更多的进程正在等待 CPU 时间。您会看到计算机运行缓慢。多核系统
对于多核系统,您可以将平均负载除以您拥有的核心数。例如,如果平均负载为
0.83
并且有 4 个核心,则您需要0.83 / 4
获得0.2075
或(0.83 / 4) * 100
以获得20.75%
容量。对于四核系统,如果平均负载等于 ,4.0
则表明所有核心的容量都为 100%,任何过载都会导致进程等待 CPU 时间。当您超出最大容量时,就会发生过载。负载平均值作为过载可能有点难以理解,因为它基于您的核心。如果您有四核 CPU,则在负载值超过之前不会过载。
4.0
如果第一个负载平均值为,5.50
则意味着您的系统过载 150%,并且平均而言,最后一分钟有 1.5 个进程必须等待 CPU 时间。
了解 %Cpu(s): 0.8us, 0.8sy....
此部分为展示如何CPU 的使用情况。每个后缀代表特定的东西,并表示 CPU 在该组任务上花费了多少时间。如果将该输出行中的所有数字相加,则总计为 100%。
任务定义为...来源
我们是 CPU 的百分比用户进程
西是 CPU 的百分比系统进程
你是具有优先级升级的 CPU 进程的百分比好的 妮复活节彩蛋
ID是 CPU 的百分比不曾用过
哇是等待的 CPU 进程的百分比I/O 操作
你好是 CPU 服务的百分比硬件中断
锡是 CPU 服务的百分比软件中断
英石在虚拟化环境中,部分 CPU 资源分配给每个虚拟机 (VM)。操作系统会检测何时有工作要做,但由于 CPU 在其他 VM 上繁忙,因此无法执行这些工作。以这种方式损失的时间量是偷时间
答案2
此脚本通过将平均负载除以 CPU 核心数来计算 1、5 和 15 分钟的系统负载百分比,并将结果转换为百分比(%)
# cat load_usage.sh
#!/bin/bash
Hostnames=$(uname -n | cut -d. -f1)
os_type=$(uname -s)
case "$os_type" in
Linux)
# Define color variables
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
NC="\033[0m" # No Color
cputhreshold=99.0
# Get the CPU load averages
load_avg_1min=$(uptime | awk -F'load average: ' '{print $2}' | cut -d ',' -f1 | tr -d ' ')
load_avg_5min=$(uptime | awk -F'load average: ' '{print $2}' | cut -d ',' -f2 | tr -d ' ')
load_avg_15min=$(uptime| awk -F'load average: ' '{print $2}' | cut -d ',' -f3 | tr -d ' ')
# Get the number of CPU cores
cpu_core=$(nproc)
# Calculate percentages
percentage_1min=$(echo "scale=2; ($load_avg_1min / $cpu_core) * 100" | bc)
percentage_5min=$(echo "scale=2; ($load_avg_5min / $cpu_core) * 100" | bc)
percentage_15min=$(echo "scale=2; ($load_avg_15min / $cpu_core) * 100" | bc)
if (( $(echo "$percentage_1min >= $cputhreshold" | bc -l) )); then
# Print the table header in a box
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
printf "| %-16s | %-17s | %-16s | %-14s | %-06s |\n" "HostName" "Time Intervals" "Load Average" "System Load (%)" "Status"
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
# Print the table rows
printf "| %-16s | %-17s | %-16s | %-15s | ${YELLOW}%-06s${NC} |\n" "" "1 minute" "$load_avg_1min" "$percentage_1min%" ""
printf "| %-16s | %-17s | %-16s | %-15s | ${YELLOW}%-06s${NC} |\n" "$Hostnames" "5 minutes" "$load_avg_5min" "$percentage_5min%" "High"
printf "| %-16s | %-17s | %-16s | %-15s | ${YELLOW}%-06s${NC} |\n" "" "15 minutes" "$load_avg_15min" "$percentage_15min%" ""
# Print the bottom border of the table box
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
else
# Print the table header in a box
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
printf "| %-16s | %-17s | %-16s | %-14s | %-06s |\n" "HostName" "Time Intervals" "Load Average" "System Load (%)" "Status"
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
# Print the table rows
printf "| %-16s | %-17s | %-16s | %-15s | ${GREEN}%-06s${NC} |\n" "" "1 minute" "$load_avg_1min" "$percentage_1min%" ""
printf "| %-16s | %-17s | %-16s | %-15s | ${GREEN}%-06s${NC} |\n" "$Hostnames" "5 minutes" "$load_avg_5min" "$percentage_5min%" "Normal"
printf "| %-16s | %-17s | %-16s | %-15s | ${GREEN}%-06s${NC} |\n" "" "15 minutes" "$load_avg_15min" "$percentage_15min%" ""
# Print the bottom border of the table box
printf "+------------------+-------------------+------------------+-----------------+--------+\n"
fi
;;
*)
echo -e "This script is not supported for $os_type - $Hostnames"
;;
esac