Passer au contenu principal
ClickHouse utilise jemalloc comme allocateur global. Jemalloc est livré avec des outils d’échantillonnage et de profilage des allocations. Pour faciliter le profilage des allocations, des commandes SYSTEM sont disponibles, ainsi que des commandes à quatre lettres (4LW) dans Keeper.

Échantillonnage des allocations et écriture des profils du tas

Si vous souhaitez échantillonner les allocations et en établir le profil dans jemalloc, vous devez démarrer ClickHouse/Keeper avec le profilage activé à l’aide de la variable d’environnement MALLOC_CONF :
jemalloc effectuera un échantillonnage des allocations et stockera les informations en interne. Vous pouvez demander à jemalloc de vider le profile actuel en exécutant :
Par défaut, le fichier de profil de tas sera généré dans /tmp/jemalloc_clickhouse._pid_._seqnum_.heap, où _pid_ est le PID de ClickHouse et _seqnum_ le numéro de séquence global du profil de tas actuel. Pour Keeper, le fichier par défaut est /tmp/jemalloc_keeper._pid_._seqnum_.heap et suit les mêmes règles. Un autre emplacement peut être défini en ajoutant l’option prof_prefix à la variable d’environnement MALLOC_CONF. Par exemple, si vous souhaitez générer des profiles dans le dossier /data, avec my_current_profile comme préfixe du nom de fichier, vous pouvez exécuter ClickHouse/Keeper avec la variable d’environnement suivante :
Le fichier généré sera ajouté à la suite du préfixe PID et du numéro de séquence.

Analyse des profils de tas

Une fois les profils de tas générés, ils doivent être analysés. Pour cela, vous pouvez utiliser l’outil de jemalloc appelé jeprof. Il peut être installé de plusieurs façons :
  • À l’aide du gestionnaire de paquets du système
  • En clonant le dépôt jemalloc et en exécutant autogen.sh depuis le dossier racine. Cela fournit le script jeprof dans le dossier bin
jeprof utilise addr2line pour générer des traces de pile, ce qui peut être très lent. Si c’est le cas, il est recommandé d’installer une implémentation alternative de cet outil.
jeprof permet de générer de nombreux formats différents à partir d’un profil de tas. Il est recommandé d’exécuter jeprof --help pour obtenir des informations sur son utilisation et sur les différentes options proposées par l’outil. De manière générale, la commande jeprof s’utilise comme suit :
Si vous voulez comparer les allocations survenues entre deux profils, vous pouvez définir l’argument base :

Exemples

  • si vous voulez générer un fichier texte avec une procédure par ligne :
  • si vous souhaitez générer un fichier PDF avec un graphe des appels :

Génération d’un flame graph

jeprof permet de générer des piles d’appels compactées pour créer des flame graphs. Vous devez utiliser l’argument --collapsed :
Après cela, vous pouvez utiliser de nombreux outils pour visualiser les piles d’appels compactées. Le plus populaire est FlameGraph, qui contient un script appelé flamegraph.pl :
Un autre outil intéressant est speedscope, qui vous permet d’analyser les stacks collectées de manière plus interactive.

Contrôler le profileur d’allocation à l’exécution

Si ClickHouse/Keeper est démarré avec le profileur activé, des commandes supplémentaires permettant d’activer ou de désactiver le profilage des allocations à l’exécution sont disponibles. L’utilisation de ces commandes facilite le profilage sur des intervalles spécifiques uniquement. Pour désactiver le profileur :
Pour activer le profileur :
Il est également possible de contrôler l’état initial du profileur en définissant l’option prof_active, activée par défaut. Par exemple, si vous ne souhaitez pas échantillonner les allocations au démarrage, mais seulement ensuite, vous pouvez activer le profileur. Vous pouvez démarrer ClickHouse/Keeper avec la variable d’environnement suivante :
Le profileur peut être activé plus tard.

Options supplémentaires pour le profileur

jemalloc propose de nombreuses options liées au profileur. Elles peuvent être configurées en modifiant la variable d’environnement MALLOC_CONF. Par exemple, l’intervalle entre les échantillons d’allocation peut être réglé avec lg_prof_sample. Si vous souhaitez générer un dump du profil de tas tous les N octets, vous pouvez l’activer avec lg_prof_interval. Il est recommandé de consulter la page de référence de jemalloc pour obtenir la liste complète des options.

Autres ressources

ClickHouse/Keeper exposent des métriques liées à jemalloc de différentes manières.
AvertissementIl est important de noter qu’aucune de ces métriques n’est synchronisée avec les autres et que leurs valeurs peuvent varier.

Table système asynchronous_metrics

Référence

Table système jemalloc_bins

Contient des informations sur les allocations mémoire effectuées par l’allocateur jemalloc dans différentes classes de taille (bins), agrégées depuis l’ensemble des arenas. Référence

Prometheus

Toutes les métriques liées à jemalloc provenant de asynchronous_metrics sont également exposées via le endpoint Prometheus dans ClickHouse et Keeper. Référence

Commande 4LW jmst dans Keeper

Keeper prend en charge la commande 4LW jmst, qui renvoie les statistiques de base de l’allocateur :
Dernière modification le 1 juillet 2026