Speicherverbrauch eines Programms messen (portabel)

soul_rebel

ist immer auf der flucht
Für meine BA-Arbeit, muss ich neben Laufzeitanalysen auch den Speicherverbrauch messen. Yamagi gab mir mal den sehr hilfreichen Tipp csh mit
Code:
set time= ( 0 "%D KB avg / %K KB total / %M KB max" )
zu verwenden.

Das funkioniert auch ausgezeichnet muss ich sagen, aber leider nur unter BSD[1]. Das ist zwar praktisch zum Angeben, hilft mir aber leider nicht weiter, da ich mangels potenter Hardware remote arbeite und da halt nur Linux habe.

Gibt es etwas vergleichbares für Linux? Google bracht eine Wirwarr von python-scripts, valgrind parametern und anderem zu Tage, aber das wird ja auch einfach gehen, oder nicht?

Thx,
soul_rebel

[1] Das wird in der Manpage auch bestätigt:
Only the first four sequences are supported on systems without BSD resource limit functions.
 
/usr/bin/time spuckt mit dem -l Parameter noch ein paar zusätzliche Infos aus. Unter anderem die maximum resident set size, was meines Wissens der maximale Platz im Speicher der über die Laufzeit hinweg belegt wurde ist.
 
Linux tracked den maximalen Speicherverbrauch nicht (in RUSAGE). K.A. ob es dafuer Alternativen gibt, habe damals bei meiner DA auch darueber geflucht, denn das Lab lief nunmal mit Linux und ich konnte ploetzlich keinen Speicherverbrauch mehr messen. Super!
 
Hallo,

ich habe genau dieses Problem, deswegen hänge ich mich hier mal ran (Leichenschändung XXL).

Meine momentane Lösung geht über libmemusage, ich habe sie unten mal gepostet. Das Problem daran ist, dass der output von libmemusage halt riesig ist, und sich an das stderr des Programms dranhängt. Das lässt sich auch nicht sauber davon abkoppeln, da es ja über LD_PRELOAD real als Teil des Programms ausgeführt wird. [momentane Lösung sehr gefrickelts ge'awk'e]
Dsa zweite, noch größere Problem ist, dass es als Teil des Aufrufs mehrere Binaries ausgeführt werden, für die dann jeweils einzelne libmemusage-Ausgaben ausgegeben werden, wodurch das ganze Gefilter nicht mehr hin haut und ich nicht real das Max kriege.

Ich bin schon kurz davor libmemusage zu forken, die ganzen Statistiken aus dem Output rauszunehmen und die Ausgabe auf einen andere FD zu printen :grumble:

Habt ihr da bessere Vorschläge?

Code:
#!/bin/sh
## run the command  (with arguments passed to it)
## and output the heap peak memory usage in bytes to the output
## as well as a line with the run time in seconds
## NOTE that stderr of the command must not be redirected (other redirects
## can be passed, because command is run by extra shell)

t=`date +%s`


CMD="LD_PRELOAD=/lib/libmemusage.so
/bin/sh -c # $@ # 3>&1 1>&2 2>&3
| awk #
BEGIN {original_stderr=1};
§8 == \"peak:\" {print substr(§9, 0, length(§9)-1); original_stderr=0};
(original_stderr==1) { print §0}#
3>&1 1>&2 2>&3"
CMD=`echo $CMD | sed -e "s/\§/\$/g" -e  "s/\#/\'/g"`
## 1) explanation: preloadung libmemusage results in memory usage statistics
## being printed to stderr after program was executed
## 2) we pass all arguments to an extra shell and switch stderr and stdout
## 3) we filter stdout (formerly stderr) through awk to print original output
## and the peak heap usage, but not the other foo that libmemusage outputs
## 4) we switch the field descriptors back
## 5) we replace some symbols in the string with special characters, because
## we didnt want them to expand before (quotes and variables)

# echo $CMD
eval $CMD

t=$((`date +%s`-t))

echo $t
 
Ok, ich habe eine zuverlässige Lösung, auch wenn es im Gegensatz zur BSD-Lösung obskur ist. Poste ich später.
 
Man will sich bei Linux halt nicht durch Standards "fesseln" lassen. Nicht meine Worte und Meinung...
 
Ich sehe gerade ich habe das schon 2009 gepostet. Und dann auch noch auf der gleichen Seite ... peinlich.
 
Ich benutze einfach /usr/bin/time -l.

Unser Wasserstoff hat da tatsächlich recht unter Fedora 17:
Code:
$ /usr/bin/time -l
/usr/bin/time: invalid option -- 'l'
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
       [--portability] [--format=format] [--output=file] [--version]
       [--help] command [arg...]

Tut es aber auch nicht unter FreeBSD:
Code:
# time -l
-l: Command not found.
0.000u 0.000s 0:00.00 0.0%	0+0k 0+0io 0pf+0w
# uname -r
9.0-RELEASE-p3
 
Zurück
Oben