Sur la mémoire système… en particulier la différence entre `tmpfs,` `shm '' et` énormes pages ... '

16

Je me suis récemment intéressé aux différents systèmes de fichiers basés sur la mémoire du noyau Linux.

Note:En ce qui me concerne, les questions ci-dessous devraient être considérées plus ou moins optionnelles par rapport à une meilleure compréhension de celle posée dans le titre. Je leur pose la question ci-dessous parce que je pense que leur répondre peut mieux m'aider à comprendre les différences, mais comme ma compréhension est certes limitée, il s'ensuit que d'autres peuvent mieux savoir. Je suis prêt à accepter toute réponse qui enrichit ma compréhension des différences entre les trois systèmes de fichiers mentionnés dans le titre.

En fin de compte, je pense que j'aimerais monter un système de fichiers utilisable, hugepages,même si des recherches légères (et des bricolages toujours plus légers) m'ont amené à croire que l' rewritable hugepage mountoption n'est pas une option. Suis-je trompé? Quelles sont les mécaniques en jeu ici?

Concernant également hugepages:

     uname -a
3.13.3-1-MANJARO \
#1 SMP PREEMPT \
x86_64 GNU/Linux

    tail -n8 /proc/meminfo
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:     8223772 kB
DirectMap2M:    16924672 kB
DirectMap1G:     2097152 kB

(Voici les versions en texte intégral de / proc / meminfo et / proc / cpuinfo )

Que se passe-t-il dans ce qui précède? Suis-je déjà alloué hugepages?Y a-t-il une différence entre DirectMaples pages mémoire ethugepages?

Mise à jour Après un petit coup de pouce de @Gilles, j'ai ajouté 4 lignes supplémentaires ci-dessus et il semble qu'il doit y avoir une différence, même si je n'en avais jamais entendu parler DirectMapavant de tirer cela tailhier ... peut DMI- être ou quelque chose?

Un peu plus ...

En cas d'échec de cette hugepagestentative et en supposant des sauvegardes sur disque dur de tous les fichiers image, quels sont les risques de monter des boucles à partir de tmpfs?Mon système de fichiers est-il swappedle pire des cas? Je comprends que le tmpfscache du système de fichiers est monté - mon fichier de boucle monté peut-il être mis hors pression de la mémoire? Existe-t-il des mesures d'atténuation que je peux prendre pour éviter cela?

Dernier - qu'est-ce qui est exactement de shm,toute façon? En quoi diffère-t-il ou inclut-il hugepagesoutmpfs?

mikeserv
la source
1
Qu'en est-il des lignes précédentes /proc/meminfoqui contiennent HugePage(ou votre version du noyau ne les a-t-elle pas)? Sur quelle architecture est-ce (x86_64 je suppose)?
Gilles 'SO- arrête d'être méchant'
Je vais les ajouter. J'étais juste inquiet que ce soit trop long.
mikeserv
@ Gilles - J'ai lié au texte brut ci-dessus. J'espère que ça va. Merci d'avoir demandé - j'aurais dû l'inclure en premier lieu - je ne sais pas comment j'ai raté cela.
mikeserv

Réponses:

13

Il n'y a aucune différence entre tmpfs et shm. tmpfs est le nouveau nom de shm. shm signifie SHaredMemory.

Voir: tmpfs Linux .

La principale raison pour laquelle tmpfs est même utilisé aujourd'hui est ce commentaire dans mon / etc / fstab sur ma boîte gentoo. BTW Chromium ne se construit pas avec la ligne manquante:

# glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for 
# POSIX shared memory (shm_open, shm_unlink). 
shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0 

qui est sorti de la documentation du noyau linux

Citant:

tmpfs a les utilisations suivantes:

1) Il y a toujours un montage interne du noyau que vous ne verrez pas du
tout. Ceci est utilisé pour les mappages anonymes partagés et la
mémoire partagée SYSV .

Ce montage ne dépend pas de CONFIG_TMPFS. Si CONFIG_TMPFS n'est pas défini, la partie visible par l'utilisateur de tmpfs n'est pas créée. Mais les
mécanismes internes sont toujours présents.

