Aller au contenu | Aller au menu | Aller à la recherche

De l'inutilité de top....

J'ai recu des demandes d'un nombreux collègue pour écrire quelquechose à propos de la commande UNIX top(1).

Soyons clairs: cette commande ne sert pas à grand chose....

La question du jour était la différence entre "Size" et "Res", et la réponse à la grande question qui empèche aujourd'hui encore une meilleure compréhension de grands mystères comme l'originie de l'univers, la reproduction des huitres du bassin d'arcachon, la capacité des femmes a causer string et maquillage pendant toute une après midi ou la signification exacte des chiffres alignés sur une feuille d'impots: comment faire pour savoir *vraiment* quelle est la consommation mémoire d'un programme ?

Et, après quelques expérimentations, la réponse reste désespérément "on sait pas"....

Res indique manifestement la quantité de mémoire du processus qui est vraiment "utilisée" en mémoire vive.

Un premier test en laboratoire (attention, les enfants, ne faites pas ca chez vous, cette expérience a été réalisée par un professionel !!!) permet de constater que la mémoire n'apparaitra pas en "Res" tant qu'elle n'est pas utilisée:

int main(void){
	char *p=malloc(128*1024*1024);
	int i;
	
	sleep(10);
	printf("1");
	
	for(i=0; i<128*1024*1024; i++)
		p[i]='a';
	printf("2");
	
	sleep(5);
	printf("3");
	free(p);
	p=NULL;
	
	sleep(5);
	printf("4");
}

En exécutant ce programme, on constate que "Size" gonfle tout de suite, alors que "Res" ne gonflera que entre "1" et "2".

Par contre, si on regarde la fin de l'exécution, on constate que ni "Size" ni "Res" ne diminuent après l'appel a free(3). Après quelques instants de frayeur, ou une équipe quasi complète d'ingénierie a failli renier ses croyances les plus profondes pour aller élever des chèvres dans le larzac (je vous avais prévenu que c'est dangereux, et qu'il faut pas faire ca chez vous !!!), je tente un 2eme test: je transforme mon main() en fonction locale, et je crée un nouveau main() qui va appeler plusieurs fois d'affilée ma fonction.

La tension a tout de suite baissé d'un cran quand nous avons constaté que ni "Size" ni "Res" ne gonflaient, et que la consommation mémoire restait stable quelque soit le nombre d'appels. Ouf, l'univers peut encore continuer de fonctionner.

Mais tout ca nous a quand meme confirmé une chose: ni "Size" ni "Res" ne nous montrent la consommation "réelle" d'un programme, mais nous montrent au mieux un "pic" (et encore, je vous fais grace des caches disques qui apparaissent dans "Size", et qui peuvent ammener une équipe de développeurs a passer plusieurs journées à chasser un Memory Leak qui n'existe pas, ambiance garantie !).....

Bref, l'univers peut continuer de tourner, certes, mais c'est pas aujourd'hui que je comprendrai comment certaines de mes copines peuvent parler de leur string pendant toute une après midi........

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet