#1 Le 06/04/2011, à 09: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/sec1.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/sec0.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, à 10:53)
Hors ligne
#2 Le 06/04/2011, à 09: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, à 09: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 typeusage: 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, à 10: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, à 10:47
- nira83
Re : [ Resolu] Shell et langage C
le script s'execute sans erreurs comme ça...
Il ne se passe rien au final
./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/sec0.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, à 05: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, à 07: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, à 15: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, à 16: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, à 18: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, à 13: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, à 17: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, à 14: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, à 18:35
- pode
Re : [ Resolu] Shell et langage C
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, à 08: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/sec0.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/sec0.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/sec0.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, à 08:13)
Hors ligne
#16 Le 14/04/2011, à 19: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, à 10:53
- nira83
Re : [ Resolu] Shell et langage C
Nickel! ça marche à la perfection et j'ai gagné en clarté
Merci pour tout ! Sujet Clos
Hors ligne