2) la glibc 2.2 et les versions ultérieures s'attendent à ce que tmpfs soit monté sur / dev / shm pour
la mémoire partagée POSIX (shm_open, shm_unlink). L'ajout de la
ligne suivante à / etc / fstab devrait prendre en charge ceci:

tmpfs / dev / shm valeurs par défaut de tmpfs 0 0

N'oubliez pas de créer le répertoire sur lequel vous souhaitez monter tmpfs si nécessaire.

Ce montage n'est pas nécessaire pour la mémoire partagée SYSV. Le
support interne est utilisé pour cela. (Dans les versions du noyau 2.3, il était
nécessaire de monter le prédécesseur de tmpfs (shm fs) pour utiliser
la mémoire partagée SYSV )

3) Certaines personnes (dont moi) trouvent très pratique de le monter,
par exemple sur / tmp et / var / tmp et ont une grande partition de swap. Et maintenant
, les montages en boucle des fichiers tmpfs fonctionnent, donc mkinitrd fourni par la plupart des
distributions devrait réussir avec un tmpfs / tmp.

4) Et probablement beaucoup plus que je ne connais pas :-)

tmpfs propose trois options de montage pour le dimensionnement:

taille: la limite d'octets alloués pour cette instance tmpfs. La valeur par défaut est la moitié de votre RAM physique sans échange. Si vous surdimensionnez vos instances tmpfs, la machine se bloquera car le gestionnaire OOM ne pourra pas libérer cette mémoire.
nr_blocks: Identique à size, mais en blocs de PAGE_CACHE_SIZE.
nr_inodes: le nombre maximal d'inodes pour cette instance. La valeur par défaut est la moitié du nombre de vos pages RAM physiques ou (sur une machine avec highmem) le nombre de pages RAM lowmem, la valeur la plus faible étant retenue.

Du document transparent Hugepage Kernel Doc:

La prise en charge transparente de Hugepage maximise l'utilité de la mémoire libre par rapport à l'approche de réservation de hugetlbfs en permettant à toute la mémoire inutilisée d'être utilisée comme cache ou autres entités mobiles (ou même inamovibles). Il ne nécessite pas de réservation pour éviter que d'énormes échecs d'allocation de pages ne soient visibles depuis l'espace utilisateur. Il permet à la pagination et à toutes les autres fonctionnalités avancées de VM d'être disponibles sur les pages géantes. Il ne nécessite aucune modification pour que les applications puissent en profiter.

Cependant, les applications peuvent être encore optimisées pour tirer parti de cette fonctionnalité, comme par exemple, elles ont été optimisées auparavant pour éviter une inondation d'appels système mmap pour chaque malloc (4k). L'optimisation de l'espace utilisateur n'est de loin pas obligatoire et khugepaged peut déjà prendre en charge les allocations de pages de longue durée, même pour les applications ignorant les pages énormes qui traitent de grandes quantités de mémoire.


Nouveau commentaire après avoir fait quelques calculs:

HugePage Size: 2MB
HugePages Used: None / Off, comme en témoignent les 0, mais activé selon les 2 Mo ci-dessus.
DirectMap4k: 8.03Gb
DirectMap2M: 16.5Gb
DirectMap1G: 2Gb

En utilisant le paragraphe ci-dessus concernant l'optimisation dans THS, il semble que les 8 Go de votre mémoire soient utilisés par des applications qui fonctionnent avec des mallocs de 4k, 16,5 Go, ont été demandées par des applications utilisant des mallocs de 2M. Les applications utilisant des mallocs de 2M imitent le support HugePage en déchargeant les sections 2M vers le noyau. C'est la méthode préférée, car une fois le malloc libéré par le noyau, la mémoire est libérée sur le système, tandis que le montage de tmpfs à l'aide d'énorme page n'entraînerait pas un nettoyage complet jusqu'à ce que le système soit redémarré. Enfin, le plus simple, vous aviez 2 programmes ouverts / en cours d'exécution qui demandaient un malloc de 1 Go

