No Mac OS X Yosemite 10.10.5, quando tento executar um cálculo que precisa alocar e usar 128 GB de memória (é um programa de linha de comando escrito em C), o kernel mata meu processo com extremo prejuízo. Esta entrada de log do console é um exemplo de uma instância:
9/25/15 7:08:40.000 PM kernel[0]: low swap: killing pid 6202 (huffgrp)
O cálculo funciona bem e em um período de tempo razoável quando aloca e usa 64 GB de memória. Meu Mac tem 32 GB de RAM e espaço no disco rígido. Eu também tentei isso em outro Mac com 8 GB de RAM, no qual o cálculo de 64 GB corre bem também, levando mais tempo, claro, mas o cálculo de 128 GB é morto pelo kernel da mesma forma.
A propósito, malloc()
nunca retorna um erro, não importa quanto espaço eu peça. O kernel irá apenas matar o processo, uma vez que muito daquela memória está realmente sendo usada pelo processo, resultando em muita troca pelo disco rígido.
Portanto, parece haver um limite de espaço de troca secreta em algum lugar entre 64 GB e 128 GB.
A minha pergunta é: como reconfigurar o kernel para permitir mais espaço de troca? Eu encontrei um arquivo de aparência promissora, /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
, mas não vejo o número secreto lá. A man page para dynamic_pager
diz que tudo o que ele faz é definir o nome e a localização dos arquivos de troca. Há uma versão mais antiga da mesma página man que documenta uma opção -S
para definir o tamanho dos arquivos de swap criados. Eu tentei isso, solicitando swapfiles de 160 GB, mas não teve efeito. Os arquivos de swap ainda tinham 1 GB cada, e o processo ainda era morto pelo kernel.