En Mac OS X Yosemite 10.10.5, cuando intento ejecutar un cálculo que necesita asignar y usar 128 GB de memoria (es un programa de línea de comandos escrito en C), el núcleo mata mi proceso con extremo prejuicio. Esta entrada del registro de la consola es un ejemplo de una instancia:
25/09/15 7: 08: 40,000 PM kernel [0]: intercambio bajo: matar a pid 6202 (huffgrp)
El cálculo funciona bien y en un período de tiempo razonable cuando asigna y usa 64 GB de memoria. Mi Mac tiene 32 GB de RAM y beaucoup espacio en el disco duro. También probé esto en otra Mac con 8 GB de RAM, en la que el cálculo de 64 GB también funciona bien, tomando más tiempo, por supuesto, pero el núcleo mata el cálculo de 128 GB de la misma manera.
Por cierto, malloc()
nunca devuelve un error, no importa cuánto espacio solicite. El núcleo solo matará el proceso una vez que el proceso esté utilizando demasiada memoria, lo que provocará un gran intercambio en el disco duro.
Por lo tanto, parece haber un límite de espacio de intercambio secreto en algún lugar entre 64 GB y 128 GB.
Mi pregunta es: ¿cómo reconfigurar el núcleo para permitir más espacio de intercambio? Encontré un archivo prometedor /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
, pero no veo el número secreto allí. La página del manual dynamic_pager
dice que todo lo que hace es establecer el nombre y la ubicación de los archivos de intercambio. Existe una versión anterior de la misma página de manual que documenta una -S
opción para establecer el tamaño de los archivos de intercambio creados. Lo intenté, solicitando archivos de intercambio de 160 GB, pero no tuvo ningún efecto. Los archivos de intercambio todavía eran de 1 GB cada uno, y el proceso todavía fue eliminado por el núcleo.
malloc
más de lo que tiene es porque commit_limit es muy alto (probablemente infinito). Por lo tanto, el sistema operativo asignará memoria que no tiene (esto es apostando a que el proceso no lo usará, el sistema operativo generalmente gana esta apuesta). Es posible que desee ajustar el límite de confirmación para que sea el límite de memoria, de esta manera el proceso fallará antes.
malloc()
hace eso. Estaba desviando posibles comentarios sobre alguien que pensaba que no estaba comprobando el valor de retorno de malloc()
. Por cierto, mi objetivo no es fallar antes. Mi objetivo es tener éxito.