Schrift
[thread]12183[/thread]

Ausgabe von mpstat um Uhrzeit erweitern



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2008-07-15 15:48
#112136 #112136
/usr/bin/mpstat [-aq] [-p | -P set] [interval [count]]

DESCRIPTION
The mpstat command reports processor statistics in tabular
form. Each row of the table represents the activity of one
processor. The first table summarizes all activity since
boot. Each subsequent table summarizes activity for the
preceding interval. All values are rates listed as events
per second unless otherwise noted.

Um die Daten nchgelagert auswerten und mit anderen Monitoringdaten korrellieren zu können, möchte ich den Output vom mpstat um die Uhrzeit erweitern.

Leider habe ich nur hinbekommen, dass am Ende der mpstat Ausführung die Uhrzeit für alle Zeilen und dann natürlich überall die selbe ausgegeben wird und nicht wie gewünscht für jede Tabelle die Zeit in der diese ausgegeben wurde. Mehr habe ich mit pipe und fork nicht hinbekommen.

Es ist keine Alternative mpstat n mal aufzurufen, da die Daten dann nicht korrekt sind und eine höhere Systemlast erzeugen, die die Werte zus. verfälschen.

Wäre super, wenn mir da jemand helfen könnte.

Danke und Gruß. Ringo.
GwenDragon
 2008-07-15 16:07
#112137 #112137
User since
2005-01-17
14607 Artikel
Admin1
[Homepage]
user image
Ausgabe in eigene Logdatei umleiten.
Als erstes Datum und Uhrzeit ins Log, dann Ausgabe von mpstat in das Log pipen.

Das wärs.
RalphFFM
 2008-07-15 18:56
#112157 #112157
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Eine Idee: Falls bei jeder Aktivität von mpstat ein gleichbleibendes Pattern ausgegeben würde, dann müßte man mittels Pipe den jeweils aktuellen Zeitstempel einfügen können.
Gast Gast
 2008-07-15 19:24
#112158 #112158
Vorschlag von GwennDragon:
Ich möchte die Uhrzeit - jede Sekunde eine neue - am Anfang der Zeilen des in dieser Sekunde erzeugten Outputs von mpstat.
Da ich als Ziel mpstat durchaus als mpstat 1 100000 fahren möchte, habe ich von einem Datum in der ersten Zeile nix.

Vorschlag von RalphFFM:
Mit Pipe habe ich schon rumgespielt (soweit ich das halt richtig verstanden habe). Leider bekomme ich mit Pipe erst am Ende den gesamten Output und dann haben alle Zeilen wieder die selbe Uhrzeit - das Ende der Ausführung von mpstat. Das nützt mir auch nix.

Falls Ihr ein Unixsystem habt, bitte mal kurz mpstat 1 10 ausprobieren.
Ich möchte vor jeder Zeile des Output die Uhrzeit der Sekunde haben, in der der Output erzeugt wurde. Im Beispiel gibt mpstat jede Sekunde eine komplette Tabelle aus und jede Sekunde soll dann vor jede Zeile dieser Tabelle die entsprechende Zeit porotokolliert werden.

Wenn niemand eine echte Idee hat, bleibt mir nix anderes übrig als in Abhängigkeit der Startzeit die Zeilen zu zählen und je nach Zahl der Zeile n Sekunden hinzuzählen müssen.
Das mit der Pipe hätte ich eleganter gefunden und hätte erwartet, dass sowas schon mal jemand mit perl gemacht hat.
Leider kann man das mit dem mir zur Verfügung stehenden sed bzw. awk nicht machen, sonst hätte ich es damit umgesetzt.

Danke und Gruß. Ringo.
RalphFFM
 2008-07-15 23:54
#112173 #112173
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich habe kein mpstat installiert, nehme daher mal echo zum etwas Stdin zu generieren.
Ich hätte gedacht, daß etwas in der Art
Code: (dl )
1
2
3
4
ralph@himmel:~$ while true; do echo "inputstream"; sleep 1; done | sed -e "s/^/`date` /"
Di 15. Jul 21:44:40 CEST 2008 inputstream
Di 15. Jul 21:44:40 CEST 2008 inputstream
Di 15. Jul 21:44:40 CEST 2008 inputstream
funktioniert. Klappt aber nicht. Kann jemand erklären wieso das date scheinbar nur einmal beim Prozeßstart evaluiert wird? (Das möchte ich doch gerne wissen.)
Gast Gast
 2008-07-16 12:16
#112191 #112191
Hallo RalphFFM

Da sed keine eigene date Funktion hat, musstes Du `date` in einer Subshell ermitteln und an sed übergeben. Das ganze wird nur einmal ausgewertet, sprich das date in sed sogar als erstes um sed zu parametriesieren.
Dannach wird alles was die while schleife ausgibt mit diesem festen sed ausgewertet und dementsprechend hat der Output immer das selbe Datum.

Wer mpstat nicht hat, kann das Ganze kann man auch mit sar, vmstat oder anderen Tools ausprobieren, die in definiertem Abstand n neue Zeilen ausgeben.

Da der Aufruf von mpstat nur einmal erfolgen soll, ist es auch keine Alternative, das sed in die Schleife zu integrieren.

Das selbe Problem hat mit dem Standard awk (keine eigene date funktion).

