le ps est en déroute
Par poz le vendredi 31 août 2007, 03:07 - geeking - Lien permanent
Alors là je suis fier de mon jeu de mot. Vraiment, hein..
Bon bah juste une petite news de rien : on remarque souvent qu'avec ps on a des résultats un peu chelous, voire parfois carrément aberrants, en terme d'utilisation de la mémoire. Y'a plusieurs raisons à ça. On regarde l'occupation mémoire d'un process via ps puis pmap :
$ ps -FC Thunar UID PID PPID C SZ RSS PSR STIME TTY TIME CMD poz 5426 5414 0 3409 4720 0 Aug26 ? 00:00:00 Thunar --sm-client-id 117f000101000118510838300000138390002 --daemon
Soit en gros 4M de RAM utilisée
$ pmap -d `pidof Thunar` Address Kbytes Mode Offset Device Mapping 08048000 480 r-x-- 0000000000000000 008:00002 Thunar 080c0000 8 rw--- 0000000000077000 008:00002 Thunar 080c2000 260 rw--- 00000000080c2000 000:00000 [ anon ] b727d000 64 r---- 0000000000000000 008:00002 Thunar.mo b728d000 28 r---- 0000000000000000 008:00002 libexo-0.3.mo [...] b7eed000 100 r-x-- 0000000000000000 008:00001 ld-2.5.so b7f06000 8 rw--- 0000000000019000 008:00001 ld-2.5.so bff52000 84 rw--- 00000000bff52000 000:00000 [ stack ] ffffe000 4 r-x-- 0000000000000000 000:00000 [ anon ] mapped: 13640K writeable/private: 792K shared: 84K $
On remarque que des segments de code sont comptés plusieurs fois (un segment pour la lecture, un pour l'exec, avec recouvrement). Bref, ça confirme juste ce qu'on sait déjà : ps se contente paresseusement d'afficher la quantité théorique maximale de mémoire utilisée (avec certains bouts de code en double, qui plus est), alors que les libs partagées sont pas exclusivement réservées à ce process... Bref, la "vraie" mémoire est indiquée en bas de l'output, "writeable/private: 792K".
$ cat > ~/bin/mem.sh
#!/bin/bash
function usage()
{
echo "Usage: $(basename $0) PROCESS..."
echo "display the (real) memory usage of processes"
}
if [ "$#" = "0" ]
then usage
exit 0
fi
OUT=
echo "memory usage:"
for i in $*
do
OUT=$(pidof $i | cut -d' ' -f1)
if [ "$OUT" = "" ]
then echo "[-] process '$i' does not exist"
else OUT2=$(pmap -d $OUT | grep private | awk '{print $4}')
echo "[+] ${i} (pid ${OUT}): $OUT2"
fi
done
^D
$ chmod +x ~/bin/mem.sh
$ shebang.sh ~/bin/mem.sh
$ mem.sh X firefox-bin ssh prout
memory usage:
[+] X (pid 4965): 415736K
[+] firefox-bin (pid 5582): 295068K
[+] ssh (pid 5580): 796K
[-] process 'prout' does not exist
$
Pour shebang.sh, cf. un commentaire ailleurs :)
Je sais pas trop sur les *BSD si pmap est dispo... feedback ? Pfff, 3:05 du mat', je vais être frais au taff, encore.

Commentaires
Sur mon fribi il y a : /usr/ports/sysutils/pmap