#1 Le 21/05/2021, à 11: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, à 12:35)
Hors ligne
#2 Le 21/05/2021, à 12:07
- pingouinux
Re : [résolu] Bash surveillance mémoire
Bonjour,
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, à 12: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, à 13: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, à 14: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, à 21: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, à 21:51)
Hors ligne