[LINUX] Gestion de la mémoire »Présentation des concepts

À l'origine, il fait partie du code source du noyau Linux, il sera donc traité comme GPLv2 (reconnaissance qu'il devrait l'être).

https://www.kernel.org/doc/html/latest/index.html

Licensing documentation

The following describes the license of the Linux kernel source code (GPLv2), how to properly mark the license of individual files in the source tree, as well as links to the full license text.

https://www.kernel.org/doc/html/latest/process/license-rules.html#kernel-licensing

https://www.kernel.org/doc/html/latest/admin-guide/mm/concepts.html

Concepts overview

The memory management in Linux is a complex system that evolved over the years and included more and more functionality to support a variety of systems from MMU-less microcontrollers to supercomputers.

La gestion de la mémoire Linux est un système complexe qui a été amélioré au fil des ans et qui a la fonctionnalité de prendre en charge une grande variété de systèmes, des microcontrôleurs sans MMU aux supercalculateurs.

The memory management for systems without an MMU is called nommu and it definitely deserves a dedicated document, which hopefully will be eventually written.

La gestion de la mémoire pour les systèmes qui n'ont pas de MMU s'appelle nommu. Et il ne fait aucun doute qu'il vaut la peine de fournir un document dédié.

Yet, although some of the concepts are the same, here we assume that an MMU is available and a CPU can translate a virtual address to a physical address.

Cependant, bien que certains concepts soient les mêmes, nous supposons qu'il existe des MMU disponibles et que le processeur peut traduire des adresses virtuelles en adresses physiques.

Virtual Memory Primer

The physical memory in a computer system is a limited resource and even for systems that support memory hotplug there is a hard limit on the amount of memory that can be installed.

La mémoire physique d'un système informatique est une ressource limitée, et même si le système prend en charge les hotplugs de mémoire, il existe des restrictions strictes sur la quantité de mémoire qui peut être installée.

The physical memory is not necessarily contiguous; it might be accessible as a set of distinct address ranges.

La mémoire physique ne nécessite pas de continuité. Parfois, il est accessible en tant que plage d'adresses distincte.

Besides, different CPU architectures, and even different implementations of the same architecture have different views of how these address ranges are defined.

De plus, différentes architectures de CPU, ou même la même architecture mais différentes implémentations, peuvent avoir différentes apparences de plages d'adresses.

.

All this makes dealing directly with physical memory quite complex and to avoid this complexity a concept of virtual memory was developed.

Cela a rendu la gestion directe de la mémoire physique très compliquée, et le concept de mémoire virtuelle a été développé pour éviter cette complexité.

The virtual memory abstracts the details of physical memory from the application software, allows to keep only needed information in the physical memory (demand paging) and provides a mechanism for the protection and controlled sharing of data between processes.

La mémoire virtuelle fait abstraction des détails de la mémoire physique vers le logiciel d'application, ce qui lui permet d'être conservé dans la mémoire physique (demandes de page) et fournit un mécanisme de protection des données et de partage de données entre les processus. ..

.

With virtual memory, each and every memory access uses a virtual address.

Lors de l'utilisation de la mémoire virtuelle, tous les accès à la mémoire se font via l'adresse virtuelle.

When the CPU decodes the an instruction that reads (or writes) from (or to) the system memory, it translates the virtual address encoded in that instruction to a physical address that the memory controller can understand.

Lorsque le CPU décode une instruction pour lire ou écrire à partir de la mémoire système, il traduit "l'adresse virtuelle" en une "adresse physique" afin que le contrôleur de mémoire puisse la comprendre.

.

The physical system memory is divided into page frames, or pages.

La mémoire système physique est divisée en cadres de page ou en pages.

The size of each page is architecture specific.

La taille de chaque page dépend de l'architecture.

Some architectures allow selection of the page size from several supported values; this selection is performed at the kernel build time by setting an appropriate kernel configuration option.

Selon l'architecture, vous pouvez choisir parmi plusieurs valeurs prenant en charge les tailles de page. Cette sélection peut être sélectionnée avec l'option de configuration du noyau lors de la construction du noyau.

