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