SYSTEM et de commandes à quatre lettres (4LW) dans Keeper. Il existe plusieurs façons d’examiner les résultats :
- Collecter des échantillons dans
system.trace_logavec le typeJemallocSamplepour une analyse par requête. - Afficher les statistiques mémoire en direct et récupérer des profils du tas via l’interface web jemalloc intégrée (26.2+).
- Interroger directement le profil du tas actuel depuis SQL à l’aide de
system.jemalloc_profile_text(26.2+). - Analyser la fragmentation mémoire depuis SQL à l’aide de
system.jemalloc_sampled_allocations(26.9+). - Écrire les profils du tas sur disque et les analyser avec
jeprof.
Ce guide s’applique aux versions 25.9+.
Pour les versions antérieures, veuillez consulter le guide de profilage des allocations pour les versions antérieures à 25.9.
Échantillonnage des allocations
Pour échantillonner et profiler les allocations, démarrez ClickHouse/Keeper avec la configurationjemalloc_enable_global_profiler activée :
jemalloc effectuera un échantillonnage des allocations et stockera les informations en interne.
Vous pouvez également activer l’échantillonnage pour chaque requête à l’aide du paramètre jemalloc_enable_profiler.
Stocker les échantillons jemalloc dans system.trace_log
Vous pouvez stocker les échantillons jemalloc dans system.trace_log avec le type JemallocSample.
Pour l’activer globalement, utilisez la config jemalloc_collect_global_profile_samples_in_trace_log :
jemalloc_collect_profile_samples_in_trace_log.
Exemple : analyser l’utilisation mémoire d’une requête
Commencez par exécuter une requête avec le profileur jemalloc activé, puis collectez les échantillons danssystem.trace_log :
Si ClickHouse a été démarré avec
jemalloc_enable_global_profiler, vous n’avez pas besoin d’activer jemalloc_enable_profiler.
Il en va de même pour jemalloc_collect_global_profile_samples_in_trace_log et jemalloc_collect_profile_samples_in_trace_log.system.trace_log :
Interface web jemalloc
Cette section s’applique aux versions 26.2+.
/jemalloc.
Elle affiche des métriques mémoire en temps réel sous forme de graphiques, notamment la mémoire allouée, active, résidente et mappée, ainsi que des statistiques par arène et par bin.
Vous pouvez également récupérer directement depuis l’interface des profils du tas globaux et par requête.
- ClickHouse
- Keeper
Récupération des profils du tas depuis SQL
Cette section s’applique aux versions 26.2 et ultérieures.
system.jemalloc_profile_text vous permet de récupérer et d’afficher le profil du tas jemalloc actuel directement depuis SQL, sans nécessiter d’outils externes ni d’écriture préalable sur disque.
La table comporte une seule colonne :
Vous pouvez interroger la table directement — il n’est pas nécessaire de vider au préalable un profil du tas sur disque :
Format de sortie
Le format de sortie est contrôlé par le paramètrejemalloc_profile_text_output_format, qui accepte trois valeurs :
raw— profil du tas brut généré par jemalloc.symbolized— format compatible avec jeprof, avec symboles de fonction intégrés. Les symboles étant déjà intégrés,jeprofpeut analyser la sortie sans avoir besoin du binaire ClickHouse.collapsed(par défaut) — collapsed stacks compatibles avec FlameGraph, avec une pile par ligne et le nombre d’octets correspondant.
Paramètres supplémentaires
jemalloc_profile_text_symbolize_with_inline(Bool, par défaut :true) — Indique s’il faut inclure les frames inline lors de la symbolisation. Désactiver cette option accélère considérablement la symbolisation, mais réduit la précision, car les appels de fonctions inline n’apparaîtront pas dans les piles d’appels. Affecte uniquement les formatssymbolizedetcollapsed.jemalloc_profile_text_collapsed_use_count(Bool, par défaut :false) — Lors de l’utilisation du formatcollapsed, agrège par nombre d’allocations plutôt que par octets.
Exemple : générer un flame graph à partir d’une requête SQL
Comme le format de sortie par défaut estcollapsed, vous pouvez rediriger directement la sortie vers FlameGraph :
Analyser la fragmentation depuis SQL
Cette section s’applique aux versions 26.9 et ultérieures.
system.jemalloc_arena_binsindique la quantité de mémoire gaspillée par chaque size class dans chaque arena.wastecorrespond aux octets retenus dans les slabs mais non utilisés par des allocations vivantes.purposesignale les arenas dédiées (mergetree,jit,cache) ; elles contiennent par conception des données à longue durée de vie : filtrez-les donc avecpurpose = ''lorsque vous recherchez une fragmentation inattendue.system.jemalloc_binscontient les mêmes données agrégées sur l’ensemble des arenas.system.jemalloc_sampled_allocationsliste les allocations échantillonnées actuellement vivantes, à raison d’une row par échantillon : la backtrace (trace), la durée de vie écoulée (age_ns), la taille et la size class, ainsi que l’arena. La lecture de la table déclenche un flush d’un nouveau profil du tas.
- Seuls les threads pour lesquels le profileur est activé produisent des échantillons (
jemalloc_enable_global_profilerdans le config ou le SETTINGjemalloc_enable_profiler). - Chaque row représente environ
weightallocations réelles, et les petites allocations sont rarement échantillonnées. Ajustezjemalloc_profiler_sampling_ratesi les size classes qui vous intéressent n’ont aucun échantillon. - Les allocations échantillonnées ne sont pas stockées dans des slabs, elles ne contribuent donc pas elles-mêmes à
waste. Elles vous indiquent seulement quel code alloue dans cette size class. - Chaque échantillon vivant coûte deux pages supplémentaires (128 Kio sur les builds avec des pages de 64 Kio) jusqu’à ce que l’allocation soit libérée. Désactiver le profileur empêche la création de nouveaux échantillons, mais ne libère pas ceux qui existent déjà.
Example : générer un flame graph de la fragmentation
La même requête peut répartir le gaspillage de chaque size class entre ses backtraces, proportionnellement à leur nombre d’anciennes allocations, puis afficher le résultat au format collapsed pourflamegraph.pl. Les size classes présentant du gaspillage mais dépourvues d’échantillons suffisamment anciens sont regroupées sous un frame [unattributed], de sorte que le total du flame graph corresponde au gaspillage total. Ne lisez system.jemalloc_sampled_allocations qu’une seule fois par requête : chaque lecture déclenche le flush d’un nouveau profile, si bien que deux subqueries verraient des données différentes.
Vidage des profils du tas sur disque
Si vous devez enregistrer des profils du tas sous forme de fichiers pour une analyse hors ligne avecjeprof, vous pouvez les vider sur disque.
Par défaut, le fichier de profil du tas sera généré dans /tmp/jemalloc_clickhouse._pid_._seqnum_.heap, où _pid_ est le PID de ClickHouse et _seqnum_ est le numéro de séquence global du profil du tas actuel.
Pour Keeper, le fichier par défaut est /tmp/jemalloc_keeper._pid_._seqnum_.heap et suit les mêmes règles.
Pour vider le profil actuel :
- ClickHouse
- Keeper
prof_prefix à la variable d’environnement MALLOC_CONF.
Par exemple, si vous souhaitez générer des profils dans le dossier /data avec le préfixe de nom de fichier my_current_profile, vous pouvez exécuter ClickHouse/Keeper avec la variable d’environnement suivante :
Analyse des fichiers de profil du tas avec jeprof
Après l’écriture des profils du tas sur disque, ils peuvent être analysés à l’aide de l’outil 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.shdepuis le répertoire racine. Vous obtiendrez ainsi le scriptjeprofdans le dossierbin
jeprof --help pour obtenir la liste complète des options.
Profils du tas symbolisés
À partir de la version 26.1+, ClickHouse génère automatiquement des profils du tas symbolisés lorsque vous lancez un flush avecSYSTEM JEMALLOC FLUSH PROFILE.
Le profil symbolisé (avec l’extension .symbolized) contient des symboles de fonction intégrés et peut être analysé par jeprof sans nécessiter le binaire de ClickHouse.
Par exemple, lorsque vous exécutez :
/tmp/jemalloc_clickhouse.12345.0.heap.symbolized).
Vous pouvez ensuite l’analyser directement avec jeprof :
Aucun binaire requis : lorsque vous utilisez des profils symbolisés (fichiers
.symbolized), vous n’avez pas besoin de fournir à jeprof le chemin du binaire ClickHouse. Cela facilite grandement l’analyse des profils sur différentes machines ou après une mise à jour du binaire.Pour les profils non symbolisés, Vous pouvez également utiliser
jeprof utilise addr2line pour générer des stacktraces, ce qui peut être très lent.
Si c’est le cas, il est recommandé d’installer une implémentation alternative de cet outil.llvm-addr2line, qui fonctionne tout aussi bien (mais notez que llvm-objdump n’est pas compatible avec jeprof)Utilisez-le ensuite comme ceci : jeprof --tools addr2line:/usr/bin/llvm-addr2line,nm:/usr/bin/llvm-nm,objdump:/usr/bin/objdump,c++filt:/usr/bin/llvm-cxxfilt--base :
Exemples
Utiliser des profils symbolisés (recommandé) :- Générez un fichier texte avec une procédure par ligne :
- Générez un fichier PDF contenant un graphe d’appels :
- Générez un fichier texte contenant une procédure par ligne :
- Générez un fichier PDF avec un graphe d’appels :
Génération d’un flame graph
jeprof permet de générer des collapsed stack afin de créer des flame graphs.
Vous devez utiliser l’argument --collapsed :
flamegraph.pl :
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 contrôlé avec lg_prof_sample.
Si vous souhaitez générer un profil du tas tous les N octets, vous pouvez l’activer avec lg_prof_interval.
Nous vous recommandons de consulter la page de référence de jemalloc pour obtenir la liste complète des options.
Autres ressources
ClickHouse/Keeper exposent desmetrics liées à jemalloc sous de nombreuses formes différentes.
Table système asynchronous_metrics
Table système jemalloc_bins
Contient des informations sur les allocations de mémoire effectuées via l’allocateur jemalloc dans différentes classes de taille (bins), agrégées sur l’ensemble des arenas.
Référence
Table système jemalloc_stats (26.2+)
Renvoie l’intégralité de la sortie de malloc_stats_print() dans une seule chaîne. Équivalent à la commande SYSTEM JEMALLOC STATS.
Prometheus
Toutes les métriques liées àjemalloc de asynchronous_metrics sont également exposées via le point de terminaison Prometheus dans ClickHouse et Keeper.
Référence
Commande 4LW jmst dans Keeper
Keeper prend en charge la commande 4LW jmst, qui renvoie des statistiques de base de l’allocateur :