Por que esse script bash está disparando tantos falsos positivos para monitorar o uso de memória?

Por que esse script bash está disparando tantos falsos positivos para monitorar o uso de memória?

Estou monitorando centenas de servidores dedicados e virtuais usando o seguinte script:

#!/bin/bash

PATH=/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

threshold=90

serverip=$($(which ifconfig) | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1' | head -1)
memused=$(free | awk '/Mem/{printf("RAM Usage: %.2f%\n"), $3/$2*100}' |  awk '{print $3}' | cut -d"." -f1)

if [ "$memused" -gt "$threshold" ]
then
    CTIME=$(date +%Y-%m-%d-%H%M%S)
    ps aux > /root/.example/logs/lowmem-"${CTIME}"-ps.log
    top -n 1 -o %MEM -c > /root/.example/logs/lowmem-"${CTIME}"-top.log
    free -m > /root/.example/logs/lowmem-"${CTIME}"-free.log
    mysqladmin proc -v status > /root/.example/logs/lowmem-"${CTIME}"-mysqlproc.log
    bash /example/general/slack.sh "#server-alerts" ":warning: $(hostname) -  ${serverip} - Memory Usage has reached 90% - Check logs /root/.example/logs/lowmem-${CTIME} \n \`\`\`$(head -1 /root/.example/logs/lowmem-"${CTIME}"-free.log) \n $(head -2 /root/.example/logs/lowmem-"${CTIME}"-free.log | tail -1) \n $(tail -1 /root/.example/logs/lowmem-"${CTIME}"-free.log)\`\`\`"
    crontab -l | grep -v '/example/mon_mem.sh' | crontab -
    sleep 900
    crontab -l | { cat; echo "* * * * * bash /example/mon_mem.sh"; } | crontab -
fi

Embora funcione na maioria dos casos, estamos obtendo falsos positivos aleatoriamente, seus servidores são completamente aleatórios e não são consistentes com cada servidor, então um servidor pode ser acionado, mas nunca mais acionado (falsamente)

Exemplo de falso positivo:

total used free shared buff/cache available 
Mem: 2048 345 1580 27 122 1674 
Swap: 2048 0 2048

Um alerta chegou deste servidor, mas você pode ver que apenas 345 MB estavam em uso.

Responder1

3 problemas:

  1. Você está ligando freeduas vezes: uma vez pordesencadeandoo aviso, uma vez para envio do relatório. Os números terão mudado no meio. Armazene a saída (em uma variável) e recupere os mesmos dados duas vezes.

  2. "Memoria usadadeveaproximar-se da quantidade total de memória, e "livre" deve aproximar-se de zero, sempre. Se você temnão utilizadomemória, isso significa que você desperdiçou recursos que deveriam, embora não alocados, pelo menos servir como caches.

    Eu recomendo que você altere a memusedlinha que atualmente compara a segunda com a terceira coluna ( $3/$2) para comparar a primeira com a última coluna.

  3. Seu método de entrega de mensagens parece perder a formatação. Talvez você queira verificar seu método de entrega (slack.sh) para renderizar sua entrada em monoespaço ou substituir tab&spaces por espaçadores apropriados.

    Esta é a aparência da tabela:

    total usado livre compartilhado bônus/cache disponível
    Memória: 2048 345 1580 27 122 1674
    Trocar: 2048 0 2048

    Ocincoos números começam com a memória "total" e, na verdade, odurarnúmero é aquele com o qual você deve se preocupar.

informação relacionada