Comment désactiver Mac OS X de l’utilisation du swap alors qu’il reste encore de la mémoire «inactive»?

61

Un phénomène courant dans mon utilisation quotidienne (et plusieurs autres selon divers messages publiés sur Internet) d'OS X, le système semble devenir lent chaque fois qu'il n'y a plus de mémoire "libre" disponible. Soi-disant, cela est dû à un échange, car une activité de disque intense est apparente et que vm_stat rapporte de nombreuses pages invisibles. (Corrigez-moi de mal)

Cependant, la quantité de mémoire RAM "inactive" représente généralement environ 12,5% à 25% de toute la mémoire disponible (^ 1.) Lorsque la permutation commence / se produit / se termine.

Selon http://support.apple.com/kb/ht1342 :

Mémoire inactive

Cette information en mémoire n'est pas utilisée activement, mais a été utilisée récemment.

Par exemple, si vous utilisez Mail et que vous le quittez, la RAM utilisée par Mail est marquée comme mémoire inactive. Cette mémoire inactive est disponible pour être utilisée par une autre application, tout comme la mémoire libre. Toutefois, si vous ouvrez Mail avant que sa mémoire inactive ne soit utilisée par une autre application, Mail s'ouvrira plus rapidement car sa mémoire inactive est convertie en mémoire active au lieu de charger Mail à partir du disque dur le plus lent.

Et selon http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html :

La liste inactive contient des pages qui résident actuellement dans la mémoire physique mais n'ont pas été consultées récemment. Ces pages contiennent des données valides mais peuvent être libérées de la mémoire à tout moment .

Donc, fondamentalement: lorsqu'un programme a cessé, sa mémoire devient marquée comme inactive et devrait pouvoir être réclamée à tout moment. Néanmoins, OS X préférera commencer à extraire la mémoire du fichier d’échange plutôt que de réclamer simplement cette mémoire, à condition que la mémoire "Libre" devienne trop basse.

Pourquoi? Quel est l’avantage de ce comportement par rapport à, par exemple, la libération instantanée de la mémoire inactive sans même toucher le fichier d'échange? Certaines sources (^ 2.) indiquent qu'OS X rechercherait la mémoire "inactive" à permuter avant de la relâcher, mais cela n'a pas de sens maintenant de le faire si la mémoire peut être libérée de la mémoire à un moment donné ? L'échange est coûteux, la libération est bon marché, non?

