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 17/03/2014, à 14:35

ffblainvillais

Benchmark

Bonjour, je souhaite créer un benchmark pour linux, pour ce faire je dois lancer un gros processus et voir combien de temps le système met a l'éxecuter, j'ai vu que l'on pourrais avoir l'info du temps mis pour l'execution dans "proc/PID/stat" mais je ne la trouver pas, pouvez vous m'aider? merci

Hors ligne

#3 Le 17/03/2014, à 16:17

ssdg

Re : Benchmark

Sinon...

man time

s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#4 Le 17/03/2014, à 19:38

ffblainvillais

Re : Benchmark

merci a vous deux, je pense que ce que je cherche est plutôt du coté de claudius, par contre, on vois dans le man proc qu'il y a 4 temps différents, il y a utime, stime, cutime, cstime... lequel dois-je prendre svp?

Hors ligne

#5 Le 18/03/2014, à 11:27

claudius01

Re : Benchmark

Cela ne coûte rien de prendre les 4 (les 2 cutime et cstime sont dédiés aux temps d'attente des fils d'un processus père et sont à zéro si pas fils ;-)

Exemple :

# Sortie partielle du top
 PID USER        PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
1819 claudius    20   0 44856 1392 1124 S  7.0  0.1   1:20.61 trcd

$ sudo ./procstat 1819
                 pid: 1819
               tcomm: (trcd)
               state: S
                ppid: 1
                pgid: 1738
                 sid: 1738
              tty_nr: 0
            tty_pgrp: -1
               flags: 4202496
             min_flt: 740
            cmin_flt: 0
             maj_flt: 0
            cmaj_flt: 0
               utime: 8.480000
               stime: 72.060000
              cutime: 0.000000
              cstime: 0.000000
            priority: 20
                nice: 0
         num_threads: 5
       it_real_value: 0.000000
          start_time: 03.18 10:00 (1032.73s)
               vsize: 45932544
                 rss: 348
              rsslim: 9223372036854775807
          start_code: 134512640
            end_code: 134582255
         start_stack: 4286888752
                 esp: 4286875648
                 eip: 4151276592
             pending: 0000000000000000
             blocked: 0000000000000000
              sigign: 00000000000a0000
            sigcatch: 000000003ff1fa3f
               wchan: 9223372036854775807
               zero1: 0
               zero2: 0
         exit_signal: 0000000000000011
                 cpu: 0
         rt_priority: 0
              policy: 0

On a bien utime + stime = 80 secs = 1 min 20 secs = TIME+ du top

NB: Pour la mise en forme, j'ai utilisé le programme procstat

Dernière modification par claudius01 (Le 18/03/2014, à 14:36)

Hors ligne

#6 Le 18/03/2014, à 15:49

ffblainvillais

Re : Benchmark

ok, merci ! saurais tu comment fait pour rechercher dans un fichier et afficher seulement la première ligne ?
je m'explique ! je fais ma commande:
cd /proc
cat stat | cut -d " " -f2
Mais cela m'affiche le f2 de chaques lignes alors que je ne veut que celui de la 1ère ligne !

et sans vouloir abuser de ton amabilitée, comment faire pour utiliser la valeur obtenu dans un script? (la mettre en variable )
Merci beaucoup

Hors ligne

#7 Le 18/03/2014, à 16:25

claudius01

Re : Benchmark

ffblainvillais a écrit :

... alors que je ne veux que celui de la 1ère ligne !

$ cat stat | cut -d " " -f2 | head -1
ffblainvillais a écrit :

comment faire pour utiliser la valeur obtenu dans un script? (la mettre en variable )

Je ne suis pas sûr de totalement comprendre cette demande, peux-tu préciser en donnant un exemple.
Est-ce l'utilisation de valeurs à l'extérieur et/ou à l'intérieur dudit script ?
Merci

Dernière modification par claudius01 (Le 18/03/2014, à 17:08)

Hors ligne

#8 Le 18/03/2014, à 17:54

ffblainvillais

Re : Benchmark

