69 votes

Comment empêcher Mac OS X d'utiliser le swap lorsqu'il reste de la mémoire "inactive" ?

Un phénomène courant dans mon utilisation quotidienne d'OS X (et celle de plusieurs autres personnes d'après divers messages sur Internet) est que le système semble devenir lent lorsqu'il n'y a plus de mémoire "libre" disponible. Cela est supposé être dû à l'échange de mémoire, puisque l'activité disque est importante et que vm_stat rapporte de nombreuses sorties. (Corrigez-moi si je me trompe)

Cependant, la quantité de mémoire vive "inactive" est typiquement autour de 12.5%-25% de toute la mémoire disponible (^1.) quand le swapping commence/se produit/se termine.

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

Mémoire inactive

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

Par exemple, si vous avez utilisé Mail et que vous l'avez quitté, la RAM que Mail utilisait 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. Cependant, si vous ouvrez Mail avant que sa mémoire inactive soit utilisée par une autre une autre application, Mail s'ouvrira plus rapidement car sa mémoire inactive est convertie en mémoire active, au lieu d'être utilisée par une autre application. est convertie en mémoire active, au lieu de charger Mail à partir du disque dur plus lent. disque dur 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 mémoire physique mais qui n'ont pas été accédées récemment. Ces pages contiennent des données valides mais peut être libéré de la mémoire à tout moment .

Donc, en gros : Lorsqu'un programme a quitté, sa mémoire est marquée comme inactive et peut être réclamée à tout moment. Cependant, OS X préférera commencer à échanger de la mémoire vers le fichier Swap plutôt que de simplement réclamer cette mémoire, dès que la mémoire "Libre" devient trop faible.

Pourquoi ? Quel est l'avantage de ce comportement par rapport à, disons, la libération instantanée de la mémoire inactive sans même toucher au fichier d'échange ? Certaines sources (^2.) indiquent qu'OS X mettrait en page la mémoire "Inactive" dans le fichier d'échange avant de la libérer, mais cela n'a pas de sens maintenant, n'est-ce pas, si la mémoire peut être libéré de la mémoire à tout moment ? L'échange est coûteux, la libération est bon marché, n'est-ce pas ?

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

J'apprécie vraiment purger ainsi que le concept de réparation des permissions du disque pour forcer un peu de 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 swap/release...

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 PO a reposé la question centrale, aucune des réponses n'y répond...

^1. MISE À JOUR 17-mar-2012 Depuis que j'ai posté cette question pour la première fois, je suis passé de 4 à 8 Go de mémoire vive installée, et le problème demeure. La quantité de ram "inactive" était de 0.5gb-1.0gb avant et est maintenant typiquement autour de 1.0-2.0GB quand le swapping commence/se produit/se termine, c'est-à-dire qu'il semble qu'environ 12.5%-25% de la ram est préservée comme inactive par la logique du noyau osx.

^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-work-day :

Une fois que toute la mémoire est utilisée (la mémoire libre est égale à 0), le système d'exploitation écrit la mémoire inactive dans le fichier d'échange pour faire plus de place dans la mémoire active.

MISE À JOUR 17-mar-2012

Voici un tour d'horizon des méthodes qui ont été suggérées pour aider jusqu'à présent :

Le site purger commande

"Utilisé pour approximer les conditions initiales de démarrage avec un cache tampon de disque froid pour l'analyse des performances. Il n'affecte pas la mémoire anonyme qui a été allouée par malloc, vm_allocate, etc".

Ceci est utile pour empêcher osx de remplacer le cache du disque (ce qui est ridicule car osx le fait en premier lieu), mais avec l'inconvénient que le cache du disque est libéré, ce qui signifie que si le cache du disque n'était pas sur le point d'être remplacé, on se retrouverait simplement avec un cache buffer froid sur le disque, ce qui affecterait probablement les performances de manière négative.

Le site Application FreeMemory et/ou Réparation des permissions du disque pour forcer de la mémoire libre

Cela n'aide pas libérant aucune mémoire, seulement déplacer quelques gigaoctets de contenu mémoire de la RAM vers le HD. Au final, cela provoque beaucoup de swap-ins lorsque j'essaie d'utiliser les applications qui étaient ouvertes pendant la libération de la mémoire, car une grande partie de leur vm est maintenant en swap.

Accélérer l'allocation de swap en utilisant dynamicpagerwrapper

Cela semble une bonne chose à faire pour accélérer l'utilisation de l'espace de pagination, mais cela ne résout pas le problème de l'espace de pagination d'osx alors qu'il y a encore de la mémoire inactive.

Désactiver le swap en désactivant afficheur dynamique et le redémarrage

Cela forcera osx à ne pas utiliser le swap au prix d'un blocage du système lorsque toute la mémoire est utilisée. Ce n'est pas une alternative viable...

Désactiver le swap en utilisant un dynamicpager piraté

Comme pour la désactivation de dynamicpager ci-dessus, certains extraits des commentaires de l'article de blog indiquent que ce n'est pas 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 d'exploitation se bloque...", "Si vous consommez toute la mémoire du Mac, la machine va probablement se bloquer".

