Comment puis-je augmenter l'espace de swap maximum sur Mac OS X?

14

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_pagerindique 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 -Soption 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.

Mark Adler
la source
J'ai également posté cette question sur apple.stackexchange.com, mais il n'y a eu aucune réponse.
Mark Adler
1
La raison pour laquelle vous pouvez faire mallocplus 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.
ctrl-alt-delor
Je ne vois pas pourquoi vous pensez que le paragraphe 5 est vrai, il ne découle pas du paragraphe 4 (bien que vous le commenciez par «so»). Avez-vous également essayé d'ajouter beaucoup de swap? (la question n'est pas claire à ce sujet, bien que je soupçonne que la réponse est oui).
ctrl-alt-delor
@richard Oui, je sais pourquoi 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.
Mark Adler
@richard Parce que le message du noyau dit "swap faible". Quant à «ajouter beaucoup de swap», non, je ne l'ai pas fait parce que je ne sais pas comment. C'est précisément cette question. Comment ajouter de l'espace de swap? Bien sûr, le noyau ajoute automatiquement de l'espace de swap, mais seulement jusqu'à une limite. D'où la racine de la question: comment augmenter la limite d'espace de swap du noyau?
Mark Adler

Réponses:

4

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.

sans données
la source
2
Bonne idée! J'avais de grands espoirs. Hélas, ils ont été précipités contre le rivage dur de la réalité. Le processus a toujours été tué par le noyau pour de grandes quantités de swapping, comme auparavant (message de console "low swap"), même s'il utilisait un fichier que j'avais créé pour l'utiliser comme mémoire virtuelle mmap().
Mark Adler
Désolé, la plupart de mon expérience est avec Linux. Mais, peut-être que le problème est que le noyau ne retourne pas au fichier et ne le conserve pas dans la RAM à la place. Et si vous appelez périodiquement msync()pour le forcer à le faire?
données du
0

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:

  1. Modifiez le fichier / etc / rc, trouvez la section de swap commentez le tout. ajouter la lignemount -vat swap
    • signifie monter toutes les partitions de swap dans / etc / fstab
  2. courir pdisk /dev/disk? -dump
    • "?" est le numéro de disque de votre enregistrement hd, le numéro à côté de la partition de swap
  3. Modifiez ou créez / etc / fstab (il n'existe probablement pas) ajoutez une ligne comme /dev/disk?s?? none swap sw 0 0
    • ? est votre disque.
    • ?? est le numéro de la partition de swap.
  4. redémarrer.
Maximum d'énergie
la source