Re: GprBuild et GNATColl.Memory

Stephane Carrez via Ada-france <[email protected]> Mon, 5 Apr 2021 22:15:09 +0200
Newsgroups gmane.comp.lang.ada.france
Message-ID <[email protected]>
Bonjour Stéphane,

Merci pour ces informations,

On 05/04/2021 11:49, Stéphane Rivière via Ada-france wrote:
> Bonjour à toutes et tous,
> 
> 
> 
> * Contexte
> 
> Pour un projet en libre GPL v3 (gestion de cluster de serveurs avec HA -
> en multi site et réseau privé, ça nous a déjà bien servi avec l'incendie
> de SBG2 d'OVH d'ailleurs), on a monté une petite biblio généraliste pour
> des progs en mode texte.
> 
> Comme c'est aussi pour des services qui vont tourner 365/24, j'ai voulu
> utiliser le package gnatcoll.memory pour observer la conso des objets
> créés :
> 
> - créer dans le chemin des sources un s-memory.adb selon un modèle
> - rajouter with "gnatcoll" en haut du projet GprBuild
> - utiliser avec un with gnatcoll.memory
> - appeler les quelques fonctions du package pour 'mesurer'.
> 
> C'est simple à utiliser et cerise sur le gâteau : /on peut laisser la
> manip dans la version PROD/ car c'est activable par un Boolean quand on
> le souhaite sans consommation de ressource quand c'est inactif.
> 
> C'est donc un bon complément de Valgrind pour partir à la recherche des
> octets perdus - quand on ne dispose par d'un full GNAT Pro...
> 
> Et ces mesures peuvent être activées au moment d'une exception non
> récupérable et écrite dans un fichier d'erreur, ce que fait, entre
> autres, cette petite biblio.
> 
> 

On rencontre régulièrement le problème d'identifier où la mémoire est utilisée et par qui.

En 2015 j'ai utilisé mon outil MAT (Memory Analysis Tool) pour réduire la consommation mémoire de la Box Bouygues Telecom.
Comme c'est du Mips embarqué, pas de valgrind possible et coté mémoire on ne dispose que de 128Mb avec un gcc 4.4...

Le principe est d'utiliser le LD_PRELOAD pour charger une librairie dynamique qui surcharge malloc, free, realloc.
Cette librairie C (petite) enregistre tous les appels avec backtrace complet dans un fichier (ou envoi vers un port TCP/IP).
Le fichier (binaire assez gros) est ensuite analysé par MAT, qui lui est écrit en Ada :-), et qui tourne sur le PC de dev.

L'avantage de mon approche est qu'on ne re-compile pas le binaire et que cela fonctionne aussi pour un
programme C lambda (pas d'Ada sur la Bbox!).  Cela m'a permis de voir quelles structures sont consommatrices
de mémoire, par qui elles sont allouées et comment optimiser et réduire la consommation mémoire.

valgrind est trés précieux (avec massif ou cachegrind) mais j'utilise parfois encore MAT bien que
son utilisation soit... parfois pas toujours aussi évidente.

Plus d'info sur: https://github.com/stcarrez/mat

J'avais fait des packets Debian, je peux en re-faire si cela intéresse les gens.

A+,

Stephane
_______________________________________________
Ada-france mailing list
[email protected]
https://mail.ada-france.org/cgi-bin/mailman/listinfo/ada-france