Compartiments Malloc

Malloc buckets fournit une extension facultative basée sur les compartiments du module d'allocation par défaut.

Il vise à améliorer les performances malloc des applications qui émettent un grand nombre de petites demandes d'allocation. Lorsque malloc buckets est activé, les demandes d'allocation relevant d'une plage prédéfinie de tailles de bloc sont traitées par des malloc buckets. Toutes les autres demandes sont traitées de la manière habituelle par le module d'allocation par défaut.

Malloc buckets n'est pas activé par défaut. Il est activé et configuré avant le démarrage du processus en définissant la variable d'environnement MALLOCOPTIONS .

Composition et dimensionnement des compartiments

Un compartiment est constitué d'un bloc de mémoire qui est subdivisé en un nombre prédéterminé de blocs plus petits de taille uniforme, dont chacun est une unité de mémoire allouable. Chaque compartiment est identifié à l'aide d'un numéro de compartiment. Le premier compartiment est le compartiment 0, le deuxième compartiment est le compartiment 1, le troisième compartiment est le compartiment 2, et ainsi de suite. Le premier compartiment est le plus petit, et chaque compartiment suivant est plus grand que le compartiment précédent, à l'aide d'une formule décrite plus loin dans cette section. Un maximum de 128 compartiments sont disponibles par segment de mémoire.

La taille de bloc de chaque compartiment est un multiple d'un facteur de taille de compartiment. Le facteur de taille de compartiment est égal à la taille de bloc du premier compartiment. Chaque bloc du deuxième compartiment a deux fois cette taille, chaque bloc du troisième compartiment a trois fois cette taille, et ainsi de suite. Par conséquent, la taille de bloc d'un compartiment donné est déterminée comme suit:

block size = (bucket number + 1) * bucket sizing factor

Par exemple, un facteur de taille de compartiment de 16 donnerait une taille de bloc de 16 octets pour le premier compartiment (compartiment 0), de 32 octets pour le deuxième compartiment (compartiment 1), de 48 octets pour le troisième compartiment (compartiment 2), etc.

Le facteur de taille de compartiment doit être un multiple de 8 pour les implémentations 32 bits et un multiple de 16 pour les implémentations 64 bits afin de garantir que les adresses renvoyées par les fonctions de sous-système malloc sont correctement alignées pour tous les types de données.

La taille de compartiment pour un compartiment donné est déterminée comme suit:

bucket size = number of blocks per bucket * (malloc overhead +
              ((bucket number + 1) * bucket sizing factor))

La formule précédente peut être utilisée pour déterminer le nombre réel d'octets requis pour chaque compartiment. Dans cette formule, le temps système malloc fait référence à la taille d'une construction malloc interne requise pour chaque bloc du compartiment. Cette construction interne a une longueur de 8 octets pour les applications 32 bits et de 16 octets pour les applications 64 bits. Il ne fait pas partie de l'espace allouable disponible pour l'utilisateur, mais fait partie de la taille totale de chaque compartiment.

Le nombre de blocs par compartiment, le nombre de compartiments et le facteur de taille de compartiment sont tous définis avec la variable d'environnement MALLOCOPTIONS .

Traitement des allocations à partir des compartiments

Un bloc est alloué à partir de l'un des compartiments chaque fois que des compartiments malloc sont activés et qu'une demande d'allocation est comprise dans la plage de tailles de bloc définie par les compartiments. Chaque demande d'allocation est traitée à partir du plus petit intervalle possible pour économiser de l'espace.

Si une demande d'allocation est reçue pour un compartiment et que tous ses blocs sont déjà alloués, les compartiments malloc agrandissent automatiquement le compartiment pour traiter la demande. Le nombre de nouveaux blocs ajoutés pour agrandir un compartiment est toujours égal au nombre de blocs initialement contenus dans le compartiment, qui est configuré en définissant la variable d'environnement MALLOCOPTIONS .

Prise en charge du traitement multisegment de mémoire