Ce comportement peut-il être modifié en utilisant une préférence ou un hack connu? (De préférence, cela n'inclut pas la désactivation de swap / dynamic_pager et le redémarrage ...)

J'apprécie la commande de purge , ainsi que le concept de réparation des autorisations de disque pour forcer une partie de la mémoire libre, mais ce sont des moyens de forcer péniblement plus de mémoire libre que de réparer la logique de décision d'échange / de libération ...

Une question similaire a été posée ici: http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/ et ici: http: //hintsforums.macworld .com / showthread.php? t = 87688 mais même si les points opérationnels ont été redemandés à la question principale, aucune des réponses n’y a répondu ...

^ 1. MISE À JOUR 17 mars 2012 Depuis que j'ai posté cette question pour la première fois, je suis passé de 4 Go à 8 Go de RAM installé et le problème persiste. La quantité de "Inactif" poinçon était de 0.5gb-1.0gb avant et est maintenant typiquement autour de 1.0-2.0GB quand permuter commence / se produit / se termine, c’est-à-dire qu’il semble qu’environ 12.5% ​​-25% du ram soit conservé comme inactif par OSX la logique du noyau.

^ 2. Par exemple, https://apple.stackexchange.com/questions/4288/what-does-it-mean-if-i-have-lots-of-inactive-memory-at-the-end-of-a-workwork- jour :

Une fois que toute votre mémoire est utilisée (la mémoire disponible est égale à 0), le système d'exploitation écrit la mémoire inactive dans le fichier d'échange pour libérer de l'espace dans la mémoire active.

MISE À JOUR 17 mars 2012

Voici un aperçu des méthodes suggérées pour vous aider jusqu'à présent:

La commande de purge

"Utilisé pour rapprocher les conditions de démarrage initiales avec un cache de disque froid pour l’analyse des performances. Il n’affecte pas la mémoire anonyme allouée via malloc, vm_allocate, etc.".

Ceci est utile pour empêcher osx de permuter le cache disque (ce qui est ridicule de le faire en premier lieu), mais avec l'inconvénient que le cache disque est libéré, ce qui signifie que si le cache disque n'était pas sur le point d'être échangé, on se retrouverait simplement avec un cache de disque froid, affectant probablement les performances.

L' application FreeMemory et / ou la réparation des autorisations de disque pour imposer de la mémoire libre

N'aide pas à libérer de la mémoire, ne déplace que quelques gigaoctets de contenu de la mémoire de la mémoire vive au disque dur. En fin de compte, cela provoque de nombreux swap-ins lorsque j'essaie d'utiliser les applications ouvertes tout en libérant de la mémoire, car une grande partie de sa machine virtuelle est maintenant en swap.

Accélération de l' allocation d'échange à l'aide de dynamicpagerwrapper

Cela semble être une bonne chose à faire pour accélérer l'utilisation de swap, mais ne résout pas le problème du swap osx en premier lieu tant que la mémoire est inactive.

Désactiver le swap en désactivant dynamicpager et en redémarrant

Cela forcera osx à ne pas utiliser la permutation sur le prix du système suspendu lorsque toute la mémoire est utilisée. Pas une alternative viable ...

Désactiver l'échange à l'aide d' un DynamicPager piraté

Semblable à la désactivation de dynamicpager ci-dessus, certains extraits des commentaires du billet de blog indiquent qu'il ne s'agit pas d'une solution viable: "La mémoire inactive est élevée, comme d'habitude". "lorsque votre système manque de mémoire, tout le système se bloque ...", "si vous utilisez toute la mémoire du Mac, la machine se bloquera probablement"

En résumé, je ne connais toujours pas de moyen d'empêcher Mac OS X d'utiliser le swap lorsqu'il existe encore de la mémoire "inactive". Si ce n'est pas possible, peut-être au moins une explication explique-t-elle pourquoi osx préfère échanger la mémoire qui peut être libérée de la mémoire à tout moment ?

Motin
la source
1
J'ai ce problème, illustré par les numéros de ce moniteur d'activité: bassistance.de/i/f2322d.png Peu de mémoire, mais beaucoup de mémoire inactive. Au lieu de récupérer cela, OSX préfère commencer à échanger fortement, comme vous pouvez le constater avec les sorties de page de 40 Go.
Jörn Zaefferer le
J'ai beaucoup de mémoire libre et il y a encore plusieurs Go d'échange utilisés. 16 Go rMBP.
Steven Lu
1
apparemment, certaines personnes ont signalé des avantages liés à l'exécution de "purge" apple.stackexchange.com/questions/67031/… non négatif
rogerdpack

Réponses:

19

Par définition, une mémoire inactive est une mémoire prête à être paginée, et sa pagination peut impliquer l'écriture de celle-ci sur swap. Ce n'est pas un type de problème ou de problème qui devrait être optimisé; c'est en fait OS X qui fonctionne comme prévu .

Malheureusement, les rédacteurs du support technique ne sont pas des développeurs du noyau et la citation de l'article de support de la base de connaissances Apple est tout simplement fausse lorsqu'elle prétend que la mémoire inactive est une mémoire inutilisée par les programmes. Lorsque vous quittez un programme, toute sa mémoire résidente devient libre; ça ne s'arrête pas en inactif. Cependant, le deuxième lien vers le site du développeur décrivant le fonctionnement de la gestion de la mémoire est une bonne ressource, s'il est lu intégralement.

Il existe de nombreuses idées fausses sur la signification de "mémoire inactive" dans OS X. Contrairement aux idées fausses, toutes les mémoires inactives ne sont pas vides, non utilisées, en cache ou non exploitables. En fait, la mémoire active peut également être mise en cache ou purgée, si elle a été utilisée récemment. Une grande partie de la mémoire inactive contient également des données qui ne peuvent pas être simplement supprimées. Si elle était supprimée, les programmes se bloqueraient, car les pages supprimées contiendraient des données valides (comme l'indique la citation du développeur OS X), et les programmes s'attendent à ce que les données stockées dans la mémoire (virtuelle) ne disparaissent pas.

La mémoire inactive contient les mêmes types de données que la mémoire active. La seule différence est que OS X a remarqué que certains morceaux de mémoire n’avaient pas été lus ni écrits depuis un moment.

La raison pour laquelle OS X classe une partie de la mémoire comme étant inactive et d'autres régions comme étant "active" est liée à la pagination. Lorsque la mémoire est insuffisante, vous allez devoir extraire certaines données. La question est, quelles données? Si vous mettez en page les données dont un programme a immédiatement besoin, il perd du temps et ne produit rien. Vous souhaitez donc mettre en mémoire un programme qu’il n’aura pas besoin d’utiliser immédiatement à nouveau.

Il est difficile d’anticiper les pages qui risquent d’être inutiles à l’avenir car un programme peut utiliser sa mémoire virtuelle à sa guise et ne rien dire au système d’exploitation en ce qui concerne ses plans. Mais comme heuristique, la plupart des programmes sont "collants" dans leur utilisation de la mémoire; s'ils n'utilisent pas une partie de la mémoire depuis un moment, ils continueront probablement de ne pas utiliser cette mémoire et continueront d'utiliser la mémoire qu'ils ont utilisée récemment.

Ainsi, lorsque le système d'exploitation décide de mettre en page certaines données, il adopte la stratégie d'échange de pages qui n'ont pas été utilisées récemment. C'est pourquoi OS X trie la mémoire occupée par les programmes en deux piles "active" et "inactive". Le lien publié ci-dessus vers le site du développeur, s'il est lu intégralement, indique comment ce processus se déroule:

  • Lorsque la mémoire commence à manquer, le système d'exploitation commence à parcourir les pages de mémoire actives et définit un drapeau sur chacune d'elles.
  • Si un programme lit ou écrit sur une page, l'indicateur est effacé.
  • Si, après un certain délai, l'indicateur n'est pas effacé, cette page est classée dans la pile "inactive".
  • Si une page "inactive" est accédée par son programme, elle est replacée dans la pile "active".
  • Lorsque la mémoire est épuisée, les pages "inactives" sont renvoyées.

Notez que ce processus de tri pour décider de la mémoire à échanger est similaire sur tous les systèmes d'exploitation modernes. Linux a les deux mêmes listes de pages actives et inactives, décrites dans la section Présentation du gestionnaire de mémoire virtuelle Linux . Windows pourrait utiliser quelque chose d'un peu différent avec plus de deux classes de récence; Je ne trouve pas de description technique récente et fiable pour le moment. Plus d'implémentations sont discutées à la page Wikipedia intitulée "Algorithme de remplacement de page" . La seule différence avec OS X réside dans la présentation des statistiques: quelqu'un a décidé qu'il serait judicieux d'indiquer des numéros distincts pour les topmoniteurs actifs et inactifs du moniteur d'activité. Rétrospectivement, ce n'était probablement pas une si bonne idée (et cela a changé dans OS X 10.9.)

Ce processus de définition et de suppression des indicateurs et de maintien des segments actifs / inactifs nécessite un peu de puissance processeur. Pour cette raison, OS X ne le fait pas quand il y a beaucoup de mémoire libre. Ainsi, les premiers programmes que vous démarrez apparaîtront comme toute la mémoire "active" jusqu'à ce que la mémoire disponible commence à être saturée.

Ainsi, alors que vous démarrez d'une ardoise vierge et ouvrez de plus en plus de programmes, vous pouvez vous attendre à voir la progression suivante dans Activity Monitor:

  • Premièrement, il y a beaucoup de mémoire "libre" et très peu inactive. Cela est dû au fait que le marqueur de mémoire n'a pas commencé à s'exécuter.
  • Au fur et à mesure que la quantité de mémoire disponible diminue, OS X commence à utiliser son indicateur de mémoire et vous constaterez une augmentation de la quantité "inactive". Chaque bit "inactif" était auparavant "actif".
  • Lorsque vous manquez de mémoire libre, les pages de la pile "inactive" seront renvoyées. Le marqueur de mémoire exécutera également un tri complet de la mémoire en actifs et inactifs. En règle générale, vous verrez beaucoup d’activités «inactives» lors de l’écriture de l’échange, indiquant que le marqueur-mémoire fait ce qu’il est censé faire.

Les pages doiventêtre classés comme inactifs avant leur permutation. C’est ce que la citation du site Apple Developer signifie lorsque l’on dit "Ces pages contiennent des données valides mais peuvent être libérées de la mémoire à tout moment". Cela s'oppose aux pages actives, qui ne seront publiées qu'une fois rétrogradées en inactives. Il existe différentes manières de publier des pages. si la page a été mappée à partir d'un fichier et n'a pas été modifiée, elle peut être immédiatement supprimée et relue à la demande. De même, s'il s'agit de mémoire précédemment permutée et non modifiée, les programmes peuvent également allouer explicitement du cache et de la mémoire purulable pour stocker des données pouvant être oubliées et recréées à la demande (mais la raison pour laquelle un programme allouait du cache est si cela prend beaucoup de temps pour recréer ces données.

Par conséquent, le fait de regarder la quantité de mémoire "inactive" dans Activity Monitor et de constater qu'il y a beaucoup d'inactifs en même temps que l'ordinateur écrit pour permuter, vous indique seulement que le système fonctionne comme prévu.

Il existe également une confusion entre la mémoire inactive et le cache de fichiers. Je ne suis pas sûr de la raison de cette confusion, car Activity Monitor les répertorie déjà sous des en-têtes distincts. Le cache est la mémoire utilisée pour stocker les données récentes lues ou écrites dans le système de fichiers, au cas où il faudrait y accéder à nouveau. Lorsque la mémoire est faible, OS X a tendance à se débarrasser en premier du cache. Si vous avez des échanges d'échange et que le moniteur d'activité affiche une grande quantité de mémoire cache (PAS inactive), cela pourrait poser problème. Mais la mémoire inactive est une chose différente.

En cas de doute, ignorez la distinction entre "inactif" et "actif". Considérez-les comme un morceau de "mémoire utilisée par les programmes" et additionnez les deux nombres. C’est ce que tous les autres systèmes d’exploitation font en vous parlant de l’utilisation de la mémoire.

NOTE pour OS X 10.9: Mavericks a introduit la "compression de mémoire", qui est plus ou moins une autre couche d’échange. Les pages actives sont maintenant classées inactives, puis compressées (ce qui peut apparaître sous forme de mémoire du noyau selon les outils que vous utilisez), puis écrites pour être échangées au fur et à mesure de l'augmentation de l'utilisation de la mémoire. Mavericks a également cessé d'afficher des numéros distincts pour les actifs et les inactifs dans Activity Monitor, car il s'avère que ce n'est pas une chose utile à regarder, surtout en raison des idées fausses qui l'entourent.

encombrement
la source
4

Il n’existe actuellement aucun moyen simple d’ajuster le comportement de swapiness (ou du moins on l’appelle) de macos X. Quelques hacks sont toutefois disponibles (nécessite un compte développeur et un SDK):

http://cestdelamerde.com/archives/22-Killing-Mac-OS-X-Swapping-How-To-Disable-dynamic_pager.html

http://dropsafe.crypticide.com/article/3848

Bonne chance!

Postscript. J'imagine que vous voudrez peut-être lire cette réponse (également de moi) pour avoir un aperçu plus général des mémoires actives, inactives et autres dans MacOSX: Mémoire câblée ou mémoire active dans OS X

bubu
la source
Merci pour vos réponses. Ajuster le swappiness serait certainement utile - dommage que ce ne soit pas facile! En ce qui concerne le premier lien, je cherche vraiment un hack qui n'inclue pas la désactivation de swap / dynamic_pager et le redémarrage, car cela nécessite trop d'efforts pour désactiver l'utilisation de swap, tout en laissant le système instable à l'approche de la quantité minimale. de mémoire inactive et libre. Le 2e lien fait référence au problème du nombre croissant de fichiers d'échange. Bien que et question importante surtout quand on manque de fichiers d'échange, ce n'est pas vraiment pertinent pour ma question dans ce fil ...
Motin
4

Ce n’est pas une solution permanente, mais au moins, cela peut aider à récupérer une partie de la mémoire inactive, en évitant potentiellement l’échange redouté: http://itunes.apple.com/nz/app/freememory/id460931672?mt=12

L'outil est gratuit et facile à utiliser. Une fois démarré, sélectionnez son option "Mémoire libre" dans la barre d’outils / le menu du système.

Contrairement à l'affichage de la mémoire ActivityMonitor, il ne montre que la mémoire libre, ce qui semble être un meilleur indicateur de la permutation en cours ou non.

Jörn Zaefferer
la source
J'évalue cette application depuis votre suggestion il y a environ deux mois. Il semble que cette application augmente effectivement la quantité de mémoire "libre" grâce à diverses astuces, y compris la revendication agressive de beaucoup de mémoire pour elle-même, puis sa libération. Toutefois, cela entraîne le transfert de la même quantité de mémoire libérée. C'est-à-dire que cela n'aide pas à libérer de la mémoire, seulement à déplacer le contenu de la mémoire de la RAM au disque dur. En fin de compte, cela provoque de nombreux swap-ins lorsque j'essaie d'utiliser les applications ouvertes tout en libérant de la mémoire, car une grande partie de sa machine virtuelle est maintenant en swap. :(
Motin
@Motin, j'ai utilisé FreeMemory pendant des mois, et cela ne se produit pas, du moins d'après mon expérience. Si je devais deviner de manière éclairée (d'après ce que j'ai vu dans Activity Monitor), la différence est que FM utilise d'abord la mémoire "active", qui est priorisée par rapport aux caches de disque. Il "libère" une autre mémoire en étant prioritaire, puis libère sa propre mémoire. Je ne l'ai jamais vu augmenter considérablement l'échange (peut-être une petite quantité allouée pendant la consommation).
eyelidlessness
2

À partir de OS X 10.5, les problèmes de gestion de la mémoire sous MAC OS X sont évidents. Le Web était déjà encombré de plaintes concernant le ralentissement considérable du système après un certain temps. À l'époque, j'avais une machine plus lente, Mac Mini avec 1 Go de RAM, alors j'ai (à tort) conclu que c'était dû à un matériel de qualité inférieure.

Maintenant, j'ai 2010 MBP, Core i7, 8 Go de RAM, double GPU. Mac OS X Snow Leopard était pénible, mais après avoir migré vers OS X Lion, travailler sur des logiciels sérieux sur MAC a commencé à devenir un cauchemar.

J'ai finalement réussi à reproduire le scénario problématique, alors j'ai lancé le test et enregistré l'écran, en vidéo.

Problème de performance de MAC OS X Lion

J'exécute la commande tar + bzip, qui contient des éléments Unix de base, sur la grande quantité de fichiers image de mon dossier Images /. Juste avant de commencer, j'exécute la commande "purge" pour supprimer les données de programme inactives / mises en cache.

Vous pouvez voir sur la vidéo que la mémoire disponible commence à chuter très rapidement et que l'inactivité augmente constamment. Si vous regardez la commande "bsdtar", il ne faut qu'un fragment de RAM, le problème ne réside donc pas dans ce processus. Vous ne pouvez pas dire qu'il s'agit d'une fuite de mémoire de programme, car le problème ne serait donc pas dans une mémoire RAM inactive, mais dans un état actif / câblé.

Lorsque la mémoire disponible est tombée au-dessous de 100 Mo, j'ai lancé certaines applications, telles que Safari, iPhoto et MS Word, et vous pouvez voir dans la vidéo que le démarrage d'une application prend même quelques minutes. Normalement (lorsqu'il y a de la RAM libre), prendrait environ 3-5 secondes à charger.

Je lance le même scénario et les mêmes commandes sur ma machine Linux Centos 6, pas de problème! L'utilisation de la mémoire est d'environ 10 à 20 Mo, pas de problème de cache / tampon.

La gestion de la mémoire doit être très cassée dans Mac OS X!

egremyl
la source
2
Ce que vous voyez, c'est que le système met en cache des fichiers en mémoire. Je conviens qu'il y a un problème, en ce sens que le cache ne semble jamais être purgé ... mais le cache lui-même (et la croissance de la mémoire inactive en conséquence) est une fonction de performance saine et parfois utile.
eyelidlessness
De plus, l'environnement de test est loin d'être stérile. Nous ne pouvons pas savoir ce que fait QuickTime Player, ni aucun des autres programmes ouverts.
chrishiestand
1

Je parie qu'il n'y a pas de bonne réponse à cela. Il en va de même avec la mémoire qui reste active lorsque vous mettez votre Mac en veille, elle ne fait que grandir et grandit avec chaque sommeil que vous prenez.

Du côté "amusant" (c'est-à-dire coûteux), vous pouvez mettre à niveau votre mémoire ou remplacer le disque dur par un SSD, de sorte que la permutation ne sera pas celle d'un coup dur pour la performance. J'ai choisi la première option, car la mémoire Corsair est maintenant disponible à un prix raisonnable.

16 Go de RAM


la source
2
Gardez à l'esprit que les SSD ont des cycles d'écriture limités. Notez également que pour les disques SSD non activés, les écritures peuvent finir par coûter cher car la cellule Flash doit être effacée.
Crabe ondulé
Pouvez-vous citer une source sur le problème "Le sommeil provoque une augmentation de l'utilisation de la mémoire"?
GordonM
Puis-je citer mon expérience? :) J'ai fait une recherche rapide et trouvé ceci: discussions.apple.com/message/21624847#21624847 + de nombreux sujets liés à la mémoire inactive ne sont pas effacés lorsque cela est nécessaire. J'ai personnellement vu comment, après chaque sommeil, la mémoire inactive reste comme avant et augmente. «purger» est une option, mais je ne voudrais pas purger la mémoire inactive toutes les 20 minutes (je parie que ce serait le cas avec 4 Go de RAM).
1
@WavyCrab Les disques SSD peuvent avoir des cycles d'écriture limités, mais il n'y a aucune chance que vous atteigniez cette limite. Je ne m'inquiéterais pas de cela, sauf s'il s'agit d'un disque SSD pour un centre de données. Dans tous les cas, si vous écrasez excessivement le disque SSD, vous lâcherez un disque dur plus tôt.
andreadi