Pourquoi une mémoire partiellement saturée provoque-t-elle un décalage?

53

Pourquoi une mémoire partiellement saturée (disons 80%) retarde-t-elle beaucoup le périphérique, même s'il reste de l'espace disponible pour stocker davantage de données? Ce que je pense, c’est que cela continue à bien fonctionner jusqu’à 99%.

Je le remarque plus sur le mobile que sur le PC, car sa mémoire vive est plus petite, par exemple, mon mobile dispose de 2 Go de RAM; Quand j'ai moins de 1 Go de RAM libre, ça prend beaucoup de temps! Pourquoi cela se produit-il, même s'il doit encore utiliser ~ 1 Go?

Mohammed Noureldin
la source
28
Je pensais que vous supposiez que la RAM disponible n’est pas utilisée. Vous voyez donc 20% de RAM disponible et pensez que seulement 80% de la RAM est utilisée. Ceci est incorrect, la RAM peut être à la fois utilisée et disponible. (Par exemple, la machine que j'utilise dispose maintenant de 32 Go de RAM et de 21,1 Go disponibles, mais seuls 1,8 Go sont gratuits.)
David Schwartz
2
Vous voulez dire mon espace libre sur le disque dur avec ma RAM? sûrement pas.
Mohammed Noureldin
3
Ils peuvent être remplacés, bien sûr. Mais cela aura un impact négatif énorme sur les performances - exactement comme vous le voyez. Si le volume de travail dépasse la RAM, les performances seront mauvaises, quelle que soit la quantité de RAM disponible.
David Schwartz
3
Qu'est-ce qui vous fait penser que c'est le pourcentage de RAM qui retarde le périphérique?
enkryptor
4
@MohammedNoureldin Je suppose qu'il doit y avoir une raison pour laquelle votre RAM est occupée (plusieurs processus fonctionnent et font quelque chose). Cela pourrait être la même raison pour laquelle le périphérique est en retard. Le chargement de la RAM peut n'être qu'un symptôme, pas la raison elle-même.
enkryptor

Réponses:

70

Il y a beaucoup de choses en jeu ici, mais je vais essayer de l'expliquer aussi simplement que possible et de manière applicable à pratiquement n'importe quel système d'exploitation.

Il y a 2 principes de base ici:

  1. La somme totale de tout ce qui doit être en RAM et de tout ce qui gagnerait à être en RAM est presque toujours supérieure à la taille de la RAM. Les éléments qui gagneraient à être dans la RAM incluent les ensembles de travail de processus et la liste de veille. Ce dernier contient des données et du code qui étaient autrefois actifs mais qui sont depuis devenus inactifs. Une grande partie de celle-ci sera réutilisée, une partie très bientôt, il est donc avantageux de la conserver en RAM. Cette mémoire agit comme une sorte de cache mais n’est pas vraiment essentielle, c’est donc dans la catégorie de la mémoire disponible. Comme la mémoire libre, il peut être rapidement attribué à tout programme qui en a besoin. Dans l'intérêt de la performance, la mémoire de veille doit être grande.

  2. La fréquence d'utilisation des blocs de mémoire est loin d'être aléatoire, mais elle peut être prédite avec une précision considérable. La mémoire est divisée en blocs, souvent 4K octets. Certains blocs sont consultés plusieurs fois par seconde, tandis que d'autres ne le sont pas depuis plusieurs minutes, heures, jours ou même plusieurs semaines si le système est en fonctionnement suffisamment longtemps. Il existe une large gamme d'utilisation entre ces 2 extrêmes. Le gestionnaire de mémoire sait quels blocs ont été utilisés récemment et ceux qui ne l'ont pas été. Il est raisonnable de penser qu'un bloc de mémoire auquel on a accédé récemment sera de nouveau nécessaire. La mémoire qui n'a pas été utilisée récemment ne sera probablement plus nécessaire de sitôt. Une longue expérience a prouvé que c'était un principe valable.

Le gestionnaire de mémoire profite du deuxième principe pour atténuer largement les conséquences indésirables du premier. Pour ce faire, il faut équilibrer les données récemment consultées dans la RAM tout en conservant des données rarement utilisées dans les fichiers d'origine ou le fichier d'échange.

Lorsque la RAM est abondante, cet équilibre est facile. Une grande partie des données récemment utilisées peuvent être conservées dans la RAM. C'est une bonne situation.

Les choses se compliquent lorsque la charge de travail augmente. La somme totale des données et du code utilisés est plus grande mais la taille de la RAM reste la même. Cela signifie qu'un plus petit sous-ensemble de cela peut être conservé dans la RAM. Certaines des données moins récemment utilisées ne peuvent plus être dans la RAM mais doivent être laissées sur le disque. Le gestionnaire de mémoire s'efforce de maintenir un bon équilibre entre la mémoire en utilisation active et la mémoire disponible. Mais à mesure que la charge de travail augmente, le gestionnaire de mémoire sera obligé de donner plus de mémoire disponible aux processus en cours d'exécution. Ce n'est pas une bonne situation mais le gestionnaire de mémoire n'a pas le choix.

Le problème est que le déplacement des données vers et depuis la RAM pendant l'exécution des programmes prend du temps. Lorsque la RAM est abondante, cela n'arrivera pas très souvent et ne sera même pas remarqué. Mais lorsque l'utilisation de la RAM atteint des niveaux élevés, cela se produit beaucoup plus souvent. La situation peut devenir si grave que passer plus de temps à déplacer des données de la mémoire vive qu’à consacrer à leur utilisation réelle. Il s’agit là d’une tâche ardue que le gestionnaire de mémoire s’efforce d’éviter mais qui ne peut souvent pas être évitée avec une charge de travail élevée.

Le gestionnaire de mémoire est à vos côtés, essayant toujours de maintenir au mieux les performances, même dans des conditions défavorables. Mais lorsque la charge de travail est importante et que la mémoire disponible est insuffisante, il faut faire des choses mauvaises pour continuer à fonctionner. C'est en fait la chose la plus importante. La priorité est d’abord de garder les choses en marche puis de les faire aussi vite que possible.

LMiller7
la source
1
Votre réponse m'a beaucoup aidé, merci! C'est memory mangerune partie de mon OSdroit? donc si je traitais avec des pointeurs et ces choses de très bas niveau, sera-t-il toujours capable de faire de la pagination?
Mohammed Noureldin
7
Le gestionnaire de mémoire fait partie du système d'exploitation. La pagination est une fonction de base du gestionnaire de mémoire et est aussi essentielle au fonctionnement que la respiration l’est pour vous et moi. Elle ne peut pas être arrêtée.
LMiller7
2
@MohammedNoureldin: Lorsque vous écrivez des applications en espace utilisateur (dont les vues de mémoire sont isolées de celles du noyau et des autres processus), vous ne pouvez pas accéder directement à la mémoire physique . Vous ne pouvez accéder qu’à une vue de la mémoire gérée par le gestionnaire de mémoire - vous l’aurez deviné - avec toutes ses fonctions (probablement), y compris la pagination. Les pointeurs de mémoire font uniquement référence à des points dans les espaces adresse d'une vue mémoire. C'est un concept de langage utilisé à la fois dans le code du noyau et dans l'espace utilisateur, mais cela ne signifie pas que les deux vues de la mémoire sont identiques. Ne confondez pas la gestion de la mémoire des processus avec le noyau MM!
David Foerster
6
C'est "évident" ou "bien connu", mais il conviendrait peut-être d'ajouter cette réponse: la mémoire (RAM) est de l'ordre de 1000 fois plus rapide qu'un disque dur (bien, cela dépend de beaucoup de choses, par exemple ssd / ide / sata, etc). Le système d'exploitation exécute le code à partir de la mémoire vive (+ cache), pas à partir du disque. Lorsque la mémoire devient insuffisante et que le système d'exploitation doit "permuter" des portions de code ("inutilisées") de la mémoire sur le disque, afin de libérer le ram pour exécuter autre chose, cela prendra beaucoup de temps (la permutation), et si cela se produit souvent (ex: vous avez beaucoup de programmes, chacun a besoin d'un échange pour que son code soit chargé en mémoire), cela ralentira beaucoup les choses.
Olivier Dulac
3
Nous n'utilisons généralement pas le terme "swap" pour désigner le code de chargement en mémoire. Cela s'appelle généralement une "faute". Généralement, le terme "swap" est utilisé uniquement pour les informations devant être écrites sur le disque avant de pouvoir être éjectées de la RAM.
David Schwartz
29

Tous les systèmes d'exploitation modernes utilisent une mémoire par ailleurs inutilisée pour la mise en cache des données afin de pouvoir y accéder à partir d'une mémoire vive rapide au lieu d'un stockage plus lent. Ils signalent généralement cela sous forme de mémoire disponible, car les applications peuvent vider le cache et l'utiliser s'il le faut, mais il est toujours utilisé. Moins il y en a, moins les données peuvent être mises en cache et plus l'ordinateur sera lent.

Mike Scott
la source
11
En réalité, les applications n'ont pas besoin de "vider" le cache. Ils demandent simplement de la RAM à l'OS. Le système d'exploitation, voyant qu'il ne possède pas de mémoire RAM inutilisée, effacera une partie du cache de fichiers et donnera la mémoire RAM désormais mise à zéro à l'application. L'application ne peut pas dire d'où provient cette RAM.
MSalters
5
@MSalters Oui, je suis d'accord, l'application demande de la mémoire vive et le système d'exploitation efface le cache si nécessaire. J'essayais de garder les choses simples.
Mike Scott
C’était un peu clair, mais je suis un peu plus au courant des détails, c’est pourquoi j’ai le sentiment qu’il manque quelque chose et j’ai besoin de plus de détails. @LMiller réponse m’a aidé en fait, ce serait formidable si vous pouviez réviser la informations qu'il contient.
Mohammed Noureldin
4

Cette réponse a été principalement réécrite pour réorganiser la structure et rendre le message plus clair. Je l'ai aussi ouvert comme réponse à un wiki de la communauté; N'hésitez pas à éditer.

La pagination est un schéma de gestion de la mémoire par lequel des processus sont attribués à des blocs de mémoire de taille fixe. Lorsque l'utilisation de la mémoire atteint un niveau élevé (c'est-à-dire une capacité de 80%), la pagination commence à s'étendre de la RAM à la vRAM (RAM virtuelle).

La vRAM est située dans le stockage système, généralement sur un disque dur, ou dans d'autres emplacements de stockage importants.

Les processus se voient attribuer une partie de votre disque dur à exécuter en tant que mémoire et traiteront leur section en tant que RAM. Il s'agit d'un processus parfaitement normal, cependant, lorsque le temps passé à transférer des données vers et à partir de la vRAM augmente, les performances du système diminuent.

Alors que la CPU dédiée permet d’accéder directement à la RAM dédiée via la carte mère, ce qui permet une connexion rapide, la RAM virtuelle doit effectuer un câblage transversal entre la carte et l’emplacement de la vRAM.

Cela ne provoque toutefois qu'un léger impact sur les performances. Lorsque la fréquence de la pagination vers vRAM a lieu augmente considérablement (lorsque la RAM dédiée approche de sa capacité), des ralentissements ont lieu.

Thrashing est la pratique de transférer rapidement et rapidement des pages de mémoire dans votre mémoire virtuelle. Cela pèse lourdement sur les performances car il faut plus de temps pour extraire et traiter les données.

Disons que vous voulez écrire un nombre de 30 chiffres. Vous pouvez soit vous asseoir à côté de votre écran avec votre bloc-notes et l'écrire (en utilisant la mémoire dédiée), soit vous vous souvenez de morceaux de 5, courir dans la pièce suivante et l'écrire sur votre bloc-notes (en utilisant la mémoire virtuelle). Les deux font le travail, mais lequel va être plus rapide?

En savoir plus sur thashing ici !

Un grand merci aux contributeurs de cette réponse, y compris Daniel B , xenoid et Jon Bentley .

volonté
la source
3
Ce n'est pas comme si la raclée était intentionnelle. C'est juste un effet secondaire de la pagination et de la compétition pour la mémoire physique. De plus, la mémoire virtuelle n'est pas «créée» en déplaçant des pages sur un disque.
Daniel B
Le thrash est un sous-produit, certes, mais il est extrêmement utile en période de débordement des processus, ce qui permet d'éviter les blocages. Et oui, la mémoire virtuelle est occupée plutôt que créée. Je vais éditer ça.
Will
8
Non, vous confondez la corbeille et la pagination. La corbeille est juste une pagination qui devient pathologique.
xenoid
@xenoid Paging est un schéma de gestion de la mémoire; C'est comme dire que je confonds frapper un cerf avec ma voiture et le système routier. Le thrash est le processus qui cause cette baisse de performance; Je suis cependant d’accord avec vous pour dire que c’est le résultat du système de radiomessagerie.
Will
1
Commentaires incorporés, transformés en réponse wiki, n'hésitez pas à les éditer.
Will
1

C'est parce que le système d'exploitation doit faire beaucoup de pagination (chargement de parties de programmes actifs) et de permutation (déplacer des données de la RAM vers la HD et vice-versa) pour que votre logiciel continue à fonctionner. Lorsque de nouvelles pages nécessitant plus d’espace que les 20% disponibles doivent être chargées, le système d’exploitation devra échanger les pages existantes dans la RAM qu’il considère moins susceptibles d’être utilisées prochainement. Surtout au démarrage d'autres programmes. Échanger et revenir en arrière dans les pages prend beaucoup de temps et ralentit considérablement les performances de votre PC, car vous travaillez maintenant à la vitesse du disque dur, pas de la mémoire vive.

Il est utile, sur un disque dur, de créer une partition spéciale sur votre disque dur et de l’affecter à un espace "swap" dédié (ne pas l’utiliser pour de "vrais" fichiers) afin que le swap soit moins affecté par la fragmentation du disque dur .

Gilles Lesire
la source
La ROM n’est qu’une nomenclature pour le HD lorsque l’on parle de mise en cache, de pagination, etc. Tout ce qui n’est pas la mémoire de travail. Et ROM est généralement plus lent que RAM, ont presque toujours été. Les anciens ordinateurs copiaient les données de la ROM vers la RAM (ROM Shadowing) lors du démarrage car cela fonctionnait plus rapidement.
Gilles Lesire
1
Bien sûr, mais la ROM et la RAM sont également utilisées comme mémoire non volatile ou volatile? BTW ROM est généralement plus lent, ROM est copiée dans la RAM (ROM Shadowing) au démarrage pour des gains de performances. Mais bien sûr, je vais changer la référence pour régler votre problème. ;)
Gilles Lesire
1

