Lorsque j'essaie d'effectuer un calcul qui nécessite l'allocation et l'utilisation de 128 Go de mémoire (il s'agit d'un programme en ligne de commande écrit en C), le noyau tue mon processus avec un préjudice extrême. Cette entrée du journal de la console en est un exemple :
9/25/15 7:08:40.000 PM kernel[0] : low swap : killing pid 6202 (huffgrp)
Le calcul fonctionne bien et en un temps raisonnable lorsqu'il alloue et utilise 64 Go de mémoire. Ma machine a 32 Go de RAM et beaucoup d'espace sur le disque dur. J'ai également essayé sur une autre machine avec 8 Go de RAM, sur laquelle le calcul de 64 Go fonctionne bien aussi, en prenant plus de temps bien sûr, mais le calcul de 128 Go est tué par le noyau de la même manière. Sur les deux machines, j'utilise Yosemite 10.10.5.
Au fait, malloc()
ne renvoie jamais d'erreur, quelle que soit la quantité d'espace que je demande. Le noyau n'arrêtera le processus qu'une fois qu'une trop grande partie de cette mémoire sera utilisée par le processus, ce qui entraînera beaucoup de swapping sur le disque dur.
Il semble donc y avoir une limite secrète d'espace d'échange quelque part entre 64 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 qui semble prometteur, /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
mais je ne vois pas le numéro secret là-dedans. La page de manuel de dynamic_pager
dit que tout ce qu'il fait est de définir le nom et l'emplacement des fichiers d'échange. Il existe une version plus ancienne de la même page de manuel qui documente une méthode d'utilisation de l'espace de pagination. -S
pour définir la taille des fichiers d'échange créés. J'ai essayé cela, en demandant des swapfiles de 160 Go, mais cela n'a eu aucun effet. Les fichiers d'échange étaient toujours de 1 Go chacun, et le processus était toujours tué par le noyau.