Sur Mac OS X Yosemite 10.10.5, lorsque j'essaie d'exécuter un calcul nécessaire pour allouer et utiliser 128 Go de mémoire (il s'agit d'un programme de ligne de commande écrit en C), le noyau tue mon processus avec des préjugés extrêmes. Cette saisie de journal de console est un exemple d'une instance:
21/25/15 7: 08: 40.000 PM Kernel [0]: Swap faible: tuer PID 6202 (HUFFGRP)
Le calcul fonctionne bien et dans une quantité de temps raisonnable lorsqu'elle alloue et utilise 64 Go de mémoire. Mon Mac a 32 Go de RAM et espace de Beaucoup sur le disque dur. J'ai également essayé cela sur un autre Mac avec 8 Go de RAM, sur lequel le calcul de 64 Go fonctionne également bien, prenant plus de temps Bien sûr, mais le calcul de 128 Go est tué par le noyau de la même manière.
Au fait, malloc()
Ne retourne jamais une erreur, peu importe la quantité d'espace que je demande. Le noyau ne tuera que le processus une fois que trop de cette mémoire est en réalité utilisé par le processus, ce qui permettra de passer beaucoup d'échange sur le disque dur.
Il semble donc y avoir une limite d'espace d'échange secret quelque part entre 64 Go et 128 Go.
Ma question est la suivante: comment puis-je reconfigurer le noyau pour permettre plus d'espace d'échange? J'ai trouvé un fichier prometteur à la recherche, /System/Library/LaunchDaemons/com.Apple.dynamic_pager.plist
, mais je ne vois pas le numéro secret là-bas. La page man pour dynamic_pager
dit que tout cela fait est défini le nom et l'emplacement des fichiers de swap. Il y a une version plus ancienne de la même page d'homme qui documente un -S
Option pour définir la taille des swapfiles créées. J'ai essayé cela, demandant des swapfiles de 160 Go, mais cela n'avait aucun effet. Les swapfiles étaient toujours de 1 Go chacun et le processus était toujours tué par le noyau.
Pas la réponse que vous avez demandée, mais si vous créez votre propre fichier de taille appropriée, Mme IL dans votre processus, puis exécutez votre calcul dans cet espace d'adressage, il doit avoir le même effet qu'un fichier d'échange et vous êtes garanti à Avoir l'espace, par opposition à la concurrence avec d'autres processus pour la RAM/Swap disponible.
Il pourrait également être plus lent, en fonction de la fréquence à laquelle vous écrasez les données, mais devriez-vous être beaucoup plus portable.
Mon Mac Info est assez daté, il ne peut plus être le noyau de la magie du noyau de le faire. En tant que tel, je suggère d'utiliser Linux pour ce programme, où vous pouvez monter un dossier ou une partition comme échange très simplement.
Éliminez les incertitudes d'utiliser un dossier de swap dynamique. Créez une partition d'échange physique (juste une partition non formatée vide, avec le code de type de table de disque pour le swap, sous Linux, il est code hexaginal 0x82
.) Puis:
mount -vat swap
pdisk /dev/disk? -dump
/dev/disk?s?? none swap sw 0 0