.

Each physical memory page can be mapped as one or more virtual pages.

Chaque page de mémoire physique peut être mappée à une ou plusieurs pages virtuelles.

These mappings are described by page tables that allow translation from a virtual address used by programs to the physical memory address. The page tables are organized hierarchically.

Ce mappage est répertorié dans les tableaux de page, qui traduit par programme l'adresse physique en une source de mémoire physique. Ce tableau de page est organisé de manière hiérarchique.

.

The tables at the lowest level of the hierarchy contain physical addresses of actual pages used by the software.

Le tableau en bas de la hiérarchie contient les adresses physiques des pages réelles utilisées par le logiciel.

The tables at higher levels contain physical addresses of the pages belonging to the lower levels.

Le tableau du niveau supérieur contient les adresses physiques des pages contenues dans le niveau inférieur.

The pointer to the top level page table resides in a register.

Le pointeur de la table du haut est dans le registre.

When the CPU performs the address translation, it uses this register to access the top level page table.

Lorsque la CPU tente de traduire une adresse, elle utilise ce registre via la table des pages de niveau supérieur.

The high bits of the virtual address are used to index an entry in the top level page table.

Les bits de poids fort de l'adresse virtuelle sont utilisés pour indiquer des entrées dans la table de pages de haut niveau.

That entry is then used to access the next level in the hierarchy with the next bits of the virtual address as the index to that level page table.

Cette entrée est utilisée pour accéder au niveau suivant dans la hiérarchie, en utilisant le bit suivant de l'adresse virtuelle comme index de la table de pages pour ce niveau.

The lowest bits in the virtual address define the offset inside the actual page.

Les bits les plus bas de l'adresse virtuelle définissent le décalage de page réel.

Huge Pages

The address translation requires several memory accesses and memory accesses are slow relatively to CPU speed.

La traduction d'adresses nécessite plusieurs accès mémoire, qui sont lents par rapport à la vitesse du processeur.

To avoid spending precious processor cycles on the address translation, CPUs maintain a cache of such translations called Translation Lookaside Buffer (or TLB).

Pour éviter d'utiliser un cycle de processus précieux pour la traduction d'adresses, le processeur dispose d'un cache de traduction appelé Translation Lookaside Buffer (TLB).

Usually TLB is pretty scarce resource and applications with large memory working set will experience performance hit because of TLB misses.

Les TLB sont généralement de très faibles ressources et TLB manque de performances lentes sur les grands ensembles d'utilisation de la mémoire.

.

Many modern CPU architectures allow mapping of the memory pages directly by the higher levels in the page table. For instance, on x86, it is possible to map 2M and even 1G pages using entries in the second and the third level page tables.

Oki, la dernière architecture de processeur, peut mapper les pages mémoire directement en haut du tableau des pages. Par exemple, x86 vous permet de mapper 2M à 1G en utilisant les entrées des tables de deuxième et troisième page.

In Linux such pages are called huge.

Linux appelle cela «énorme».

Usage of huge pages significantly reduces pressure on TLB, improves TLB hit-rate and thus improves overall system performance.

De grandes pages peuvent être utilisées pour réduire la pression sur le TLB. Augmentez le taux de réussite TLB pour améliorer les performances globales du système.

.

There are two mechanisms in Linux that enable mapping of the physical memory with the huge pages.

Linux a deux mécanismes pour mapper la mémoire physique sur d'énormes pages.

The first one is HugeTLB filesystem, or hugetlbfs.

Le premier est "HugeTLB filesystem", d'énormes tlbfs.

It is a pseudo filesystem that uses RAM as its backing store. For the files created in this filesystem the data resides in the memory and mapped using huge pages.

Il s'agit d'un pseudo système de fichiers qui utilise la RAM comme support d'enregistrement. Lorsqu'un fichier est créé sur ce système de fichiers, les données résident en mémoire et d'énormes pages sont mappées.

The hugetlbfs is described at Documentation/admin-guide/mm/hugetlbpage.rst <hugetlbpage>.