N'oubliez pas que les disques durs ont un ordre de grandeur plus lent que la RAM, et que la RAM elle-même n'est pas si rapide que ça (pour l'architecture générale). Par ordre de rapidité d’accès (où chaque échelon est un ordre de grandeur plus lent que celui ci-dessus), vous avez

  1. Registres de processeur - Concrètement, les registres sont disponibles dans un cycle de processeur . Étant donné que les processeurs font des milliards de cycles par seconde (3 GHz = 3 milliards de cycles par seconde), la vitesse est folle.
  2. Cache du processeur - Dépend du niveau, mais reste assez rapide (disponibilité de 3 à 5 cycles pour le cache N1).
  3. Random Access Memory (RAM) - La partie aléatoire signifie que vous ne savez pas dans quel état il se trouve lorsque vous y accédez. Pensez à un livreur de colis qui doit s’arrêter, ramasser le colis, se diriger vers la porte, sonner à la porte et attendre une réponse. Peut-être que vous n'attendez pas du tout, ou peut-être que vous attendez une minute ou deux pour que Mme Smith se mêle à la porte de l'arrière de la maison. En termes pratiques, nous parlons de 14 à 27 cycles (en fonction de l'état de la mémoire vive lorsque nous y avons accédé).
  4. Disque dur - Il y a un processus physique ici maintenant et bien que cela se produise aussi rapidement que possible, vous attendez que les têtes bougent et les pistes se déplacent sous ces têtes. Concrètement, un disque dur à 7 200 tr / min peut effectuer une révolution en environ 4 ms , soit environ 750 000 cycles pour un processeur de 3 GHz . C'est lent.

Le gestionnaire de mémoire virtuelle est un joueur. Il parie que vous n’avez pas besoin de toute votre mémoire vive tout le temps, il faut donc deviner et lancer les dés que votre programme de documentation (qui est en arrière-plan depuis 10 minutes pendant que vous lisez ceci) n’est pas vraiment important et il pousse au disque dur.

Mais ensuite, vous cliquez sur le document! Maintenant, le VMM doit charger toutes ces données depuis le disque dur. Pire encore, si vous manquez de RAM, il doit maintenant transférer d'autres données (plus de jeu) sur le disque dur pour libérer de l'espace. Linux aime vivre sur le bord ici. Il remplira la grande majorité de la RAM avec des données fréquemment utilisées (idéal pour les serveurs avec peu de processus).

Machavity
la source
1
Oui, le gestionnaire de mémoire est un joueur, mais cela pourrait très facilement être mal compris. Si l'accès à la mémoire était vraiment aléatoire, le gestionnaire de mémoire aurait tort aussi souvent que raison et tout le système s'effondrerait. Mais les programmes ont tendance à présenter une forte localité de référence. C'est-à-dire que la plupart des accès à la mémoire ont tendance à être localisés dans une zone de mémoire relativement petite. Ils se déplacent mais assez lentement pour que le système fonctionne. Les chances sont empilées dans la mémoire préférée des gestionnaires et les erreurs sont rapidement corrigées. Cela a été prouvé par des décennies d'expérience
LMiller7
Random in Random Access Memory indique que vous pouvez y accéder de manière aléatoire. (Par opposition à devoir attendre que les données passent sous les têtes de lecture comme sur un disque dur ou des bandes, puis accéder aux données de manière séquentielle.).
Phil
0

La réponse raclante résiste assez bien. Si vous le pouvez, vous pouvez minimiser la rapidité avec laquelle cela se produit en réduisant le swappiness (la quantité de RAM que le système permettra d'utiliser avant de déplacer des éléments vers un espace d'échange). J'aime configurer les systèmes pour qu'ils restent en dehors de la permutation jusqu'à ce que la RAM atteigne 99% pour les applications serveur, car la valeur par défaut signifierait que je devrais coder pour que les choses n'utilisent que 80% de la RAM pour tirer parti de la mise en cache sans être pénalisé pour avoir poussé. le système dans l'espace d'échange.

Codykochmann
la source