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.
la source
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 demalloc()
. Soit dit en passant, mon objectif n'est pas d'échouer plus tôt. Mon objectif est de réussir.Réponses:
Ce n'est pas la réponse que vous avez demandée, mais si vous créez votre propre fichier d'une taille appropriée, mappez-le dans votre processus, puis exécutez votre calcul dans cet espace d'adressage, il devrait avoir le même effet qu'un fichier d'échange et vous êtes assuré de avoir l'espace, par opposition à la concurrence avec d'autres processus pour RAM / swap disponible.
Cela peut également être plus lent, selon la fréquence à laquelle vous écrasez les données, mais devrait être beaucoup plus portable.
la source
mmap()
.msync()
pour le forcer à le faire?Mes informations mac sont assez datées, il se peut qu'il n'y ait plus de magie du noyau pour 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 liées à l'utilisation d'un dossier d'échange dynamique. Créez une partition de swap physique (juste une partition vide non formatée, avec un code de type de table de disque pour le swap, sous Linux c'est du code hexadécimal
0x82
.) Ensuite:mount -vat swap
pdisk /dev/disk? -dump
/dev/disk?s?? none swap sw 0 0
la source