Les hugetlbfs peuvent être trouvés dans Documentation / admin-guide / mm / hubetlbpage.rst <hugetlbpage>.

.

Another, more recent, mechanism that enables use of the huge pages is called Transparent HugePages, or THP.

Un autre mécanisme pour activer les nouvelles pages énormes est appelé THP Transparent HugePages.

Unlike the hugetlbfs that requires users and/or system administrators to configure what parts of the system memory should and can be mapped by the huge pages, THP manages such mappings transparently to the user and hence the name.

Contrairement à hugetlbfs, qui oblige les utilisateurs et les administrateurs système à configurer les parties de la mémoire système qu'ils doivent configurer et peuvent être mappées par d'énormes pages, THP fournit des mappages équivalents pour les utilisateurs et les noms.

See Documentation/admin-guide/mm/transhuge.rst <admin_guide_transhuge> for more details about THP.

Zones

Often hardware poses restrictions on how different physical memory ranges can be accessed.

Le matériel impose souvent des restrictions sur l'accès à diverses plages de mémoire physique.

In some cases, devices cannot perform DMA to all the addressable memory.

Dans certains cas, le périphérique ne peut pas exécuter DMA sur toute la mémoire adressable.

In other cases, the size of the physical memory exceeds the maximal addressable size of virtual memory and special actions are required to access portions of the memory.

Dans d'autres cas, si la taille de la mémoire physique dépasse la taille adressable maximale de la mémoire virtuelle, une action spéciale est requise pour accéder à une partie de la mémoire.

Linux groups memory pages into zones according to their possible usage.

Sous Linux, nous avons organisé des pages de mémoire appelées «zone» pour un tel usage.

For example, ZONE_DMA will contain memory that can be used by devices for DMA, ZONE_HIGHMEM will contain memory that is not permanently mapped into kernel's address space and ZONE_NORMAL will contain normally addressed pages.

Par exemple, ZONE_DMA contient la mémoire disponible pour l'appareil par DMA. DONE_HIGHMEM contient de la mémoire non persistante dans l'espace d'adressage du noyau. ZONE_NORMAL contient des pages adressées régulières.

.

The actual layout of the memory zones is hardware dependent as not all architectures define all zones, and requirements for DMA are different for different platforms.

La disposition réelle de la zone mémoire dépend du matériel. Toutes les architectures ne définissent pas chaque zone. Les exigences DMA sont différentes selon les plates-formes.

Nodes

Many multi-processor machines are NUMA - Non-Uniform Memory Access - systems.

De nombreuses machines multiprocesseurs sont des systèmes NUMA (Non-Uniform Memory Access).

In such systems the memory is arranged into banks that have different access latency depending on the "distance" from the processor.

Dans un tel système, la mémoire est divisée en bancs et accédée par une latence différente en fonction de la "distance" du processeur.

Each bank is referred to as a node and for each node Linux constructs an independent memory management subsystem.

Chaque banque est appelée un nœud. Chaque nœud constitue un sous-système de gestion de mémoire indépendant.

A node has its own set of zones, lists of free and used pages and various statistics counters.

node a son propre ensemble de zones, une liste de pages libres et utilisées et divers compteurs de statistiques.

You can find more details about NUMA in

Documentation/vm/numa.rst <numa> and in Documentation/admin-guide/mm/numa_memory_policy.rst <numa_memory_policy>.

Page cache

The physical memory is volatile and the common case for getting data into the memory is to read it from files.

La mémoire physique est volatile et un cas courant d'obtention de données en mémoire est de lire des données à partir d'un fichier.

Whenever a file is read, the data is put into the page cache to avoid expensive disk access on the subsequent reads.

Chaque fois que vous lisez un fichier, les données sont placées dans le cache de page pour éviter un accès disque coûteux pour les lectures ultérieures.

Similarly, when one writes to a file, the data is placed in the page cache and eventually gets into the backing storage device.

De même, lors de l'écriture dans un fichier, les données sont placées dans le cache de pages et éventuellement stockées dans le périphérique de stockage de sauvegarde.

The written pages are marked as dirty and when Linux decides to reuse them for other purposes, it makes sure to synchronize the file contents on the device with the updated data.