Pour résumer, je n'ai toujours pas connaissance d'un moyen d'empêcher Mac OS X d'utiliser le swap lorsqu'il reste de la mémoire "inactive". Si ce n'est pas possible, il y a peut-être au moins une explication quelque part de la raison pour laquelle osx préfère échanger de la mémoire que peut être libéré de la mémoire à tout moment ?

22voto

crowding Points 456

Par définition, la mémoire inactive est la mémoire qui est prête à être paginée, et la paginer peut impliquer de l'écrire dans le swap. Ce n'est pas un problème quelconque ou un problème qui devrait être optimisé ; c'est en fait OS X fonctionne comme prévu .

Malheureusement, les rédacteurs de l'assistance technique ne sont pas des développeurs de noyau, et la citation de l'article d'assistance de la base de connaissances d'Apple est tout simplement fausse lorsqu'elle affirme que la mémoire inactive est la mémoire inutilisée par les programmes. Lorsque vous quittez un programme, toute sa mémoire résidente devient Libre ; elle ne s'arrête pas en Inactif. Cependant, le deuxième lien vers l'article site du développeur qui décrit le fonctionnement de la gestion de la mémoire est une bonne ressource, à condition de la lire entièrement.

Il existe de nombreuses idées fausses sur la signification de la "mémoire inactive" dans OS X. Contrairement à ces idées fausses, toute la mémoire inactive n'est pas vide, inutilisée, en cache ou purgeable. En fait, la mémoire active peut également être mise en cache ou purgée, si elle a été récemment accédée. Une grande partie de la mémoire inactive contient également des données qui ne peuvent pas être simplement éliminées. Si elles étaient éliminées, les programmes planteraient, car les pages éliminées auraient contenu des données valides (comme le dit la citation du côté du développeur d'OS X) et les programmes s'attendent à ce que les données qu'ils ont stockées dans la mémoire (virtuelle) ne disparaissent pas simplement.

La mémoire inactive contient les mêmes types de données que la mémoire active. La seule différence est qu'OS X a remarqué que certaines parties de la mémoire n'ont pas été lues ou écrites depuis un certain temps.

La raison pour laquelle OS X classe certaines zones de mémoire comme inactives et d'autres comme "actives" est liée à la pagination. Lorsque la mémoire est faible, vous allez devoir sortir certaines données. La question est de savoir quelles données. Si vous effacez des données dont un programme a besoin immédiatement, vous perdez du temps et ne faites rien. Il est donc préférable d'effacer la mémoire qu'un programme n'aura pas immédiatement besoin d'utiliser à nouveau.

Il est difficile de prévoir quelles pages seront probablement inutiles à l'avenir, car un programme peut utiliser sa mémoire virtuelle comme il l'entend sans rien dire au système d'exploitation de ses projets. Mais à titre heuristique, la plupart des programmes sont "collants" dans leur utilisation de la mémoire ; s'ils n'ont pas utilisé une partie de la mémoire depuis un certain temps, il est probable qu'ils continueront à ne pas utiliser cette mémoire, et qu'ils continueront à utiliser la mémoire qu'ils ont récemment utilisée.

Ainsi, lorsque le système d'exploitation décide de mettre en page certaines données, il adopte la stratégie consistant à échanger les 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 site lien affiché ci-dessus sur le site du développeur, s'il est lu intégralement, indique comment ce processus se déroule :

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

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 possède les deux mêmes listes de pages actives et inactives, comme décrit dans la section Comprendre le gestionnaire de mémoire virtuelle de Linux . Windows pourrait utiliser quelque chose d'un peu différent avec plus de deux classes de récence ; je ne peux pas trouver une description technique récente et fiable pour le moment. D'autres implémentations sont discutées à la page Wikipedia intitulée "Algorithme de remplacement de page" . La seule différence avec OS X était la façon dont les statistiques étaient affichées : quelqu'un a décidé que ce serait une bonne idée d'afficher des chiffres séparés pour les actifs et les inactifs dans la base de données. 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 d'activation et de désactivation des drapeaux et de maintien des tas actifs/inactifs nécessite un peu de puissance du processeur. Pour cette raison, OS X ne le fait pas lorsqu'il y a beaucoup de mémoire libre. Ainsi, les premiers programmes que vous démarrez seront affichés en tant que mémoire "active" jusqu'à ce que la mémoire libre commence à être faible.

Ainsi, si vous partez d'une page blanche et ouvrez de plus en plus de programmes, vous pouvez vous attendre à voir la progression suivante dans le moniteur d'activité :

  • Premièrement, il y a beaucoup de mémoire "libre" et très peu de mémoire inactive. C'est parce que le flagger de mémoire n'a pas commencé à fonctionner.
  • Au fur et à mesure que la quantité de mémoire libre diminue, OS X commencera à faire tourner son indicateur de mémoire, et vous commencerez à voir la quantité d'"inactif" augmenter. Chaque bit d'"inactif" était auparavant "actif".
  • Lorsque vous n'avez plus de mémoire libre, les pages de la pile "inactive" sont supprimées. Le destructeur de mémoire fonctionnera également à plein régime en triant la mémoire entre active et inactive. En général, vous verrez beaucoup de pages "inactives" pendant que l'on écrit dans le swap, ce qui indique que la bascule mémoire fait ce qu'elle est censée faire.