La fonction multisegment de mémoire malloc permet d'activer plusieurs segments de mémoire malloc pour améliorer les performances des applications à unités d'exécution s'exécutant sur des systèmes multiprocesseurs. Les compartiments Malloc prennent en charge jusqu'à 128 compartiments par segment de mémoire. Cela permet au sous-système malloc de prendre en charge l'activation simultanée des compartiments malloc et des segments de mémoire multiples malloc afin que les processus à unités d'exécution s'exécutant sur des systèmes multiprocesseurs puissent bénéficier de l'algorithme des compartiments.

Activation des compartiments malloc

Les compartiments Malloc ne sont pas activés par défaut, mais ils sont activés et configurés en définissant les variables d'environnement suivantes:

  • MALLOCTYPE
  • MALLOCOPTIONS

La variable d'environnement MALLOCTYPE doit être définie sur l'allocateur par défaut lors de l'utilisation des compartiments Malloc. Pour activer les compartiments malloc avec les paramètres par défaut, définissez MALLOCOPTIONS=buckets avant le démarrage du processus. Pour activer les compartiments malloc avec des options de configuration définies par l'utilisateur, définissez MALLOCOPTIONS=buckets,options avant le démarrage du processus, où options est une liste séparée par des virgules d'une ou plusieurs options de configuration prédéfinies.

Options de configuration des compartiments Malloc

La variable d'environnement MALLOCOPTIONS peut être utilisée pour fournir des compartiments malloc avec une ou plusieurs des options de configuration prédéfinies suivantes:

number_of_buckets:n
bucket_sizing_factor:n
blocks_per_bucket:n
bucket_statistics:[stdout|stderr|pathname]
no_mallinfo

Chacune de ces options est décrite en détail dans MALLOCOPTIONS.

Pour définir la variable d'environnement MALLOCOPTIONS , utilisez la syntaxe suivante:

MALLOCOPTIONS=[buckets,[ number_of_buckets:n | bucket_sizing_factor:n | blocks_per_bucket:n |
bucket_statistics:[stdout|stderr|pathname] | no_mallinfo],...]

