Est-il logique de données de cache obtenues à partir d'un fichier de mémoire mappée?

StackOverflow https://stackoverflow.com/questions/2516443

  •  22-09-2019
  •  | 
  •  

Question

Ou il serait plus rapide de relire les données de la mémoire mis en correspondance une fois de plus, étant donné que le système d'exploitation peut mettre en œuvre son propre cache?

La nature des données ne sait pas à l'avance, on suppose que lit le fichier sont aléatoires.

Était-ce utile?

La solution

Je voulais mentionner quelques petites choses que j'ai lu sur le sujet. La réponse est pas , vous ne voulez pas deviner le gestionnaire de mémoire du système d'exploitation.

La première vient de l'idée que vous voulez que votre programme (par exemple MongoDB, SQL Server) pour essayer de limiter votre mémoire sur la base d'un pourcentage de RAM libre:

  

Ne pas essayer d'allouer de la mémoire jusqu'à ce qu'il que x% gratuit

     

De temps en temps, un client demandera un moyen de concevoir leur programme pour qu'il continue de consommer RAM jusqu'à ce qu'il ne x% gratuit. L'idée est que leur programme devrait utiliser RAM agressive, tout en laissant suffisamment de RAM disponible (x%) pour une autre utilisation. À moins que vous concevez un système où vous êtes le seul programme en cours d'exécution sur l'ordinateur, c'est une mauvaise idée.

     

(lire l'article pour l'explication de pourquoi il est mauvais, y compris les images)

Ensuite vient de quelques notes de l'auteur de Varnish et proxy inverse:

  

Cache Varnish - Remarques de l'architecte

     

Alors qu'est-ce qui se passe avec calamars gestion de la mémoire élaborée est qu'il se bagarre avec les noyaux gestion de la mémoire élaborée, et comme toute guerre civile, qui ne se fait rien.

     

Qu'est-ce qui se passe est le suivant: Squid crée un objet HTTP dans « RAM » et il se sert parfois rapidement après la création. Puis, après un certain temps, il n'y a plus obtenir coups et le noyau le remarque. Puis quelqu'un essaie d'obtenir la mémoire du noyau pour quelque chose et le noyau décide de pousser ces pages mémoire inutilisées dans l'espace d'échange et d'utiliser le (cache-RAM) plus sensible pour certaines données qui est effectivement utilisé par un programme. Cependant, cela se fait sans calmars sache. Squid pense encore que ces objets sont http dans la RAM, et ils seront, très en second lieu, il tente d'y accéder, mais jusque-là, la RAM est utilisé pour quelque chose de productif.

faire cache quelque chose d'un fichier mappé en mémoire. À un certain moment dans l'avenir que la mémoire estimant que « cache » permutent sur le disque.

  • le système d'exploitation a écrit quelque chose de disque dur qui existe déjà sur le disque dur

Ensuite vient un moment où vous souhaitez effectuer une recherche à partir de votre mémoire « cache », plutôt que la mémoire « réelle ». Vous tentez d'accéder à la « cache », et comme il a été permutée de RAM le matériel pose un PAGE FAULT et cache raffraîchissement dans la RAM.

  • votre mémoire cache est tout aussi lent que la mémoire « réel », puisque les deux ne sont plus dans la RAM

Enfin, vous voulez libérer votre cache (peut-être votre programme est en cours d'arrêt). Si le « cache » a été permutée, le système d'exploitation doit d'abord échanger de nouveau en sorte qu'il puisse être libéré. Si au contraire vous venez Unmapped votre fichier mappé en mémoire, tout est parti (rien ne doit être échangé dans).

  • dans ce cas, le cache rend les choses plus lentes

Encore une fois de Raymon Chen: Si votre application ferme - Fermer déjà:

  

Lorsque DLL_PROCESS_DETACH vous indique que le processus est sortie, votre meilleur pari est juste pour revenir sans rien faire

     

J'utilise régulièrement un programme qui ne respecte pas cette règle. Le programme   alloue beaucoup de mémoire au cours de sa vie, et quand je   quitter le programme, il se trouve juste là pendant quelques minutes, parfois   filage à 100% du CPU, le barattage parfois le disque dur (parfois   tous les deux). Quand je romps avec le débogueur pour voir ce qui se passe, je   découvrir que le programme ne fait rien productif. C'est juste   libérant méthodiquement chaque dernier octet de Memory avait attribuées au cours de   sa durée de vie.

     

Si mon ordinateur n'a pas été sous beaucoup de pression de mémoire, alors la plupart des   la mémoire du programme avait alloué au cours de sa durée de vie n'a pas encore été   paginé, libérant ainsi la dernière goutte de mémoire est une borne CPU   opération. D'autre part, si je l'avais lancé une construction ou fait   autre chose gourmande en mémoire, puis la majeure partie de la mémoire du programme   avait attribuées au cours de sa durée de vie a été paginée, ce qui signifie que   les pages du programme tout ce que la mémoire de retour à partir du disque dur, tellement   il pourrait appeler gratuitement sur elle. Genre de sons rancunier, en fait. "Viens   ici, donc je peux vous dire de partir. "

     

Toute cette gestion de la mémoire anale rententive est inutile. Le processus   est sortie. Tout ce que la mémoire sera libérée lorsque l'espace d'adressage est   détruit. Arrêtez de perdre du temps et juste sortir déjà.


La réalité est que les programmes ne fonctionnent plus dans "RAM" , ils courent mémoire - < em> virtuel mémoire.

peut faire usage d'un cache, mais vous devez travailler avec gestionnaire de mémoire virtuelle du système d'exploitation:

  • vous voulez garder votre cache dans les que possible
  • vous voulez vous assurer qu'ils restent dans la mémoire vive, par la vertu d'entre eux étant accessibles beaucoup (à savoir être en fait un cache utile)

Accès:

  • mille emplacements 1 octet autour d'un fichier 400GB

est beaucoup plus cher que l'accès

  • un seul emplacement 1000 octets dans un fichier de 400 Go

En d'autres termes:. Vous ne pas vraiment besoin de cache données, vous avez besoin d'une plus localisée structure de données

Si vous conservez vos données importantes confinées à une seule page 4k, vous jouerez beaucoup plus agréable avec le VMM; Windows est cache.

Lorsque vous ajoutez 64 octets aligné quatre-mot cache-lignes, il y a encore plus incitatif pour ajuster votre mise en page de structure de données. Mais alors vous ne voulez pas aussi compact, ou vous allez commencer à subir des pénalités de performance des vidages de cache Partage Faux .

Autres conseils

La réponse est très OS spécifique. D'une manière générale, il n'y aura pas de sens dans la mise en cache de ces données. Les deux « mises en cache » données ainsi que la mémoire mappée peuvent être paginés loin à tout moment.

S'il y aura une différence, il sera spécifique à un système d'exploitation -. Sauf si vous avez besoin de cette granularité, il n'y a pas de sens dans la mise en cache des données

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top