Les pages écrites sont marquées comme «sales», garantissant que si Linux tente de les réutiliser à d'autres fins, le contenu des fichiers sur l'appareil sera synchronisé avec les données mises à jour.

Anonymous Memory

The anonymous memory or anonymous mappings represent memory that is not backed by a filesystem.

La «mémoire anonyme» ou «mappages anonymes» est une mémoire qui n'est pas prise en charge par le système de fichiers.

Such mappings are implicitly created for program's stack and heap or by explicit calls to mmap(2) system call.

Ces mappages sont soit implémentés implicitement dans la pile et le tas du programme, soit par des appels explicites à l'appel système mMap (2).

Usually, the anonymous mappings only define virtual memory areas that the program is allowed to access.

Le mappage anonyme définit généralement uniquement les zones de mémoire virtuelle auxquelles le programme peut accéder.

The read accesses will result in creation of a page table entry that references a special physical page filled with zeroes.

L'accès en lecture entraîne une entrée de table de pages qui fait référence à une page physique spéciale remplie de 0.

When the program performs a write, a regular physical page will be allocated to hold the written data.

Lorsque le programme effectue une écriture, une page physique régulière lui est attribuée pour contenir les données écrites.

The page will be marked dirty and if the kernel decides to repurpose it, the dirty page will be swapped out.

Cette page est marquée comme sale et si le noyau décide qu'elle devrait être réutilisée, la page sale sera échangée.

Reclaim

Throughout the system lifetime, a physical page can be used for storing different types of data.

Tout au long de la vie du système, des pages physiques sont utilisées pour contenir différents types de données.

It can be kernel internal data structures, DMA'able buffers for device drivers use, data read from a filesystem, memory allocated by user space processes etc.

La structure de données interne du noyau, les tampons compatibles DMA à utiliser par les pilotes de périphériques, les données lues à partir du système de fichiers, la mémoire allouée par les processus de l'espace utilisateur, etc.

.

Depending on the page usage it is treated differently by the Linux memory management.

La gestion de la mémoire Linux le gère différemment selon la façon dont la page est utilisée.

The pages that can be freed at any time, either because they cache the data available elsewhere, for instance, on a hard disk, or because they can be swapped out, again, to the hard disk, are called reclaimable.

Une page qui peut être récupérée à tout moment est appelée "récupérable" afin que vous puissiez mettre en cache des données disponibles ailleurs, comme votre disque dur, ou les échanger à nouveau sur votre disque dur.

The most notable categories of the reclaimable pages are page cache and anonymous memory.

Les catégories les plus notables de pages réutilisables sont le cache de page et la mémoire anonyme.

.

In most cases, the pages holding internal kernel data and used as DMA buffers cannot be repurposed, and they remain pinned until freed by their user. Such pages are called unreclaimable.

Dans de nombreux cas, les données internes du noyau sont conservées et la page utilisée comme tampon DMA ne peut pas être détournée et est fixée jusqu'à ce qu'elle soit libérée par l'utilisateur. Ces pages sont appelées «non récupérables».

However, in certain circumstances, even pages occupied with kernel data structures can be reclaimed.

Cependant, à l'Institut de recherche agricole, même les pages occupées par la structure de données du noyau peuvent être réutilisées.

For instance, in-memory caches of filesystem metadata can be re-read from the storage device and therefore it is possible to discard them from the main memory when system is under memory pressure.

Par exemple, le cache en mémoire des métadonnées du système de fichiers peut être lu à nouveau à partir du périphérique de stockage. Vous pouvez les libérer de la mémoire principale lorsque le système est à court de mémoire.

.

The process of freeing the reclaimable physical memory pages and repurposing them is called (surprise!) reclaim.

Le processus de libération et de récupération des pages de mémoire physique réutilisables s'appelle «récupérer» (quoi!).

Linux can reclaim pages either asynchronously or synchronously, depending on the state of the system.

Linux réutilise les pages de manière synchrone ou asynchrone, selon l'état du système.

