IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration système Discussion :

[bash-script] statistiques de charge CPU + mémoire


Sujet :

Administration système

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut [bash-script] statistiques de charge CPU + mémoire
    bonjour à tous

    je suis en train de réaliser une petite étude comparative entre Apache et Lighttpd. On me demande de tester leur montée en charge, j'ai donc créé un petit script pour paramétrer SIEGE, lequel se charge de monter le serveur en charge en le bombardant de requêtes.

    par contre je voudrais avoir la charge CPU+Mémoire, que la prise de mesure commence un peu avant le démarrage de SIEGE et qu'elle s'arrête juste après le test de charge.

    j'ai cherché avec la commande TOP, comme ceci :
    top -d 0.5 -b | grep httpd >> /dossier/fichier.log &

    et c'est là que je galère : pour httpd il y a un bonne vingtaine de lignes correspondant à des processus différents, alors que pour lighty il n'y a qu'une seule ligne
    d'autre part, entre chaque exportation de données de top dans le fichier log il n'y a pas de séparateur.

    comment dois-je procéder ? récupérer toute une séquence de lignes httpd et additionner leurs valeurs de charge CPU pour obtenir une stat qui tient la route ?

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    n'ayant pas eu de réponse, je me suis orienté vers une autre approche avec la fonction top à intervalle d'une demi-seconde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    top -d 0.5 -b | grep "load average" >> /tmp/cpu.log
    ensuite il me faut traiter ce fichier log temporaire pour en extraire les données qui m'intéressent, et c'est là que je bute...

    j'ai trouvé une commande qui me permet de lire le fichier log "ligne à ligne" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cat /tmp/cpu.log | awk 'NR==1 {print}'
    (NR==1 est le n° de ligne)

    tapée en console, cette fonction marche très bien, par contre dans mon script au sein d'une boucle "for" ça ne veut pas marcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #comptage du nombre de ligne dans le fichier
    lignecpu=`cat /tmp/cpu.log | wc -l`
     
    #affichage du fichier log ligne à ligne
    for ((j=1; j<=$lignecpu; j+=1))
    do
    toto=`cat /tmp/cpu.log | awk 'NR==$j {print}'`
    echo "$toto"
    done
    en console j'ai des lignes vierges qui s'affichent, le NR==$j ne veut pas fonctionner. par conre si je remplace $j par une valeur numérique, il me lit bien la ligne correspondante dans le fichier log...

    help plize ^^

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 646
    Par défaut
    Bonjour,

    awk sait lire les fichiers (pas besoin de boucle shell)

    uptime donne aussi la charge moyenne de la machine.
    C'est peut-être plus rapide que top, et plus facile à parser
    Code non testé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    declare -i chargeTotale
    nbC=25 #nombre de boucles à effectuer
    while [ ${cycle:-0} -lt $nbC ]
    do charge=$(bc <<<"$charge + $(LC_NUMERIC=C uptime | awk -F':' '{sub(", .*","",$4; print $4}') )
       ((cycle++))
       sleep 1
    done
    echo $charge
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    j'étais parti sur UPTIME au départ, mais le problème était de déterminer la durée de la boucle... la fonction TOP (avec -b) quand à elle boucle naturellement sur elle même, il suffit juste d'arrêter le processus une fois que SIEGE se termine.
    D'autre part j'ai besoin de récup la charge mémoire aussi, ce que TOP permet alors que si j'utilise UPTIME je suis obligé de faire un FREE en prime.

    Merci pour ton code ci-dessus, mais à vrai dire je n'ai pas tout compris, beaucoup de chose que je ne connais pas comme la syntaxe de ton awk, fonction LC_NUMERIC etc...

    pour info voici mon script (ci-dessous). comme tu peux le voir il est bien avancé puisqu'il fait déjà presque le café, il n'y a que 2 petits problèmes qui restent à résoudre pour le traitement des logs temporaires (voir les commentaires qui sont dedans), notamment le NR==$j auquel je faisait allusion dans mon post précédant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #!/bin/bash
     
    clear
    # effacement du précédant fichier top.log
    rm -f /siegelog/tmp/cpu.log 2> /dev/nul
    rm -f /siegelog/tmp/mem.log 2> /dev/nul
    rm -f /siegelog/tmp/result.log 2> /dev/nul
     
    # boucle de temporisation
    echo -e "attente de 60 sec afin de stabiliser la prise de mesure CPU+Mémoire\n"
    sleep 1
    echo -e "charges CPU+Mémoire stabilisées, début du test\n"
     
    # lancement de 2 TOP en tache de fond
    # rafraichissement toutes les 0.5 secondes
    # exportation des données CPU dans /siegelog/tmp/cpu.log
    top -d 0.5 -b | grep "load average" >> /siegelog/tmp/cpu.log &
    # exportation des données Mémoires dans /siegelog/tmp/mem.log 
    top -d 0.5 -b | grep "Mem:" >> /siegelog/tmp/mem.log &
    echo "enregistrement de données dans les log : initialisé"
     
    # temporisation de 0.5 sec afin d'avoir une mesure avant le début du test avec SIEGE
    sleep 0.5
     
    # lancement du test avec SIEGE
    siege -d0 -r100 -c30 -l/siegelog/tmp/result.log http://127.0.0.1:80
     
    # recherche des 2 processus TOP avec une boucle while et arret (destruction)
    # rappel, les quotes inversés indiquent à Bash d'executer
    i=1
    while [ $i -le 2 ]
    do
    #echo -e "test suppression process $i\n"
    pidtop=`ps aux | grep "top -d 0.5" | awk -F' ' '{ print $2 }' | head -n1`
    kill -9 $pidtop
    let i=$i+1
    done
     
    # verification que TOP a bien été arreté
    echo "vérification des processus top actifs en tache de fond"
    ps aux | grep "top -d 0.5"
     
    # ***************************************************************
     
    # traitement des logs temporaires
    lignecpu=`cat /siegelog/tmp/cpu.log | wc -l`
    echo "il y a $lignecpu lignes"
     
    # recupération des valeurs cpu+ram de la 1ere ligne des logs
    basecpu=`cat /siegelog/tmp/cpu.log | awk 'NR==1 {print}' | awk -F, '{print $4}' | awk -F' ' '{print $3}'`
    baseram=`cat /siegelog/tmp/mem.log | awk 'NR==1 {print}' | awk -F, '{print $3}' | awk -F' ' '{print $1}' | sed s/k/''/`
    echo "valeur de base CPU = $basecpu"
    echo "valeur de base RAM = $baseram"
     
    for ((j=1; j<=$lignecpu; j+=1))
    do
    # echo "n° de ligne = $j"
     toto=`cat /siegelog/tmp/cpu.log | awk 'NR==$j {print}'`
    # ******************* c'est ici que ça merdouille : $j reste vide, et le echo de $toto ci-dessous affiche des lignes blanches (vides) ****************
     echo "$toto"
    done # positionnement temporaire, ce DONE sera a déplacer apres la concaténation des résultats une fois les prbs résolus
     
    # ************ NR==10 est une valeur temporaire à remplacer par NR==$j si on trouve une soluce *********
    # recup de l'heure
    heure=`cat /siegelog/tmp/cpu.log | awk 'NR==10 {print}' | awk -F' ' '{print $3}'`
    # recup du load-average
    loadcpu=`cat /siegelog/tmp/cpu.log | awk 'NR==10 {print}' | awk -F, '{print $4}' | awk -F' ' '{print $3}'`
    # recup de la charge mémoire
    loadmem=`cat /siegelog/tmp/mem.log | awk 'NR==10 {print}' | awk -F, '{print $3}' | awk -F' ' '{print $1}' | sed s/k/''/`
     
    let consocpu=loadcpu-basecpu
    let consoram=baseram-loadmem
     
    # ******* erreur avec le calcule de consocpu, je ne comprend pas pkoi car ça marche tres bien pour consoram *******
    echo "concaténation = heure:$heure - CPU:$consocpu - RAM:$consoram ko"
    # concaténation à exporter dans un fichier LOG définitif et nominatif
     
    # sortie
    echo -e "\n  *** fin du script ***\n"
    exit

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 646
    Par défaut
    tu devrais mettre le nom des fichiers dans des variables, pour éventuellement n'avoir à changer le nom qu'à un seul endroit, et ainsi éviter les erreurs.

    mieux vaut faire un test (afin qu'il n'y ait pas d'erreurs), que de rediriger les erreurs vers /dev/null (avec deux l).

    n'utilise pas cat. awk peut lire les fichiers.

    awk | awk, grep | grep

    ne parse pas la sortie de ps, utilise directement pkill.

    ...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 39
    Par défaut
    merci pour le "null" avec 2 L , j'avais pas fait gaffe

    merci pour la commande pkill, je en connaissais pas, ça simplifie effectivement les choses

    par contre concernant la fonction awk, j'ai cherché un peu dans le man, mais j'ai pas trouvé d'exemple précis pour une lecture directe d'un fichier "en mode ligne à ligne"
    (je rapelle que je lis en parallèle 2 fichiers afin de concaténer les infos avec les n° de lignes correspondants)...
    j'avoue être un peu perdu
    pourrais-tu me donner la syntaxe du awk stp ?

Discussions similaires

  1. [WD15] Charge CPU et mémoire
    Par spamoi dans le forum WinDev
    Réponses: 9
    Dernier message: 29/08/2011, 16h21
  2. [débutant] Mémoire + Charge CPU JBOSS
    Par rin01 dans le forum Wildfly/JBoss
    Réponses: 2
    Dernier message: 11/03/2010, 17h36
  3. [linux] charge cpu et mémoire.
    Par heider dans le forum Général Python
    Réponses: 8
    Dernier message: 26/10/2007, 20h12
  4. Commandes pour charge disque / CPU / Mémoire
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 26/07/2007, 21h35
  5. Charge CPU avec prog opengl + win32
    Par TibobiT dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 19h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo