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 :
MALLOC_CONF=background_thread:true,prof:true,prof_active:true
jemalloc effectuera un échantillonnage des allocations et stockera les informations en interne. Vous pouvez demander à jemalloc de vider le profile actuel en exécutant :
SYSTEM JEMALLOC FLUSH PROFILE
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 :
MALLOC_CONF=background_thread:true,prof:true,prof_prefix:/data/my_current_profile
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.
git clone https://github.com/gimli-rs/addr2line.git --depth=1 --branch=0.23.0
cd addr2line
cargo build --features bin --release
cp ./target/release/addr2line path/to/current/addr2line
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 :
jeprof path/to/binary path/to/heap/profile --output_format [ > output_file]
Si vous voulez comparer les allocations survenues entre deux profils, vous pouvez définir l’argument base :
jeprof path/to/binary --base path/to/first/heap/profile path/to/second/heap/profile --output_format [ > output_file]

Exemples

  • si vous voulez générer un fichier texte avec une procédure par ligne :
jeprof path/to/binary path/to/heap/profile --text > result.txt
  • si vous souhaitez générer un fichier PDF avec un graphe des appels :
jeprof path/to/binary path/to/heap/profile --pdf > result.pdf

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 :
jeprof path/to/binary path/to/heap/profile --collapsed > result.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 :
cat result.collapsed | /path/to/FlameGraph/flamegraph.pl --color=mem --title="Allocation Flame Graph" --width 2400 > result.svg
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 :
SYSTEM JEMALLOC DISABLE PROFILE
Pour activer le profileur :
SYSTEM JEMALLOC ENABLE PROFILE
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 :
MALLOC_CONF=background_thread:true,prof:true,prof_active:false
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

SELECT *
FROM system.asynchronous_metrics
WHERE metric LIKE '%jemalloc%'
FORMAT Vertical
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 :
echo jmst | nc localhost 9181
Dernière modification le 29 juin 2026