為什麼當平均負載超過 1 時這不起作用?

為什麼當平均負載超過 1 時這不起作用?

我一直在測試這個腳本它的行為很奇怪。每當平均負載超過指定限制時,腳本應產生通知。

每當我傳遞 CPU_LOAD_LMT >=60 時,只要負載平均值超過 2 * 0.6 或 1.20(2,因為我的系統有 2 個核心,如下所述),就不會產生通知。自從收到通知以來,腳本似乎沒有任何問題生成直到我通過 50。

CPU_LOAD_LMT 乘以核心數 ( nprocs),然後與 100 * 負載平均值進行比較。

這是程式碼的相關部分。

   list=`cat /proc/loadavg`
   set -- $list

   load=$CPU_LOAD_TIME #Extract required cpu load        
   load=`echo "scale=2; $load * 100" | bc` #Convert to integer
   load=`printf "%.0f" $load` #Remove decimal digits

    highload=$((`nproc`*$CPU_LOAD_LMT)) #Calculate high load threshold based on number of cores

    if test $load -ge $highload
    then

        if [ "YES" == $AUDIO ] 
        then
             paplay /usr/share/sounds/ubuntu/stereo/system-ready.ogg &
        fi

        #Generates visual notification
        if [ "YES" == $GRAPHICAL ]
        then
            notify-send -i /usr/share/icons/default.kde4/128x128/devices/cpu.png "High CPU Load"'!' \
            "The CPU has been hard at work in the past minute." #No support for timeouts. Default is 5 seconds.
        fi      

可能是什麼原因?

答案1

我稍微修改過的這個版本似乎運作得很好。我叫它load.bash

#!/bin/bash

CPU_LOAD_TIME=$1
CPU_LOAD_LMT=$2

list=$(cat /proc/loadavg)
set -- $list

load=$CPU_LOAD_TIME #Extract required cpu load
load=$(echo "scale=2; $load * 100" | bc) #Convert to integer
load=$(printf "%.0f" $load) #Remove decimal digits

highload=$((`nproc`*$CPU_LOAD_LMT)) #Calculate high load threshold 
                                    #based on number of cores

printf "LOAD: %s | HLOAD: %s\n" $load $highload
if test $load -ge $highload
then
  echo "ge"
else
  echo "le"
fi

運行範例

$ ./load.bash 10 100
LOAD: 1000 | HLOAD: 400
ge

$ ./load.bash 1 1000
LOAD: 100 | HLOAD: 4000
le

答案2

感謝@Gilles,我終於看到出了什麼問題!

在該行中,load=$CPU_LOAD_TIME我的目的是提取$1,$2或 ,這取決於透過命令列參數設定$3的值(這將是 1,2 (或 5)或 3 (或 15))。CPU_LOAD_TIME

這當然沒有發生。在最初測試時,我只檢查高負載(大多超過 2.00 平均負載),因此我沒有發現這一點,因為腳本的行為符合預期(產生通知)。

我做了兩個變化現在腳本在正確的值處觸發(在增加和減少負載上進行測試,只是為了確保)。這是主要的變化:

   case $CPU_LOAD_TIME in
      15)load=$3;;
      5) load=$2;;
      *) load=$1;;
   esac

相關內容