Comment FreeBSD alloue-t-il de la mémoire?


9

Je suis conscient que cela est simplifié / explication généralisée, mais top(1)utilitaire divise la mémoire sous FreeBSD en six Pools- Active, Inactive, Wired, Cache, Bufferset Free. Exemple de top(1)sortie:

Mem: 130M Active, 42M Inact, 51M Wired, 14M Cache, 34M Buf, 648K Free
Swap: 512M Total, 512M Free

Activeest utilisé par les processus en cours d'exécution et Wiredest utilisé principalement pour le noyau. Inactiveest la mémoire des processus fermés qui est toujours mise en cache au cas où elle devrait être réutilisée, Cacheles données mises en cache, les Bufferstampons de disque (je suppose que c'est similaire à la sortie cachedLinux free(1)(?)) et la Freemémoire est complètement inutilisée. Ai - je raison que le noyau FreeBSD automatiquement alloue de l' espace à partir Inactive, Cacheet Bufferspiscines à Activeou en Wiredcas de besoin?

Réponses:


13

Pour faire court, la mémoire active et câblée est utilisée qui ne doit pas ou ne peut pas être échangée pour libérer de la mémoire. Bien qu'inactif, il peut être correctement échangé, mais est toujours détenu (non libéré) par un processus ou le noyau, donc ce n'est pas une mémoire très utilisée, mais toujours utilisée.

La nouveauté est la lessive qui est une liste de pages de mémoire sale, qui pourrait devoir être écrite sur le périphérique d'échange. Soit si la mémoire sale devait être permutée ou non, elle est réintégrée dans la file d'attente inactive.

La mémoire câblée n'est pas censée être échangée, pour des raisons de sécurité (dans le cas du noyau) ou pour l'optimisation des processus utilisateur (comme ZFS). La mémoire câblée est utilisée pour les caches de systèmes de fichiers, qui pourraient être libérés par le noyau. Au moins pour ZFS, cela peut être considéré comme une mémoire principalement libre.

La mémoire libre est définitivement libre.

Le cache (désormais obsolète, je suppose) est prêt à être libéré, car il est déjà échangé et uniquement là pour une éventuelle réaffectation.

Le tampon est utilisé comme cache par la plupart des systèmes de fichiers (UFS, FAT, ...) et correspond à la quantité de mémoire utilisée par les systèmes de fichiers. Il peut être actif, inactif ou câblé.

ARC (Adaptive Replacement Cache) est le cache utilisé par ZFS et c'est la mémoire qui peut être libérée en cas de besoin.

Du wiki FreeBSD sur la mémoire

Classes de mémoire

actif

  • Contient des pages "activement" (récemment) référencées par userland
  • Contient un mélange de pages propres et sales
  • Les pages sont régulièrement analysées par le démon de page (chaque page est visitée une fois toutes les vm.pageout_update_period secondes)
  • Les analyses vérifient si la page a été référencée depuis la dernière analyse
  • Si suffisamment d'analyses sont terminées sans voir de référence, la page est déplacée vers la file d'attente inactive
  • Met en œuvre une pseudo-LRU