Pour ceux d'entre vous qui ne connaissent pas un malloc, c'est une structure standard en C qui signifie Memory ALLOCation. Ces calculs servent de preuve que la corrélation de l'OP entre DirectMapping et THS peut être correcte. Notez également que le montage d'une HUGEPAGE UNIQUEMENT fs n'entraînerait qu'un gain en incréments de 2 Mo, tandis que laisser le système gérer la mémoire à l'aide de THS se produit principalement en blocs de 4k, ce qui signifie en termes de gestion de la mémoire que chaque appel malloc enregistre le système 2044k (2048-4 ) pour un autre processus à utiliser.

eyoung100
la source
2
C'est vraiment bien - le THS est-il mon DirectMap ?
mikeserv
Que je ne peux pas répondre car j'ai googlé DirectMapping et n'ai rien trouvé de lié à tmpfs etc. J'ai fait allusion. Cependant, tous les noyaux de la branche 2.6 prennent en charge THS. Comme un hunch tho, voir mon nouveau commentaire ci-dessus.
eyoung100
Oui, je me suis aussi très peu présenté. J'ai fait quelques lectures sur HP, THP. Je suis assez intrigué par votre commentaire. C'est en train de prendre forme, mec. Cette dernière partie - HP uniquement - dois-je interpréter cela comme signifiant que je peux monter un système de fichiers en lecture / écriture sur un montage de page énorme? Comme, un fichier image monté en boucle à partir d'un montage de page énorme? Inscriptible?
mikeserv
Oui, et il est accessible en écriture lorsqu'il est monté correctement, mais sachez: 1. que depuis que vous l'avez monté, vous êtes en charge du nettoyage 2. C'est du gaspillage: en utilisant votre exemple, disons que votre boucle ne contenait qu'un fichier texte, avec les personnages: Bonjour, je m'appelle Mike. En supposant que chaque caractère est de 1 Ko, ce fichier sera enregistré sous 23 Ko. Vous avez gaspillé 2025k car la page énorme vous a donné 2 Mo. Ce comportement inutile est la raison pour laquelle la gestion de la mémoire a été intégrée au noyau. Cela nous empêche également d'avoir besoin d'une DLL d'encapsulation comme kernel32
eyoung100
et enfin 3. Vous perdez votre monture lors d'un redémarrage ou d'un crash.
eyoung100
4

Pour résoudre le problème "DirectMap": le noyau a un mappage linéaire ("direct") de la mémoire physique , distinct des mappages virtuels alloués à chaque processus utilisateur.

Le noyau utilise les plus grandes pages possibles pour ce mappage afin de réduire la pression TLB.

DirectMap1G est visible si votre CPU prend en charge les pages 1 Go (à partir de Barcelone; certains environnements virtuels les désactivent), et s'il est activé dans le noyau - la valeur par défaut est activée pour 2.6.29+.

GreenReaper
la source
3

Il n'y a aucune différence entre shmet tmpfs(en fait, tmpfsc'est seulement le nouveau nom de l'ancien shmfs). hugetlbfsest un tmpfssystème de fichiers basé sur qui alloue son espace à partir d'énormes pages du noyau et a besoin d'une certaine configuration supplémentaire (comment l'utiliser est expliqué dans la documentation / vm / hugetlbpage.txt ).

Andreas Wiese
la source
C'était un bon essai, et j'avais lu ces documents, bien sûr. Ou peut être pas bien sûr - mais je pense que je vais le proposer pour une prime de 100rep, mais avant de le faire, je vous l'offrirai si vous pouvez développer cela. Jusqu'à présent, vous n'avez pas encore enrichi ma compréhension - j'en connaissais déjà la plupart, sauf que les deux n'étaient que des synonymes. Dans tous les cas, si vous pouvez en faire une meilleure réponse d'ici demain matin, la prime de 100rep vous appartient. Particulièrement intéressant pour moi est que je ne trouve aucune mention du DirectMaptout dans la procfs manpage. Comment venir?
mikeserv
1
@mikeserv - J'ai trouvé ce diff qui montre à partir de quelle fonction les DirectMaps sont calculés: lkml.org/lkml/2008/11/6/163
slm