Warum funktioniert dies nicht, wenn der Lastdurchschnitt über 1 liegt?

Warum funktioniert dies nicht, wenn der Lastdurchschnitt über 1 liegt?

Ich habe getestetdieses Skriptund sein Verhalten war merkwürdig. Das Skript sollte Benachrichtigungen generieren, wenn die durchschnittliche Auslastung einen angegebenen Grenzwert überschreitet.

Wenn ich einen CPU_LOAD_LMT >=60 übergebe, wird keine Benachrichtigung generiert, wenn die durchschnittliche Auslastung 2 * 0,6 oder 1,20 überschreitet (2, da mein System 2 Kerne hat, siehe unten). Es scheint nichts mit dem Skript nicht in Ordnung zu sein, da BenachrichtigungenSindgeneriert, bis ich 50 erreiche.

Die CPU_LOAD_LMT wird mit der Anzahl der Kerne ( nprocs) multipliziert und dann mit 100 * durchschnittlicher Auslastung verglichen.

Hier ist der relevante Teil des Codes.

   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      

Was könnte der Grund sein?

Antwort1

Diese Version, die ich leicht modifiziert habe, scheint gut zu funktionieren. Ich habe sie genannt 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

Beispielausführungen

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

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

Antwort2

Danke an @Gilles, ich habe endlich gesehen, was schiefgelaufen ist!

In dieser Zeile load=$CPU_LOAD_TIMEwollte ich entweder oder extrahieren , $1abhängig vom über Befehlszeilenparameter festgelegten Wert (der 1, 2 (oder 5) oder 3 (oder 15) wäre).$2$3CPU_LOAD_TIME

Dies geschah natürlich nicht. Während des anfänglichen Tests habe ich nur nach hohen Lasten gesucht, die meist über 2,00 durchschnittliche Last lagen. Daher habe ich dies nicht bemerkt, da sich das Skript wie vorgesehen verhielt (Benachrichtigungen generierte).

ich machtezwei Änderungenund jetzt wird das Skript bei den richtigen Werten ausgelöst (zur Sicherheit sowohl bei steigender als auch bei fallender Last getestet). Dies ist die wichtigste Änderung:

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

verwandte Informationen