When the system is not loaded, most of the memory is free and allocation requests will be satisfied immediately from the free pages supply.

Lorsque la charge du système est faible, la majeure partie de la mémoire est libérée et les demandes d'allocation sont exécutées dans l'ordre à partir de la page d'automne.

As the load increases, the amount of the free pages goes down and when it reaches a certain threshold (high watermark), an allocation request will awaken the kswapd daemon.

À mesure que la charge augmente, le volume des pages d'automne diminue. Lorsqu'un filigrane élevé est atteint, la demande d'allocation réveille le démon kswapd.

It will asynchronously scan memory pages and either just free them if the data they contain is available elsewhere, or evict to the backing storage device (remember those dirty pages?).

Analysez les pages de mémoire de manière asynchrone et libérez-les si les données qu'elles contiennent sont réutilisables ailleurs, ou expulsez-les vers un périphérique de stockage de sauvegarde (rappelez-vous la page sale).

As memory usage increases even more and reaches another threshold - min watermark - an allocation will trigger direct reclaim.

Lorsque l'utilisation de la mémoire continue d'augmenter et qu'un autre seuil (min watermark) est atteint, l'allocation déclenche une «récupération directe».

In this case allocation is stalled until enough memory pages are reclaimed to satisfy the request.

Dans ce cas, l'allocation s'arrêtera jusqu'à ce que suffisamment de pages de mémoire aient été récupérées pour répondre à la demande.

Compaction

As the system runs, tasks allocate and free the memory and it becomes fragmented.

Lorsque le système est exécuté, la mémoire est allouée et libérée, et elle devient un fragment.

Although with virtual memory it is possible to present scattered physical pages as virtually contiguous range, sometimes it is necessary to allocate large physically contiguous memory areas.

Avec la mémoire virtuelle, les pages physiques peuvent être rassemblées pour créer une plage pratiquement continue. Cependant, il est parfois nécessaire d'allouer une plage de mémoire physiquement continue.

Such need may arise, for instance, when a device driver requires a large buffer for DMA, or when THP allocates a huge page.

Par exemple, si le pilote de périphérique nécessite une grande mémoire tampon pour DMA, ou si l'allocateur THP alloue une page énorme, une telle demande se produira.

Memory compaction addresses the fragmentation issue.

Le «compactage» de la mémoire résout le problème de la fragmentation.

This mechanism moves occupied pages from the lower part of a memory zone to free pages in the upper part of the zone.

Ce mécanisme déplace la page occupée du bas de la zone mémoire vers l'espace libre au-dessus de la zone mémoire.

When a compaction scan is finished free pages are grouped together at the beginning of the zone and allocations of large physically contiguous areas become possible.

Après le scan de compactage, la mémoire libre est regroupée au début de la zone et peut se voir allouer une grande zone physiquement contiguë.

.

Like reclaim, the compaction may happen asynchronously in the kcompactd daemon or synchronously as a result of a memory allocation request.

Semblable à reclaim, le compactage peut se produire de manière asynchrone par le démon kcompactd ou de manière synchrone suite à l'allocation de mémoire.

OOM killer

It is possible that on a loaded machine memory will be exhausted and the kernel will be unable to reclaim enough memory to continue to operate.

La mémoire peut manquer sur les machines très chargées. Par conséquent, le noyau peut ne pas être en mesure de modifier suffisamment de mémoire pour continuer à fonctionner.

In order to save the rest of the system, it invokes the OOM killer.

ʻOOM killer` est appelé pour sauver le reste du système.

.

The OOM killer selects a task to sacrifice for the sake of the overall system health.

ʻOOM killer` sélectionne les tâches à sacrifier pour la santé globale du système.

The selected task is killed in a hope that after it exits enough memory will be freed to continue normal operation.

La tâche sélectionnée est tuée dans l'espoir de libérer suffisamment de mémoire pour continuer son fonctionnement normal une fois terminée.

Recommended Posts

Gestion de la mémoire »Présentation des concepts
Gestion de la mémoire au démarrage
[Français] Spark Memory Management depuis 1.6.0
[OS / Linux] Processus, thread, gestion de la mémoire