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 06/04/2011, à 10:14

nira83

[ Resolu] Shell et langage C

Bonjour ,
J'ai une application serveur/client en langage C qui communique. Et je dois évaluer leurs performances en terme de processus CPU.
Pour ce faire j'utilise la commande "perf stat ./...."

[root@lnx5 vxfabric_test]# perf stat ./server 1555
TEST_INET
^C
Performance counter stats for './server 1555':

       1.010116  task-clock-msecs         #      0.001 CPUs
              2  context-switches         #      0.002 M/sec
              0  CPU-migrations           #      0.000 M/sec
             98  page-faults              #      0.097 M/sec
              0  cycles                   #      0.000 M/sec
              0  instructions             #       -nan IPC 
              0  cache-references         #      0.000 M/sec
              0  cache-misses             #      0.000 M/sec

    1.522224928  seconds time elapsed

Je souhaiterai recuper la ligne contenant le CPUs grâce à un scripte bash.
Etant entrain d'apprendre le langage et les commandes j'ai differente chose essayé de le recuperer


#!/bin/bash
for i in `seq 1 1 $3`;
do
        perf stat ./client_send_raw $1 $2 $i $4  >> donnees.txt
done

$1 étant le nom de carte réseau
$2 l'adresse mac
$3 le nombre de paquet à envoyer en boucle ( il envoi un 1 paquet , puis 2 puis 3 ...jusqu'a $3)
$4 la taille des paquets

Mais ceci me renvoi la valeur de ./client_send_raw et non de perf stat.

J'ai ensuite éssayé de grep la ligne...

#!/bin/bash
for i in `seq 1 1 $3`;
do
        grep CPUs perf stat ./client_send_raw $1 $2 $i $4
done

Mais la il me renvoit une erreur toute à fais normal étant donné que je ne travail pas sur un fichier à proprement parler.

[root@lnx5 vxfabric_test]# ./scriptclient.sh 00:00:DE:40:35:AF eth1 1 9000

Performance counter stats for './client_send_raw 00:00:DE:40:35:AF eth1 1 9000':

       0.978119  task-clock-msecs         #      0.137 CPUs
              3  context-switches         #      0.003 M/sec
              1  CPU-migrations           #      0.001 M/sec
            136  page-faults              #      0.139 M/sec
              0  cycles                   #      0.000 M/sec
              0  instructions             #       -nan IPC 
              0  cache-references         #      0.000 M/sec
              0  cache-misses             #      0.000 M/sec

    0.007119975  seconds time elapsed

grep: Send: Aucun fichier ou dossier de ce type
grep: Finish.: Aucun fichier ou dossier de ce type
scriptclient.sh:       grep CPUs `perf stat ./client_send_raw $1 $2 $i $4`
grep: Packages: Aucun fichier ou dossier de ce type
grep: send: Aucun fichier ou dossier de ce type
grep: :: Aucun fichier ou dossier de ce type
grep: 1: Aucun fichier ou dossier de ce type
grep: Size: Aucun fichier ou dossier de ce type
grep: of: Aucun fichier ou dossier de ce type
grep: packages: Aucun fichier ou dossier de ce type
grep: :: Aucun fichier ou dossier de ce type
grep: 9000: Aucun fichier ou dossier de ce type
grep: Exec: Aucun fichier ou dossier de ce type
grep: Time: Aucun fichier ou dossier de ce type
grep: :: Aucun fichier ou dossier de ce type
grep: 0.0000260000: Aucun fichier ou dossier de ce type
grep: Mb/s: Aucun fichier ou dossier de ce type
grep: =: Aucun fichier ou dossier de ce type
grep: 337.515024: Aucun fichier ou dossier de ce type
scriptclient.sh:       grep CPUs `perf stat ./client_send_raw $1 $2 $i $4`
[root@lnx5 vxfabric_test]#

J'ai aussi essayé de stocker ce que la fonction renvoi dans une variable puis de l'afficher
mais j'ai toujours le meme probleme , ça m'affiche ce que me renvoi mon programme en C et non la commande perf...

Je ne vois pas du tout comment faire...si quelqu'un peut me donner une idée , un bout de code... ou n'importe quoi qui peut m'aider xD
Merci à vous!

Dernière modification par nira83 (Le 15/04/2011, à 11:53)

Hors ligne

#2 Le 06/04/2011, à 10:34

c.hubert

Re : [ Resolu] Shell et langage C

Bonjour,

La commande serait plutôt :

perf stat | grep CPUs

Hors ligne

#3 Le 06/04/2011, à 10:42

nira83

Re : [ Resolu] Shell et langage C

Voila ce que j'ai tapé :

for i in `seq 1 1 $3`;
do
        perf stat | grep CPUs./client_send_raw $1 $2 $i $4
done

voila ce que ça me renvoit :

[root@lnx5 vxfabric_test]# ./script.sh 00:00:DE:40:35:AF eth1 1 9000
grep: 00:00:DE:40:35:AF: Aucun fichier ou dossier de ce type
grep: eth1: Aucun fichier ou dossier de ce type
grep: 1: Aucun fichier ou dossier de ce type
grep: 9000: Aucun fichier ou dossier de ce type

usage: perf stat [<options>] <command>

    -e, --event <event>   event selector. use 'perf list' to list available events
    -i, --inherit         child tasks inherit counters
    -p, --pid <n>         stat events on existing pid
    -a, --all-cpus        system-wide collection from all CPUs
    -c, --scale           scale/normalize counters
    -v, --verbose         be more verbose (show counter open errors, etc)
    -r, --repeat <n>      repeat command and print average + stddev (max: 100)
    -n, --null            null run - dont start any counters

Hors ligne

#4 Le 06/04/2011, à 11:39

biotechman

Re : [ Resolu] Shell et langage C

for i in `seq 1 1 $3`;
do
        perf stat ./client_send_raw $1 $2 $i $4 | grep CPU
done


May the source be with you
http://biotechman.com/wordpress

Hors ligne

#5 Le 06/04/2011, à 11:47

nira83

Re : [ Resolu] Shell et langage C

le script s'execute sans erreurs comme ça...
Il ne se passe rien au final hmm

./script.sh 00:00:DE:40:35:AF eth1 1 9000

Performance counter stats for './client_send_raw 00:00:DE:40:35:AF eth1 1 9000':

       1.070245  task-clock-msecs         #      0.156 CPUs
              3  context-switches         #      0.003 M/sec
              0  CPU-migrations           #      0.000 M/sec
            136  page-faults              #      0.127 M/sec
              0  cycles                   #      0.000 M/sec
              0  instructions             #       -nan IPC 
              0  cache-references         #      0.000 M/sec
              0  cache-misses             #      0.000 M/sec

    0.006855714  seconds time elapsed

[root@lnx5 vxfabric_test]#

En gros...le but principal de mon scripte est de pouvoir recuperer la valeur du CPU et du nombre de paquet à envoyer pour les sauvegarder dans un ficher excel pour ensuite en faire le traitement , moyenne , ecart-type...
Recuperer le nombre de paquet n'est pas genant ...mais recuperer la valeur du CPUs je ne vois pas du tout comment faire.

Hors ligne

#6 Le 07/04/2011, à 06:00

pode

Re : [ Resolu] Shell et langage C

La commande perf stat renvoie son résultat sur la sortie d'ereur standard (et non pas la sortie standard).
Voici donc un exemple pour récupérer la ligne CPUs, sur une commande quelconque :

$ perf stat ls |& grep CPUs
           2,546566  task-clock-msecs         #      0,866 CPUs 

===>   |&   <===

Hors ligne

#7 Le 07/04/2011, à 08:58

nira83

Re : [ Resolu] Shell et langage C

Merci pour ta réponse , j'ai finalement trouvé mais d'une autre façon ^^

#!/bin/bash
#if Raw    >> <Add_Mac> <Network_interface> <Min_pkt> <Step> <Max_pkt> <Size_pkt> <Save_Name> No extension
#if Normal >> <  Port > <    Add_Ip       > <Min_pkt> <Step> <Max_pkt> <Size_pkt> <Save_name> No extension
#Send start
for i in `seq $4 $5 $6`;
do
    (perf stat $1 $2 $3 $i $7 2>&1) | tee -a $8.txt
done
#Send Finish
grep  CPUs $8.txt > CPUS_$8.txt
sed -re 's/ //g' CPUS_$8.txt > C_$8.txt
sed -re 's/task-clock-msecs/ /g' C_$8.txt > CPUS_$8.txt
sed -re 's/CPUs//g' CPUS_$8.txt > C_$8.txt
sed -re 's/\./,/g' C_$8.txt > CPUS_$8.txt
sed -re 's/#/\t/g' CPUS_$8.txt > Cpu_$8.xls
rm *$8.txt
#Now Cpu_$7 has Clock and Cpus .

pkt_size=$4
echo -e "Nb_pkt\tT_clock\tCPUs\n" > $8.xls 
while read line  
do 
       echo -e "$pkt_size\t$line" >> $8.xls 
    let "pkt_size = pkt_size + $5"
done < Cpu_$8.xls
rm Cpu_$8.xls

Mon code est un peu brutal...peut on compresser l'enchainement de sed?

Hors ligne

#8 Le 11/04/2011, à 16:57

nira83

Re : [ Resolu] Shell et langage C

Bonjour ,apres des jours de galere je commence à maitriser le bash.
mais c'est pas demain la veille que j'y arriverai .
J'ai reussi à mettre en forme les fichiers et tout le tralala mais maintenant je souhaite récuperer des valeurs numérique...et là pas moyen, a coup de grep de sed , d'awk... RHAAA
       2.535669  task-clock-msecs         #      0.147 CPUs
       2.535669  task-clock-msecs         #      0.147 CPUs
       2.535669  task-clock-msecs         #      0.147 CPUs
       2.535669  task-clock-msecs         #      0.147 CPUs
       2.535669  task-clock-msecs         #      0.147 CPUs

Le texte sera présent sous cette forme , les valeurs numérique variant bien entendu ^^
je souhaiterai récuperer toute les valeurs numérique dans des variables...
comment faire?

Hors ligne

#9 Le 11/04/2011, à 17:45

c.hubert

Re : [ Resolu] Shell et langage C

Si c'est en colonne il te reste cut ...

Hors ligne

#10 Le 11/04/2011, à 19:04

pode

Re : [ Resolu] Shell et langage C

Par exemple :

$ cat sortie.out 
       2.535661  task-clock-msecs         #      0.141 CPUs
       2.535662  task-clock-msecs         #      0.142 CPUs
       2.535663  task-clock-msecs         #      0.143 CPUs
       2.535664  task-clock-msecs         #      0.144 CPUs
       2.535665  task-clock-msecs         #      0.145 CPUs
$ TABLEAU_COL1=($(awk ' { print $1 } ' sortie.out))
$ TABLEAU_COL4=($(awk ' { print $4 } ' sortie.out))
$ echo ${#TABLEAU_COL1[@]}
5
$ echo ${#TABLEAU_COL4[@]}
5
$ echo ${TABLEAU_COL1[@]}
2.535661 2.535662 2.535663 2.535664 2.535665
$ echo ${TABLEAU_COL4[@]}
0.141 0.142 0.143 0.144 0.145
$ echo ${TABLEAU_COL1[0]}
2.535661
$ echo ${TABLEAU_COL4[0]}
0.141
$ echo ${TABLEAU_COL1[4]}
2.535665
$ echo ${TABLEAU_COL4[4]}
0.145

Hors ligne

#11 Le 12/04/2011, à 14:32

nira83

Re : [ Resolu] Shell et langage C

Bonjour ,
Ta commande marche nickel ! Je l'ai adapté et c'est parfait!
Mais ... Comment traité des nombres a virgule sans utiliser bc?
j'ai lu qu'avec awk , c'etait possible...mais comment?

Hors ligne

#12 Le 12/04/2011, à 18:40

pode

Re : [ Resolu] Shell et langage C

J'ai utilisé awk juste pour extraire les données : il n'y a pas eu de calcul numérique.

Mais awk sait aussi faire des calculs :

$ cat sortie.out
       2.535661  task-clock-msecs         #      0.141 CPUs
       2.535662  task-clock-msecs         #      0.142 CPUs
       2.535663  task-clock-msecs         #      0.143 CPUs
       2.535664  task-clock-msecs         #      0.144 CPUs
       2.535665  task-clock-msecs         #      0.145 CPUs 
$ awk ' { print sqrt($1)+cos($4)-$4*$1**(10*$4) } ' sortie.out
2.05887
2.05008
2.04118
2.03216
2.02303

A voir : gawk - fonctions numériques (en anglais)
(et aussi la fonction printf de awk, pour contrôler l'affichage en sortie)

Hors ligne

#13 Le 13/04/2011, à 15:40

nira83

Re : [ Resolu] Shell et langage C

Bonjour ,
Merci pour ton aide!
Mais je suis finalement passé par l'intermédiaire d'un programme en C.
est il possible de réduire cette partie de mon script :

#Rcpt finish
grep CPUs $FILE.txt > CPU_$FILE.txt
grep Mb/s $FILE.txt > Mbs_$FILE.txt
paste -d '\t' CPU_$FILE.txt Mbs_$FILE.txt > CPUS_$FILE.txt
sed -re 's/ //g' CPUS_$FILE.txt > C_$FILE.txt
sed -re 's/task-clock-msecs/ /g' C_$FILE.txt > CPUS_$FILE.txt
sed -re 's/CPUs//g' CPUS_$FILE.txt > C_$FILE.txt
sed -re 's/Mb\/s=//g' C_$FILE.txt > Cs_$FILE.txt
sed -re 's/\./,/g' Cs_$FILE.txt > CPUS_$FILE.txt
sed -re 's/#/\t/g' CPUS_$FILE.txt > Cpu_$FILE.xls
rm *$FILE.txt

Si oui comment?

Hors ligne

#14 Le 13/04/2011, à 19:35

pode

Re : [ Resolu] Shell et langage C

nira83 a écrit :

est il possible de réduire cette partie de mon script :

Oh oui, ça a l'air bien trop compliqué.
Par contre, pour donner une réponse efficace, le plus simple, c'est que tu donnes un exemple du fichier en entrée (fichier $FILE.txt) et le résultat que tu souhaites (fichier Cpu_$FILE.xls)

Hors ligne

#15 Le 14/04/2011, à 09:04

nira83

Re : [ Resolu] Shell et langage C

Bonjour,
Voici le fichier que j'ai à traité il est normalement beaucoup plus gros , mais j'ai arrete au bout de 2 coup:
Send Finish.

*******
Packages send : 1000
Size of packages : 800
Exec Time : 0.0061250000
Mb/s = 125.318878
*******


Performance counter stats for './client_send_raw 00:00:DE:40:35:AF eth1 1000 800':

       5.078562  task-clock-msecs         #      0.359 CPUs
             10  context-switches         #      0.002 M/sec
              1  CPU-migrations           #      0.000 M/sec
            133  page-faults              #      0.026 M/sec
              0  cycles                   #      0.000 M/sec
              0  instructions             #       -nan IPC 
              0  cache-references         #      0.000 M/sec
              0  cache-misses             #      0.000 M/sec

    0.014163546  seconds time elapsed

Send Finish.

*******
Packages send : 1000
Size of packages : 800
Exec Time : 0.0061280000
Mb/s = 125.257527
*******


Performance counter stats for './client_send_raw 00:00:DE:40:35:AF eth1 1000 800':

       4.537091  task-clock-msecs         #      0.326 CPUs
             10  context-switches         #      0.002 M/sec
              1  CPU-migrations           #      0.000 M/sec
            133  page-faults              #      0.029 M/sec
              0  cycles                   #      0.000 M/sec
              0  instructions             #       -nan IPC 
              0  cache-references         #      0.000 M/sec
              0  cache-misses             #      0.000 M/sec

    0.013932887  seconds time elapsed

Send Finish.

*******
Packages send : 1000
Size of packages : 800
Exec Time : 0.0058160000
Mb/s = 131.976982
*******


Performance counter stats for './client_send_raw 00:00:DE:40:35:AF eth1 1000 800':

       4.571565  task-clock-msecs         #      0.405 CPUs
              9  context-switches         #      0.002 M/sec
              0  CPU-migrations           #      0.000 M/sec
            134  page-faults              #      0.029 M/sec
              0  cycles                   #      0.000 M/sec
              0  instructions             #       -nan IPC 
              0  cache-references         #      0.000 M/sec
              0  cache-misses             #      0.000 M/sec

    0.011276875  seconds time elapsed

et voila la forme finale que j'obtient actuellement avec mon code chaque espace étant des \t ( tabulation ) pour qu'il soit bien interprété par openoffice math :

3,64    0,4    16,9
3,99    0,43    14,79
3,62    0,38    17,04
4,1    0,44    14,36
4,07    0,44    14,47
4,07    0,38    14,58
4,03    0,44    14,74
4,05    0,39    14,48

La premiere colonne étant destiné à la Clock , la deuxieme au CPUs et la 3eme au Mb/s

Dernière modification par nira83 (Le 14/04/2011, à 09:13)

Hors ligne

#16 Le 14/04/2011, à 20:18

pode

Re : [ Resolu] Shell et langage C

La sortie que tu as donnée correspond à un fichier d'entrée différent de celui que tu as donné. En effet, en réexécutant ton script, à partir du fichier d'entrée, j'ai :

$ cat Cpu_fic.xls 
5,078562     0,359    125,318878
4,537091     0,326    125,257527
4,571565     0,405    131,976982

Mais ça m'a permis de comprendre plus facilement ce que tu voulais.
Voici une solution plus compacte :

$ awk ' /Mb\/s/ { mb=$3 } ; /CPUs/ { print gensub(/\./, ",", "g", $1) "\t" gensub(/\./, ",", "g", $4) "\t" gensub(/\./, ",", "g", mb) } ' $FILE.txt > Cpu_fic_awk.xls
$ cat Cpu_fic_awk.xls 
5,078562    0,359    125,318878
4,537091    0,326    125,257527
4,571565    0,405    131,976982

Ou encore :

$ awk ' { gsub(/\./, ",") } ; /Mb\/s/ { mb=$3 } ; /CPUs/ { print $1 "\t" $4 "\t" mb } ' $FILE.txt > Cpu_fic_awk.xls
$ cat Cpu_fic_awk.xls 
5,078562    0,359    125,318878
4,537091    0,326    125,257527
4,571565    0,405    131,976982

Le résultat est identique (modulo l'espace qui, dans chaque ligne de ta sortie, était devant la première tabulation ; je ne l'ai pas repris car cet espace me semble inutile)

Hors ligne

#17 Le 15/04/2011, à 11:53

nira83

Re : [ Resolu] Shell et langage C

Nickel! ça marche à la perfection et j'ai gagné en clarté big_smile
Merci pour tout ! Sujet Clos big_smile

Hors ligne