web-dev-qa-db-fra.com

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

Un phénomène courant dans mon utilisation quotidienne (et plusieurs autres selon divers posts 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û à l’é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

Ces informations en mémoire ne sont pas utilisées activement, mais ont été utilisées récemment.

Par exemple, si vous utilisez Mail et que vous le quittez, le RAM que Mail utilisait est marqué 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 au lieu de simplement réclamer cette mémoire, chaque fois que la mémoire "libre" devient 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 aucun sens de le faire maintenant si la mémoire peut être libérée de la mémoire à tout moment? 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 purge , ainsi que le concept de réparation des autorisations de disque pour forcer une certaine quantité de mémoire libre, mais ce sont des moyens de forcer péniblement plus de mémoire libre que de réparer le swap./logique de décision de libération ...

Btw 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 le Les OP ont redemandé la question principale, aucune des réponses ne répond à une réponse ...

^ 1. MISE À JOUR DU 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 auparavant comprise entre 0,5 et 1,0 Go et se situe généralement autour de 1,0-2,0 Go lors de l’échange début/instant/lieu/fin, c’est-à-dire qu’il semble qu’environ 12,5% à 25% du ram est 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-d'une-journée-de-travail :

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 DU 17 MARS 2012

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

La commande 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 tampon de disque froid, ce qui aurait probablement une incidence négative sur les performances.

L'application FreeMemory et/ou Réparation des autorisations de disque pour forcer certains utilisateurs libres Mémoire

N'aide pas à libérer de la mémoire, seulement à déplacer quelques giga-octets 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 je tente 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 de swap avec 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 qu'il reste de la mémoire.

Désactivation du 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ésactivation du swap avec 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". "quand votre système manque de mémoire, tout le système se bloque ...", "si vous utilisez toute la mémoire du Mac, la machine va probablement se bloquer"

Pour résumer, 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 de la mémoire qui peut être libérée de la mémoire à tout moment ?

60
Motin

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 n'importe quel type de problème ou problème qui devrait être optimisé; c’est en fait que OS X 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 de développement 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’annoncer quelles pages seront probablement inutiles à l’avenir, car un programme peut utiliser sa mémoire virtuelle à sa guise et ne rien dire au système d’exploitation sur ses projets. 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 affiché 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, comme décrit dans Comprendre le 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 était la manière dont les statistiques étaient affichées: quelqu'un a décidé qu'il serait judicieux d'indiquer des numéros séparés pour actif et inactif dans top ou 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ées comme inactives avant d'être permutées. 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.) Mais une grande partie de la mémoire inactive est une mémoire sur laquelle les programmes ont écrit des données valides, et la pagination hors de ces données nécessite une écriture pour un échange.

Par conséquent, le fait de regarder la quantité de mémoire "inactive" dans Activity Monitor et de constater qu'il y a beaucoup de mémoire inactive 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 swash et que Activity Monitor affiche une grosse pile de cache (PAS inactive), alors cela poserait 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 la 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 en fonction des outils que vous utilisez), puis écrites pour être échangées à mesure que l'utilisation de la mémoire augmente. 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.

19
crowding

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 disponible, ce qui semble être un meilleur indicateur de la permutation en cours ou non.

4
Jörn Zaefferer

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. Je suppose que vous voudrez peut-être lire cette réponse (également de ma part) 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 sous OS X

4
bubu

À partir de OS X 10.5, les problèmes de gestion de la mémoire sous MAC OS X sont évidents. À l’époque, le Web était déjà encombré de plaintes concernant le ralentissement considérable du système. À 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, j'ai donc lancé le test et enregistré l'écran, en vidéo.

Problème de performance de MAC OS X Lion - Gestion de mémoire endommagée

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 se trouverait donc pas dans une mémoire morte inactive, mais bien dans 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 de l'ordre de 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!

2
egremyl

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 faites.

Du côté "amusant" (assez cher), vous pouvez mettre à niveau votre mémoire ou remplacer le disque dur par un disque SSD, pour que la permutation ne soit 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.

16GB RAM

1
user127350