i=0
cd /proc/$$
cat stat | cut -d " " -f14
cd /proc
cat stat | cut -d " " -f2 | head -1

while [ "$i" != "100000" ]
do
i=$(($i+1))
done

cd /proc/$$
cat stat | cut -d " " -f14
cd /proc
cat stat | cut -d " " -f2 | head -1

Voici mon code, ton "| head -1" ne marche pas, il ne m'affiche rien.
sinon execute le script il t'affiche une valeur 2 fois, avant et aprés le processus. je veut mettre une variable a la fin de mon programme les valeur du programme:

EX: tempstot1= "cat stat | cut -d " " -f2 | head -1" (avant le processus)
      tempsproc= "cat stat | cut -d " " -f14" (aprés le processus)
      et tempstot2 ="cat stat | cut -d " " -f2 | head -1" (apres le processus)

je veut qu'ensuite mon script me calcule :

calculefinal = 100 (tempsproc/tempstot2 - tempstot1)

m'a tu compris? merci de ton aide

Hors ligne

#9 Le 18/03/2014, à 18:50

claudius01

Re : Benchmark

Ok, je vois l'expression des besoins...

... ton "| head -1" ne marche pas, il ne m'affiche rien.

De toute façon, "cat /proc/[pid]/stat" présente le résultat sur une et une seule ligne ?

Le bloc :

while [ "$i" != "100000" ]
do
i=$(($i+1))
done

peut être remplacé avantageusement pas un sleep

Sauf erreur de ma part la syntaxe :

tempstot1="cat stat | cut -d " " -f2 | head -1" 

