Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/05/2021, à 12:43

Gamma210

[résolu] Bash surveillance mémoire

Bonjour,

ca va peut-être sembler facile de poser la question mais je peine à trouver un moyen de mettre en pratique un tel bash et je ne suis pas très expérimenté pour des bashs plus compliqué que de simples commandes... et je dois avouer que je n'ai pas trop le temps d'y passer trop longtemps dans l'immédiat sans être aidé…
Si quelqu'un pouvait m'aider où m'orienter je lui en serait très reconnaissant.

Je m'explique...
Nous sommes plusieurs sur une machine et j'ai un job mpi qui prend beaucoup de mémoire et risque l'overload RAM et je ne peux pas estimer précisément par avance la mémoire nécessaire de mon programme.

J'aimerais écrire un bash avec une "simple" loop et une condition donc .
Si la mémoire utilisé dépasse XX % de mémoire ou une hard limite peut-importe, avec un check / seconde
j'aimerai envoyer la commande de kill de mon job pour éviter de faire crasher des job n'étant pas à moi.

Le point critique étant récupérer dans une variable la quantité mémoire RAM utilisé à l'instant x (donc la valeur obtenue dans la colonne "utilisé" de free -h).


Merci d'avance à ceux qui voudront bien m'aider.
cordialement,
Gamma

Dernière modification par Gamma210 (Le 21/05/2021, à 13:35)

Hors ligne

#2 Le 21/05/2021, à 13:07

pingouinux

Re : [résolu] Bash surveillance mémoire

Bonjour,

Gamma210 #1 a écrit :

Le point critique étant récupérer dans une variable la quantité mémoire RAM utilisé à l'instant x (donc la valeur obtenue dans la colonne "utilisé" de free -h).

Essaye ceci :

$ memoire=$(free -h | awk 'NR==2{print $3}')
$ echo $memoire
2,7G

Hors ligne

#3 Le 21/05/2021, à 13:34

Gamma210

Re : [résolu] Bash surveillance mémoire

Merci beaucoup ! Je ne maitrise absolument pas awk mais j'ai déjà pu voir que c'est une commande puissante, mais ne l'utilisant que très rarement avec des exemples "tout fait " assez compliqué j'ai du mal à l'assimiler...
Ta réponse m'aide à mieux la comprendre en passant ! Merci beaucoup encore !

ci-dessous le bash utilisé du coup :

#!/bin/bash

istop=0
memlim=225
memtot=$(free -g  | awk 'NR==2{print $2}')
echo "Total memory available (GB):" $memtot
echo "Memory threshold (GB):" $memlim

while [ $istop -eq 0 ]; do

mem=$(free -g  | awk 'NR==2{print $3}')
if [ $mem -gt $memlim ]; then
echo "MEMORY THRESHOLD REACHED, SEND KILL COMMAND"
killall -9 -u #process2kill#
istop=1
else
echo "Memory (GB):" $mem "/" $memlim 
istop=0
sleep 1
fi

done

Bonne journée,
Gamma !

Hors ligne

#4 Le 21/05/2021, à 14:22

pingouinux

Re : [résolu] Bash surveillance mémoire

free -g

arrondit au GBi inférieur, c'est-à-dire que tu peux dépasser le max fixé de 1073741823 bytes (1024**3-1).
Ce serait plus précis en bytes avec

free -b

.

Hors ligne

#5 Le 21/05/2021, à 15:16

Gamma210

Re : [résolu] Bash surveillance mémoire

Ok j'avais pu remarquer merci, j'ai définis une valeur seuil assez large, bien avant le giga de précision, dans tous les cas je n'irais pas frôler la limite hard de trop près

encore merci pour cette précisions tout de même, pour moi ou à qui ce post serait utile.

Gamma

Hors ligne

#6 Le 21/05/2021, à 22:48

kamaris

Re : [résolu] Bash surveillance mémoire

Plutôt que d'appeler free et awk à chaque itération, tu peux les appeler une seule fois en laissant free gérer la boucle :

while read mem; do
  if ((mem > memlim)); then
    echo "MEMORY THRESHOLD REACHED, SEND KILL COMMAND"
    killall -9 -u #process2kill#
    break
  else
    echo "Memory (GB): $mem / $memlim"
  fi
done < <(free -gs1 | awk '/^Mem:/{print $3; fflush()}')

Dernière modification par kamaris (Le 21/05/2021, à 22:51)

Hors ligne