web-dev-qa-db-fra.com

Comment la mémoire de mappage d'un fichier a-t-elle des performances significatives augmente sur les appels de système d'E / S standard?

Concepts de système d'exploitation dit

Considérons une lecture séquentielle d'un fichier sur disque à l'aide des appels de système standard ouverts (), de lecture () et d'écriture () . Chaque accès nécessite un appel système et un accès disque .

Alternativement, nous pouvons utiliser les techniques de mémoire virtuelle discutées jusqu'à présent pour traiter les E/S FIK comme accès à la mémoire de routine. Cette approche, connue sous le nom de Mappage de mémoire A FI1 , permet à une partie de l'espace d'adressage virtuel d'être associé à la fiches. Comme nous le verrons, cela peut conduire à augmente les performances significatives . Mémoire Mappage d'un fichier est accompli en mappant un bloc de disque à une page (ou pages) en mémoire. L'accès initial au FICH Processives grâce à la pagination de la demande ordinaire, entraînant une faute de page. Cependant, une partie de la taille de la page du fichier est lue à partir du système de fichier dans une page physique (certains systèmes peuvent choisir de lire plus d'une pièce de mémoire de taille de page à la fois). Les lectures ultérieures et les écritures sur le fichier sont traitées comme accès à la mémoire de routine. Manipuler des fichiers à travers la mémoire plutôt que d'entraîner la surcharge d'utilisation des appels de système de lecture () et d'écriture () SIMPLIFES et accélère l'accès et l'utilisation.

Pourriez-vous analyser la performance du fichier mappé de mémoire?

Si je suis correct, le fichier de mappage de mémoire fonctionne comme suit. Il faut un appel système pour créer un mappage de mémoire. Ensuite, lorsqu'il accède à la mémoire mappée, les défauts de la page se produisent. Les défauts de page ont aussi des frais généraux.

Comment la mémoire de mappage d'un fichier a-t-elle des performances significatives augmente sur les appels de système d'E/S standard?

Merci.

8
Tim

Mémoire Mappage d'un fichier évite directement les tampons de copie qui se produisent avec des appels en lecture () et en écriture (). Les appels à lire () et écrire () incluent un pointeur sur la mémoire tampon dans l'espace d'adressage de processus où les données sont stockées. Le noyau doit copier les données vers/depuis ces emplacements. L'utilisation de MMAP () plante le fichier pour traiter l'espace d'adressage, le processus peut donc adresser le fichier directement et aucune copie n'est requise.

Il n'y a pas non plus de surcharge d'appel système lors de l'accès au fichier mail de mémoire après l'appel initial.

Si vous êtes intéressé par les détails pratiques, il existe une question connexe sur le débordement de la pile: ( MMAP () vs. Blocs de lecture

10
sebasth

Premièrement, dans la plupart IO Opérations, les caractéristiques du matériel de stockage sous-jacent domine les performances. Un réseau RAID5 mal configuré de vingt-neuf disques SATA de 5400 tr/min ralenties sur un système lent et affamé de mémoire à l'aide S/W RAID avec des tailles de blocs incompatibles et des systèmes de fichiers mal alignés vous donnera une mauvaise performance par rapport à un RAID SSD correctement configuré et aligné 1 + 0 sur un contrôleur hautes performances malgré tout réglage logiciel malgré tout réglage logiciel Vous pourriez essayer.

Mais la seule façon mmap() peut être significativement plus rapide, c'est si vous lisez les mêmes données plus d'une fois et les données que vous avez lues ne sont pas. t se faire pénétrer entre les lectures en raison de la pression de la mémoire.

Étapes de la carte mémoire:

  1. Appel système pour créer des mappages virtuels - très cher
  2. Processes accède à la mémoire pour la première fois, ce qui entraîne une faute de page - coûteux (et peut être répété si vous avez paginé)
  3. Processus lit en fait la mémoire

Si le processus ne fait que les étapes 2 et 3 une fois pour chaque bit de données de lecture ou que les données sont supprimées de la mémoire en raison de la pression de la mémoire, mmap() va être plus lent.

read() étapes:

  1. Un appel système copie des données de disque sur le cache de page (mai ou ne peut pas défaut de page, les données peuvent déjà être dans la cache de la page, provoquant que cela soit ignoré)
  2. Données copiées du cache de la page pour traiter la mémoire (mai ou ne peut pas défaut de page)

La cartographie de la mémoire ne va que battre cette performance à cause de cette copie supplémentaire du cache de page pour traiter la mémoire. Mais une simple copie d'une page de mémoire (ou moins) doit être effectuée plusieurs fois pour battre le coût de la mise en place de la cartographie - probablement. Combien de fois dépend de votre système. Bande passante de la mémoire, comment tout votre système est utilisé, tout. Par exemple, si le temps utilisé par la gestion de la mémoire du noyau pour configurer la cartographie n'aurait pas été utilisé par aucun autre processus, le coût de la création de la cartographie n'est pas vraiment très élevé. Inversement, si vous avez beaucoup de traitement sur votre système qui implique beaucoup de création/destruction de mappage de mémoire virtuelle (c'est-à-dire beaucoup de processus de courte durée), l'impact de la mémoire mappée IO peut être important.

Ensuite, il y a read() à l'aide d'IO directe:

  1. Appel système à lire du disque dans l'espace mémoire de processus. (peut ou peut ne pas causer une faute de page)

Direct IO Les lectures sont presque impossibles à battre la performance-sage. Mais vous devez vraiment accorder votre IO modèles à votre matériel pour optimiser les performances.

Notez qu'un processus peut très bien contrôler si la lecture des données provoque une erreur de page pour le tampon que le processus utilise pour lire.

Donc, l'accès au fichier mappé de mémoire est-il plus rapide? Peut-être que c'est, peut-être que ce n'est pas le cas.

Cela dépend de votre modèle d'accès. ainsi que de votre matériel et de tout le reste de votre IO PATH (S ).

Si vous diffusez un fichier vidéo de 30 Go sur une machine avec 4 Go de RAM et que vous ne revenez jamais de l'une des données, la mappage de mémoire Le fichier est probablement le pire façon de le lire.

Inversement, si vous avez une table de recherche de 100 Mo pour certaines données d'accès au hasard des milliards et des milliards de fois dans votre traitement et suffisamment de mémoire que le fichier ne se déclenche jamais, la cartographie de la mémoire écrasera toutes les autres méthodes d'accès.

Un avantage énorme des fichiers mappés de mémoire

Les fichiers de cartographie de la mémoire ont un avantage énorme sur d'autres formes d'Io: la simplicité de code. Il est vraiment difficile de battre la simplicité d'accéder à un fichier comme si elle est en mémoire. Et la plupart des temps, la différence de performance entre le mappage de mémoire-mappage d'un fichier et faire discret IO Opérations n'est pas tout ce qui est de toute façon.

9
Andrew Henle