Pages debe être classées comme inactives avant d'être remplacées. C'est ce que la citation du site Apple Developer signifie lorsqu'elle dit "Ces pages contiennent des données valides mais peuvent être libérées de la mémoire à tout moment." Ceci s'oppose aux pages actives, qui ne seront libérées qu'après avoir été rétrogradées en inactives. Il existe plusieurs façons de libérer des pages ; si la page a été mappée à partir d'un fichier et n'a pas été modifiée, elle peut être supprimée immédiatement et relue à la demande. Il en va de même s'il s'agit d'une mémoire qui avait été précédemment échangée et qui n'a pas été modifiée depuis son insertion. Les programmes peuvent également allouer explicitement de la mémoire cache et de la mémoire purgeable, pour stocker des données qui peuvent être oubliées et recréées à la demande (mais la raison pour laquelle un programme allouerait de la mémoire cache est qu'il faut un temps significatif pour recréer ces données). Mais la plupart des mémoires inactives sont des mémoires dans lesquelles les programmes ont écrit des données valides, et la pagination de ces données nécessite d'écrire dans le swap.

Par conséquent, si vous regardez la quantité de mémoire "inactive" dans le moniteur d'activité et que vous constatez qu'il y a beaucoup de mémoire inactive en même temps que l'ordinateur écrit dans le swap, cela vous indique seulement que le système fonctionne comme prévu.

Il y a également une confusion entre la mémoire inactive et le cache des fichiers. Je ne sais pas pourquoi il y a cette confusion, car Activity Monitor les répertorie déjà sous des rubriques distinctes. Le cache est une mémoire utilisée pour stocker les données récentes qui ont été 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 du cache en premier. Si vous avez des problèmes de swap, et que le moniteur d'activité montre un gros tas de cache (PAS inactif) alors que serait un 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 seul bloc de "mémoire utilisée par les programmes" et additionnez les deux chiffres. C'est ce que font tous les autres systèmes d'exploitation lorsqu'ils vous parlent 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 de swap. Les pages actives sont maintenant classées inactives, puis compressées (ce qui peut apparaître comme de la mémoire du noyau en fonction des outils que vous utilisez), puis écrites dans le swap lorsque l'utilisation de la mémoire augmente. Mavericks a également cessé d'afficher des chiffres distincts pour l'actif et l'inactif dans Activity Monitor, car il s'avère que ce n'est pas une chose utile à regarder, surtout compte tenu des idées fausses qui l'entourent.

4voto

bubu Points 9693

Il n'y a actuellement aucun moyen facile d'ajuster le comportement de swappiness (ou c'est ainsi qu'il est appelé) de macos X. Il existe cependant quelques astuces (qui nécessitent un compte de 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 !

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

4voto

Jörn Zaefferer Points 149

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

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

Contrairement à l'affichage de la mémoire d'ActivityMonitor, il n'indique que la mémoire libre, ce qui semble être un meilleur indicateur de la présence ou non de swapping.

3voto

egremyl Points 31

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

Maintenant j'ai un MBP 2010, core i7, 8 GB RAM, dual GPU. Mac os X Snow Leopard était douloureux, mais après avoir migré vers OS X Lion, travailler sur des choses sérieuses sur MAC a commencé à être 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 la mémoire défaillante

Je lance la commande tar+bzip, qui est un truc unix de base, sur la grande quantité de fichiers d'images, dans mon dossier Pictures/. Juste avant le démarrage, j'exécute la commande "purge", pour supprimer les données inactives/cachées du programme.

Vous pouvez voir sur la vidéo que la mémoire libre commence à baisser très rapidement, et que la mémoire inactive augmente constamment. Si vous regardez la commande "bsdtar", elle ne prend qu'un fragment de RAM, donc le problème n'est pas dans ce processus. Vous ne pouvez pas dire qu'il s'agit d'une fuite de mémoire du programme, car alors le problème ne serait pas dans la RAM inactive, mais plutôt dans la RAM active/câblée.

Quand la mémoire libre est descendue en dessous de 100mb, j'ai lancé quelques applications, comme Safari, iPhoto et MS Word, et vous pouvez voir dans la vidéo, qu'il faut même des minutes pour lancer une application, alors que normalement (quand il y a de la RAM libre), cela prendrait 3-5 secondes pour charger.

J'exécute le même scénario et les mêmes commandes sur ma boîte Linux Centos 6, aucun problème ! L'utilisation de la mémoire est d'environ 10-20mb, pas de problèmes avec le cache/buffer.

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

1voto

Je parie qu'il n'y a pas de bonne réponse à cette question. C'est la même chose avec la mémoire qui reste active lorsque vous mettez votre Mac en veille, elle ne fait que croître et croître à chaque fois que vous vous endormez.

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 soit pas un problème de performance. J'ai choisi la première option, car la mémoire Corsair est maintenant disponible à un prix raisonnable.

16GB RAM

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X