Inactif

  • Contient des pages anciennes de la file d'attente active
  • Contient des pages expulsées du cache de tampon
  • Contient un mélange de pages propres et sales
  • Les pages sont analysées par le démon de page (à partir du début de la file d'attente) en cas de manque de mémoire:
    • Les pages qui ont été référencées sont replacées dans la file d'attente active ou à la fin de la file d'attente inactive
    • Les pages sales sont déplacées vers la fin de la file d'attente
    • Les pages propres non référencées peuvent être libérées et réutilisées immédiatement
  • Implémente LRU de seconde chance

Blanchisserie

  • File d'attente pour gérer les pages sales inactives, qui doivent être nettoyées ("blanchies") avant de pouvoir être réutilisées
  • Géré par un thread séparé, le thread de lessive, au lieu du démon de page
  • Le fil de blanchisserie blanchit un petit nombre de pages pour équilibrer les files d'attente inactives et de blanchisserie
  • La fréquence du blanchiment dépend:
    • Combien de pages propres le démon de page libère; plus de liberté contribue à une fréquence plus élevée de blanchiment
    • La taille de la file d'attente de blanchisserie par rapport à la file d'attente inactive; si la file d'attente de blanchisserie augmente, nous laverons plus fréquemment
  • Les pages sont numérisées par le fil de blanchisserie (à partir du début de la file d'attente):
    • Les pages qui ont été référencées sont replacées dans la file d'attente active ou à la fin de la file d'attente de lessive
    • Les pages sales sont blanchies puis rapprochées du début de la file d'attente inactive

Gratuit

  • Mémoire disponible pour une utilisation par le reste du système.

Filaire

  • Mémoire non paginable: ne peut pas être libérée tant qu'elle n'est pas explicitement libérée par le propriétaire
  • La mémoire Userland peut être câblée par mlock (2) (sous réserve des limites du système et par utilisateur)
  • Les allocateurs de mémoire du noyau renvoient de la mémoire câblée
  • Le contenu de l'ARC et du cache tampon est câblé
  • Une partie de la mémoire est câblée en permanence et n'est jamais libérée (par exemple, le fichier du noyau lui-même)

De La conception et la mise en œuvre du système d'exploitation FreeBSD chapitre 6.12 Remplacement de la page (plus entièrement précis, mais ici pour référence à l'ancienne question):

Le noyau divise la mémoire principale en cinq listes:

  1. Filaire : les pages câblées sont verrouillées en mémoire et ne peuvent pas être paginées. En général, ces pages sont utilisées par le noyau ou le pager de mémoire physique, ou elles ont été verrouillées avec mlock . De plus, toutes les pages utilisées pour contenir les piles de threads des processus chargés (c'est-à-dire non échangés) sont également câblées.
  2. Actif : les pages actives sont utilisées par une ou plusieurs régions de mémoire virtuelle. Bien que le noyau puisse les paginer, cela risque d'entraîner un nouveau défaut du processus actif.
  3. Inactif : les pages inactives peuvent être sales et avoir un contenu encore connu, mais elles ne font généralement partie d'aucune région active. Si le contenu de la page est sale, le contenu doit être écrit dans le magasin de sauvegarde avant de pouvoir réutiliser la page. Une fois la page nettoyée, elle est déplacée dans la liste de cache. Si le système manque de mémoire, le démon de mise en page peut essayer de déplacer des pages actives vers la liste inactive dans l'espoir de trouver des pages qui ne sont pas vraiment utilisées. Les critères de sélection utilisés par le démon de mise en page pour sélectionner les pages à déplacer de la liste active à la liste inactive sont décrits plus loin dans cette section. Lorsque les listes de mémoire libre et de cache tombent à un niveau bas, le démon de sortie de page parcourt la liste inactive pour créer plus de cache et de pages libres.
  4. Cache : les pages de cache ont un contenu qui est encore connu, mais elles ne font pas partie d'un mappage. S'ils sont mis en défaut dans la région active, ils ne font partie d'aucun mappage. S'ils sont défectueux dans une région active, ils seront déplacés de la liste de cache vers la liste active. S'ils sont utilisés pour une lecture ou une écriture, ils seront d'abord déplacés de la liste de cache vers le cache de tampon et finalement libérés dans la liste inactive. Un appel système mlock peut récupérer une page de la liste de cache et la câbler. Les pages de la liste de cache sont similaires aux pages inactives, sauf qu'elles ne sont pas sales, soit parce qu'elles ne sont pas modifiées depuis qu'elles ont été paginées, soit parce qu'elles ont été écrites dans leur magasin de sauvegarde. Ils peuvent être réclamés pour une nouvelle utilisation lorsqu'une page est nécessaire.
  5. Gratuit : les pages gratuites n'ont pas de contenu utile et seront utilisées pour répondre aux nouvelles demandes de défaut de page.

Pour répondre à votre question d'origine

Ai-je raison de dire que le noyau FreeBSD alloue automatiquement l'espace des pools Inactive, Cache et Buffers à Active ou Wired si nécessaire?

Les pages actives peuvent devenir inactives si elles n'ont pas été utilisées pendant un certain temps. Si le noyau échange une page inactive, cette page est déplacée vers la liste de cache . Les pages de la liste de cache ne font partie du mappage virtuel d'aucun processus, mais peuvent facilement être récupérées, comme actives ou câblées . Ou lorsque cela est nécessaire pour les E / S en tant que cache de tampon .

La mémoire câblée ne peut pas être échangée hors de la mémoire principale. S'il est câblé par un processus, il doit être déconnecté de l' munlockappel pour redevenir actif .

La mémoire active , inactive et câblée peut être libérée par le processus ou le noyau et ajoutée à la liste gratuite .


Je viens de remarquer une erreur dans ma question initiale. J'ai demandé « Suis - je raison de dire que le noyau FreeBSD automatiquement Alloue l'espace de Inactive, Wired, Cacheet Bufferspiscines à Activeou Wiredsi nécessaire? » alors que je voulais demander : « Ai - je raison que le noyau FreeBSD automatiquement alloue de l' espace à partir Inactive, Cacheet Bufferspiscines pour Activeou Wiredsi nécessaire? ». J'ai mis à jour ma question initiale. Donc , en résumé, la mémoire utilisée dans FreeBSD est Wired+ Activeet si ces deux piscines ont besoin quantité de mémoire supplémentaire alors cela est pris de Inacative, Cached, Buffersou Freepiscines?
Martin

@Martin oui ça sonne à peu près juste. J'ai mis à jour ma réponse à votre question.
Raphael Ahrens
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.