Sur Mac OS X Yosemite 10.10.5, lorsque j'essaie d'exécuter un calcul qui doit allouer et utiliser 128 Go de mémoire (c'est un programme de ligne de commande écrit en C), le noyau tue mon processus avec un préjudice extrême. Cette entrée de journal de la console est un exemple d'une instance:
9/25/15 7: 08: 40.000 PM kernel [0]: swap faible: tuant le pid 6202 (huffgrp)
Le calcul fonctionne correctement et dans un laps de temps raisonnable lorsqu'il alloue et utilise 64 Go de mémoire. Mon Mac a 32 Go de RAM et beaucoup d'espace 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 bien également, ce qui prend plus de temps bien sûr, mais le calcul de 128 Go est tué par le noyau de la même manière.
Soit dit en passant, malloc()
ne renvoie jamais d'erreur, quel que soit l'espace que je demande. Le noyau ne tuera le processus qu'une fois qu'une trop grande partie de cette mémoire est réellement utilisée par le processus, ce qui entraîne de nombreux échanges 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: comment reconfigurer le noyau pour permettre plus d'espace de swap? J'ai trouvé un fichier d'aspect prometteur /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
, mais je n'y vois pas le numéro secret. La page de manuel de dynamic_pager
indique que tout ce qu'il fait est de définir le nom et l'emplacement des fichiers d'échange. Il existe une ancienne version de la même page de manuel qui documente une -S
option pour définir la taille des fichiers d'échange créés. J'ai essayé, demandant des fichiers d'échange 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.
malloc
plus que ce que vous avez est que le commit_limit est très élevé (probablement infini). Par conséquent, le système d'exploitation allouera de la mémoire qu'il n'a pas (cela parie que le processus ne l'utilisera pas, le système d'exploitation gagne généralement ce pari). Vous souhaiterez peut-être ajuster la limite de validation pour être la limite de mémoire, de cette façon, le processus échouera tôt.
malloc()
. Je déviais les commentaires possibles sur quelqu'un pensant que je ne vérifie pas la valeur de retour de malloc()
. Soit dit en passant, mon objectif n'est pas d'échouer plus tôt. Mon objectif est de réussir.