est fausse, il faut écrire (simple cote inversée ` à la place de la double cote "):

tempstot1=`cat stat | cut -d " " -f2 | head -1`

Si tu veux utiliser la valeur finale calculée dans le script et l'exploiter à l'extérieur, tu peux faire un "echo" de cette valeur et la récupérer d'un autre script ou programme comme :

$ export valeur_finale=`ton_script`
$ echo $valeur_finale

Dernière modification par claudius01 (Le 18/03/2014, à 18:54)

Hors ligne

#10 Le 18/03/2014, à 18:55

ffblainvillais

Re : Benchmark

j'ai ciblé mon problème !

i=0
cd /proc/$$
tpsproc1=$(cat stat | cut -d " " -f14)
cd /proc
tpstot1=$(cat stat | cut -d " " -f2 | head -2)

while [ "$i" != "100000" ]
do
i=$(($i+1))
done

cd /proc/$$
tpsproc2=$(cat stat | cut -d " " -f14)
cd /proc
tpstot2=$(cat stat | cut -d " " -f2 | head -2)

haut=$(($tpsproc2-$tpsproc1))
bas=$(($tpstot2-$tpstot1))
test=$((100*($haut/$bas) | bc -l))
echo "processeur utilisé a $test%"
echo "(100*($haut/$bas))"| bc -l


mon  "echo "processeur utilisé a $test%" " affiche "processeur utilisé a 0%"
alors que mon " echo "(100*($haut/$bas))"| bc -l  " affiche le nombre que je souhaite lui faire afficher a la place du 0

Ma question : comment cela ce fait que mon "echo "processeur utilisé a $test%"  affiche 0 alors que le calcule est bon? je pense que cela vient du nombre a virgule...

Hors ligne

#11 Le 19/03/2014, à 11:11

claudius01

Re : Benchmark

Bonjour,

En mettant au début du script un

set -x

ou en le passant au debugger, peut-être que tu comprendras mieux...


Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 19/03/2014, à 13:10)

Hors ligne

#12 Le 19/03/2014, à 14:06

ffblainvillais

Re : Benchmark

j'ai éssayé ca ne marche pas :s ca me détaille juste ce que mon script fais. sinon comment je peut convertir le temps utime en secondes? ou memes dans le cd /proc/$$ puis je trouver le temps d'execution dans un fichier genre stat? merci

Hors ligne

#13 Le 19/03/2014, à 15:54

claudius01

Re : Benchmark

ffblainvillais a écrit :

j'ai éssayé ca ne marche pas :s ca me détaille juste ce que mon script fais...

Euhh ... c'est un peu le but de la manip ;-)

Sinon, inspire toi du script 'proc_stat.sh' suivant repris en partie du tien:

#!/bin/bash
#set -x

# Programme: proc_stat.sh
# Usage: $ time ./proc_stat.sh

echo
cd /proc/$$

i=0
utime1=$(cat stat | cut -d " " -f14)
stime1=$(cat stat | cut -d " " -f15)

while [ "$i" != "3000000" ]
do
   i=$(($i+1))
done

utime2=$(cat stat | cut -d " " -f14)
stime2=$(cat stat | cut -d " " -f15)

# Time in mS
utime=$((10 * ($utime2-$utime1)))
stime=$((10 * ($stime2-$stime1)))
total=$(($utime+$stime))

sec_total=`echo $total | awk '{printf("%2d.%03d\n", $0 / 1000, $0 % 1000);}'`
sec_utime=`echo $utime | awk '{printf("%2d.%03d\n", $0 / 1000, $0 % 1000);}'`
sec_stime=`echo $stime | awk '{printf("%2d.%03d\n", $0 / 1000, $0 % 1000);}'`

echo "Consumption calculed from /proc/[pid]/stat:"
echo
echo "total ["$sec_total" secs]"
echo "user  ["$sec_utime" secs]"
echo "sys   ["$sec_stime" secs]"

echo
echo "Consumption calculed by 'time':"

exit 0

et qui fournit à priori les bonnes valeurs de consommation:

$ time ./proc_stat.sh

Consumption calculed from /proc/[pid]/stat:

total [25.030 secs]
user  [24.280 secs]
sys   [ 0.750 secs]

Consumption calculed by 'time':

real    0m28.676s
user    0m24.282s
sys     0m0.756s

NB: Les pro. du bash me pardonnerons pour les syntaxes tirées du ksh ;-)

Hors ligne

#14 Le 20/03/2014, à 17:12

ffblainvillais

Re : Benchmark

Impec ! merci wink je voudrais également savoir comment faire pour dans le cas des processeur dual, quad core, assigner un processus a tel ou tel coeur? merci

Hors ligne

#16 Le 20/03/2014, à 18:37

ffblainvillais

Re : Benchmark

encore une fois merci, je travaillerais dessus quand j'aurais fini mon script qui test le disque dur...
comment explique tu la différence de temps entre le temps "real" calculé par le time et celui que tu calcule par la fonction? j'ai adapté ton script sur le mien et il dis qu'en 5.160 secs il a fini, alors qu'en vrai cela fais le double? yikes

Hors ligne

#17 Le 20/03/2014, à 18:57

claudius01

Hors ligne

#18 Le 20/03/2014, à 22:44

ffblainvillais

Re : Benchmark

Bon comme tu a l'air de savoir pas mal de chose, je te demanderais ceci: Peut on prendre des infos sur la carte graphique de la même facon qu'on le faisais avec le processeur en passant par le fichier /home/$$/stat
ou alors peut on créer un processus uniquement pour la carte grapique? enfaite j'aimerais pouvoir la tester aussi avec mon script..

Hors ligne

#19 Le 21/03/2014, à 14:13

claudius01

Re : Benchmark

Bonjour,

Là, je ne sais pas trop te dire. Désolé.
Doit bien avoir des logiciels qui font du "benchmarking" comme phoronix test suite.


Cordialement, A+
--
Claudius

Hors ligne

#20 Le 24/03/2014, à 11:09

ffblainvillais

Re : Benchmark

salut, désolé j'etais super occupé ce week end, anniversaire baptème etc... merci claudius c'est pas grave je ne vais pas faire cela ^^ sinon on m'a parlé de parralélisme, c'est a dire de pouvoir lancer mon script t autre chose en meme temps, sais toi comment faire?

Hors ligne

#21 Le 24/03/2014, à 11:52

claudius01

Re : Benchmark

Bonjour,

Lancer plusieurs instances en parallèle d'un script ou d'un programme, rien de plus simple:

$ my_script &
$ my_script &
$ ...
$ my_script &

Maintenant, attention aux ressources qui ne seraient pas partageables entre plusieurs instances s'exécutant en parallèle ...


Cordialement, A+
--
Claudius

Dernière modification par claudius01 (Le 24/03/2014, à 15:02)

Hors ligne

#22 Le 25/03/2014, à 16:47

ffblainvillais

Re : Benchmark

bonjour, j'ai implémenté les taskset dans mon script, mon test de processeur est le suivant :

i=0

### Temps avant ###

utime1=$(cat /proc/$$/stat | cut -d " " -f14)
stime1=$(cat /proc/$$/stat | cut -d " " -f15)

tpstot1=$(cat /proc/stat | cut -d " " -f2 | head -2)

### Boucle ###
while [ "$i" != "1000000" ]
do
i=$(($i+1))
done

### Temps aprés ###

utime2=$(cat /proc/$$/stat | cut -d " " -f14)
stime2=$(cat /proc/$$/stat | cut -d " " -f15)

tpstot2=$(cat /proc/stat | cut -d " " -f2 | head -2)

### Calcule pourcentage###
haut=$(($utime2-$utime1))
bas=$(($tpstot2-$tpstot1))
resultat=$( echo "(100*($haut/$bas))"| bc -l)

### Calcule du techo "Processeur utilisé a  $resultat%"
echo "ce calcule a été executé en "$tempstotal" secondes"
echo
echo "Le processeur avec 100% de ses capacitées aurait fait ce calcule en "$temps100pr100" secondes"
echo
echo
emps ###
utime=$((10 * ($utime2-$utime1)))
stime=$((10 * ($stime2-$stime1)))
total=$(($utime+$stime))

tempstotal=`echo $total | awk '{printf("%2d.%03d\n", $0 / 1000, $0 % 1000);}'`
temps100pr100=$( echo "($tempstotal*($resultat/100))"| bc -l)

### Print ###
echo
echo           
echo "Processeur utilisé a  $resultat%"
echo "ce calcule a été executé en "$tempstotal" secondes"
echo
echo "Le processeur avec 100% de ses capacitées aurait fait ce calcule en "$temps100pr100" secondes"
echo
echo
i=0

sauf que quand mon script met "taskset -c 0 proc.sh" cela me met a peu prés 98% d'utilisation ce qui me semble correct.
par contre quand je met "taskset -c 1 proc.sh" cela me met genre 10 000% ... des valeur carrement excessive ou même aucune valeur du tout !! pourquoi?

sinon pourquoi quand je tape dans ma console "cat /proc/cpuinfo | grep "model name" | cut -d " " -f3,4,5,6,7,8" il m'affiche ce que je souhaite sauf que dans mon script quand je met
" infoproc=cat /proc/cpuinfo | grep "model name" | cut -d " " -f3,4,5,6,7,8
echo "votre processeur est un : $infoproc" il me dis que la permission n'est pas accordée... pourquoi? merci claudius !

Hors ligne

#23 Le 26/03/2014, à 15:30

claudius01

Re : Benchmark

Bonjour,

- Avant mes remarques : Peux-tu utiliser l'icone <> de formattage de texte pour du code source. Merci

- J'ai exécuté le script, il y a 2 erreurs
o Erreur de syntaxe avec

emps ###

o Utilisation de la variable 'tempstotal' avant son utilisation

...
echo "ce calcul a été executé en "$tempstotal" secondes"
echo
echo "Le processeur avec 100% de ses capacitées aurait fait ce calcule en "$temps100pr100" secondes"
echo
echo
emps ###
utime=$((10 * ($utime2-$utime1)))
stime=$((10 * ($stime2-$stime1)))
total=$(($utime+$stime))

tempstotal=`echo $total | awk '{printf("%2d.%03d\n", $0 / 1000, $0 % 1000);}'`
...

S'agissant des droits de permissions non accordés, essaie d'être root pour lire le /proc/ car chez moi je ne reproduis pas le phénomène (sans être root ;-)

Quant au 'taskset -c 1 proc.sh', je n'ai pas eu le temps d'accueillir un second processeur dans ma machine virtuelle. A suivre...


Cordialement, A+
--
Claudius

Hors ligne

#24 Le 27/03/2014, à 12:03

ffblainvillais

Re : Benchmark

Salut, excuse moi pour le <> je ne savais pas !

Merci beaucoup comme toujours pour ton aide !

1/ ou trouve tu les erreurs de mon script (dans le sens comment, avec un logiciel ou.. ??)

2/Je veut tester mon hdd sous 2 critères: 1 le temps de création de gros fichiers, 2 le temps de création de petit fichiers.
en gros pour la création de gros fichier, je fais un <touch grosfichier.txt> ensuite je crée une boucle qui a chaque passage va ajouter une chaine de caractère dans mon fichier comme cela <>echo une grosse chaine de caratère ... >> grosfichier.txt<> cela marche bien je récupère le temps qu'il met a écrire le fichier je pense que c'est bon? Mais pour les petit fichier, aurais tu un moyen pour les créer dans la boucles? (sans qu'ils aient le même nom, sinon ils vont se remplacer... )

3/comment je peut donner des argument a mes fonction ? par exemple si je veut exécuter mon test pour le disque dur puis-je lui ordonner de créer les fichier dans le dossier indiqué par mon chemin? Genre <mafonction /home/ .... / Bureau / testhdd> ? Je voudrais aussi que si le chemin n'existe pas, que mon script me renvoi un message sur la sortie de l'erreur standard?

Encore merci de m'aider comme tu le fais claudius !
Si cela t'intéresse je mettrais en ligne mon Benchmark quand je l'aurais fini

ps: comment tu fais pour mettre certaines partie de ton texte en code source? je n'y arive pas --"

Dernière modification par ffblainvillais (Le 27/03/2014, à 12:07)

Hors ligne

#25 Le 27/03/2014, à 15:46

claudius01

Re : Benchmark

Bonjour ffblainvillais et à tous,

1) Non. En lisant le code avant, pendant et après ses exécutions y compris tout qu'il sort (et ne sort pas) à l'écran !

2) Je ne voudrais pas te décourager, mais qualifier ou du moins comparer les performances des disques durs depuis un process est une tâche ardue dans la mesure où il y a pas mal de paramètres et de conditions mis en jeu:
     - Taille des buffers avant flush si le process ne force pas ce flush
     - Écriture/Lecture caractère par caractère ou par buffer bien dimensionnés par rapport au(x) cache(s)
       (cf. linux size buffer flush)
     - Passé du disque dur (vient d'être partitionné et formaté ou non, taux de fragmentation bien que sous Linux cette fragmentation est infime - pas comme sous Windows ;-)
     - Le disque est-il en cours d'utilisation du fait de deamons en fond de tâche
     - etc.

Et de toute façon et sauf erreur de ma part, tu le qualifieras au travers des taux d'I/O qui vont se mélanger aux autres I/O comme le réseau, la mémoire, etc.

3) Si tu es amené à utiliser et donc à écrire du bash, il est impératif de rechercher, lire du code existant (comme Linux Shell Scripting Tutorial (LSST) v2.0 qui ne date pas d'hier mais c'est dans les vieux pots...), suivre des tutoriaux et tester (c'est fastidieux mais je ne connais pas d'autres méthodes ;-)
Au hasard: Introduction à la programmation en Bash  et An A-Z Index of the Bash command line for Linux. (il y a en des kilos sur le net et j'avoue que ce n'est pas facile de trouver les bonnes infos que l'on attend)

S'agissant de la gestion de fichiers temporaires : How to create temporary random file name

Pour mettre le texte en code source: Cliquer sur le 11ème icône en partant de la gauche sous "Message obligatoire" puis insérer le texte entre les balises de début et de fin ( code]  ici  [/code )


Cdlt, A+
--
Claudius

Dernière modification par claudius01 (Le 27/03/2014, à 16:20)

Hors ligne