Deshalb dachte ich an perl, wo man deutlich mehr Möglichkeiten haben sollte,
aber wie gesagt, habe es nur hinbekommen, dass am Ende das Datum für alle Zeilen gleich ist. Im Beispiel noch ohne Ausgabe des Datums, aber die Ausgabe erfolgt erst am Ende von mpstat statt wie gehofft Sekunde für Sekunde.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl -w

pipe(LESE_HANDLE, SCHREIB_HANDLE);
my $Kind_pid = fork();

if ($Kind_pid) {
close(LESE_HANDLE);
my $old_handle = select(SCHREIB_HANDLE);
$| = 1;
print SCHREIB_HANDLE qx(mpstat 1 10);
close(SCHREIB_HANDLE);
wait;
select($old_handle);
} else {
close(SCHREIB_HANDLE);
my $Speicher;
while(defined($Speicher = <LESE_HANDLE>)) {
print "Empfangen: $Speicher \n";
}
exit(0);
}


//ModEdit GwenDragon: CODE-Tags hinzugefügt
nepos
 2008-07-16 15:14
#112197 #112197
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, warum rufst du mpstat nicht direkt via open() auf:
Code (perl): (dl )
open(my $mpstat, "mpstat 1 10|") or ...

Und dann liest du einfach Zeilenweise den Output von mpstat?
Gast Gast
 2008-07-16 18:29
#112210 #112210
Hallo,

habe ich auch schon ausprobiert.
Aber open gibt mir auch erst die Chance die eingelesenen Daten weiterzuverarbeiten, wenn open fertig ist, sprich wenn das mpstat fertig ist.

Ich möchte aber während mpstat (open) noch arbeitet, den output online erweitern.

Irgendwie bekomme ich das net hin.

Danke und Gruß. Ringo
nepos
 2008-07-16 19:25
#112214 #112214
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also, sowas geht bei mir 1a:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

my $cmd = '/usr/bin/vmstat 1 10|';

open(my $fh, $cmd)
        or die "Error executing vmstat: $!";

while ( my $line = <$fh> ) {
        print $line;
        print '-' x 70, "\n";
}
close($fh);


Das ergibt folgendes:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
----------------------------------------------------------------------
r b swpd free buff cache si so bi bo in cs us sy id wa
----------------------------------------------------------------------
1 0 64 954680 35300 272440 0 0 11 18 43 21 3 0 97 0
----------------------------------------------------------------------
0 0 64 954176 35300 272440 0 0 0 0 1082 397 3 0 97 0
----------------------------------------------------------------------
0 0 64 954176 35300 272440 0 0 0 0 1084 397 1 0 99 0
----------------------------------------------------------------------
1 0 64 954176 35308 272440 0 0 0 48 1084 388 1 1 97 1
----------------------------------------------------------------------
0 0 64 954208 35308 272440 0 0 0 0 1084 398 2 0 98 0
----------------------------------------------------------------------
0 0 64 954208 35308 272440 0 0 0 0 1081 378 1 0 99 0
----------------------------------------------------------------------
1 0 64 954208 35308 272440 0 0 0 0 1084 395 1 1 98 0
----------------------------------------------------------------------
0 0 64 954208 35308 272440 0 0 0 0 1081 375 2 0 98 0
----------------------------------------------------------------------
0 0 64 954224 35308 272440 0 0 0 0 1084 400 1 0 99 0
----------------------------------------------------------------------
0 0 64 954224 35308 272440 0 0 0 0 1081 362 2 0 98 0
----------------------------------------------------------------------
Linuxer
 2008-07-16 19:29
#112215 #112215
User since
2006-01-27
3881 Artikel
HausmeisterIn

user image
Du kannst doch zeilenweise aus einer Pipe lesen?

Mangels eines mpstat auf dem System hier, muss ich mit einem Workaround arbeiten:

Code: (dl )
1
2
mpstat.pl
--8<--
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
# vim: set ts=4 sw=4 et sta:
use strict;
use warnings;


open my $pipe, './mpstat.sh |' or die "Pipe failed: $!\n";

while ( my $line = <$pipe> ) {

    my $time = localtime;

    local $, = ' ';
    print $time, $line;
}

close $pipe or die "Pipe failed: $!\n";
Code: (dl )
1
2
3
4
5
6
7
8
mpstat.sh
--8<--
#!/bin/bash

for x in 1 2 3; do
echo "Wert $x"
sleep 1
done


Ausgabe:
Code: (dl )
1
2
3
Wed Jul 16 17:29:06 2008 Wert 1
Wed Jul 16 17:29:07 2008 Wert 2
Wed Jul 16 17:29:08 2008 Wert 3


Wo ist Dein Problem genau?

update:
und hier mit vmstat (danke an nepos für seinen Beitrag):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;

my $cmd = '/usr/bin/vmstat 1 3';

$| = 1;

open my $pipe, '-|', $cmd or die "$cmd: can't read from pipe: $!\n";

while ( my $line = <$pipe> ) {
    my $time = localtime;

    local $, = ' '; # Leerzeichen explizit angegeben (wg. Highlighting); war $"
    print $time, $line;
}

close $pipe;


[edit]Code angepasst wg. Forum-Highlighting[/edit]
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-07-15 15:48.