Plusieurs options peuvent être spécifiées (et dans n'importe quel ordre), à condition que les options soient séparées par des virgules, par exemple:

MALLOCOPTIONS=buckets,number_of_buckets:128,bucket_sizing_factor:8,bucket_statistics:stderr
MALLOCOPTIONS=buckets,bucket_statistics:stdout,blocks_per_bucket:512

Les virgules sont les seuls délimiteurs valides pour séparer les options de configuration dans cette syntaxe. L'utilisation d'autres délimiteurs (tels que des blancs) entre les options entraîne une analyse syntaxique incorrecte des options de configuration.

Chaque option de configuration ne doit être spécifiée qu'une seule fois lors de la définition de la variable d'environnement MALLOCOPTIONS . Si une option de configuration est spécifiée plusieurs fois par paramètre, seule l'instance finale s'applique.

Si une option de configuration est spécifiée avec une valeur non valide, les compartiments malloc écrivent un message d'avertissement dans une erreur standard, puis poursuivent l'exécution en utilisant une valeur par défaut documentée.

Les options de configuration des compartiments Malloc sont reconnues par le sous-système malloc uniquement si l'option buckets est définie, comme dans l'exemple suivant:
MALLOCOPTIONS=number_of_buckets:8,buckets,bucket_statistics:stderr

Options des compartiments Malloc

nombre_de_bennes :n
L'option number_of_buckets:n permet de spécifier le nombre d'intervalles disponibles par segment de mémoire, où n correspond au nombre d'intervalles. La valeur spécifiée pour n s'appliquera à tous les segments de mémoire disponibles.

La valeur par défaut de number_of_buckets est 16. La valeur minimale autorisée est 1. La valeur maximale autorisée est 128.

facteur_de_taille_du_seau :n
L'option bucket_sizing_factor:n peut être utilisée pour spécifier le facteur de taille de compartiment, où n est le facteur de taille de compartiment en octets.

La valeur spécifiée pour bucket_sizing_factor doit être un multiple de 8 pour les implémentations 32 bits et un multiple de 16 pour les implémentations 64 bits. La valeur par défaut de bucket_sizing_factor est 32 pour les implémentations 32 bits et 64 pour les implémentations 64 bits.

blocs_par_bucket :n
L'option blocks_per_bucket:n peut être utilisée pour spécifier le nombre de blocs initialement contenus dans chaque compartiment, où n correspond au nombre de blocs. Cette valeur est appliquée à tous les compartiments. La valeur n est également utilisée pour déterminer le nombre de blocs à ajouter lorsqu'un compartiment est automatiquement agrandi car tous ses blocs ont été alloués.

La valeur par défaut de blocks_per_bucket est 1024.

bucket_statistics: [stdout|stderr|nom_chemin]
L'option bucket_statistics permet au sous-système malloc de générer un récapitulatif statistique des compartiments malloc lors de l'arrêt normal de chaque processus qui appelle le sous-système malloc alors que les compartiments malloc sont activés. Ce récapitulatif affiche les informations de configuration des compartiments et le nombre de demandes d'allocation traitées pour chaque compartiment. Si plusieurs segments de mémoire ont été activés à l'aide de plusieurs segments de mémoire malloc, le nombre de demandes d'allocation affichées pour chaque compartiment sera la somme de toutes les demandes d'allocation traitées pour ce compartiment pour tous les segments de mémoire.

Le récapitulatif statistique des intervalles sera écrit dans l'une des destinations de sortie suivantes, comme indiqué avec l'option bucket_statistics.

  • stdout -sortie standard
  • stderr -erreur standard
  • pathname -nom de chemin spécifié par l'utilisateur

Si un nom de chemin spécifié par l'utilisateur est fourni, la sortie statistique est ajoutée au contenu existant du fichier (le cas échéant).

La sortie standard ne doit pas être utilisée comme destination de sortie pour un processus dont la sortie est dirigée en tant qu'entrée dans un autre processus.

L'option bucket_statistics est désactivée par défaut.

Remarque: Une demande d'allocation supplémentaire est toujours affichée dans le premier compartiment pour la sous-routine atexit qui imprime le récapitulatif statistique. Pour les processus à unités d'exécution, des demandes d'allocation supplémentaires sont affichées pour certains compartiments en raison des appels de sous-système malloc émis par la bibliothèque pthreads.
no_mallinfo
Si vous spécifiez MALLOCOPTIONS=no_mallinfo, le paramètre mallinfo est désactivé et les informations sur le segment de mémoire géré par le sous-système malloc ne sont pas consignées.

Configuration par défaut des compartiments Malloc

Le tableau suivant récapitule la configuration par défaut des compartiments malloc.

Option de configuration Valeur par défaut (32 bits) Valeur par défaut (64 bits)
nombre d'intervalles par segment de mémoire 16 16
facteur de taille de compartiment 32 octets 64 octets
plage d'allocation 1 à 512 octets (inclus) 1 à 1024 octets (inclus)
nombre de blocs initialement contenus dans chaque compartiment 1024 1024
récapitulatif statistique des intervalles désactivé désactivé

La configuration par défaut des compartiments malloc doit être suffisante pour améliorer les performances de nombreuses applications qui émettent un grand nombre de petites demandes d'allocation. Toutefois, il est possible d'obtenir des gains supplémentaires en définissant la variable d'environnement MALLOCOPTIONS pour modifier la configuration par défaut. Avant de modifier la configuration par défaut, familiarisez-vous avec les exigences et l'utilisation de la mémoire de l'application. Les compartiments Malloc peuvent ensuite être activés avec l'option bucket_statistics pour optimiser la configuration des compartiments.

Restrictions

En raison de variations dans les exigences et l'utilisation de la mémoire, certaines applications peuvent ne pas bénéficier du schéma d'allocation de mémoire utilisé par les compartiments malloc. Par conséquent, il n'est pas conseillé d'activer les compartiments malloc pour une utilisation à l'échelle du système. Pour des performances optimales, les compartiments malloc doivent être activés et configurés par application.