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.
fuente
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 demalloc()
. Por cierto, mi objetivo no es fallar antes. Mi objetivo es tener éxito.Respuestas:
No es la respuesta que solicitó, pero si crea su propio archivo de un tamaño apropiado, mmaplo en su proceso y luego ejecute su cálculo en este espacio de direcciones, debería tener el mismo efecto que un archivo de intercambio y está garantizado que tener el espacio, en lugar de competir con otros procesos para RAM / intercambio disponibles.
También puede ser más lento, dependiendo de la frecuencia con la que sobrescribe los datos, pero debería ser mucho más portátil.
fuente
mmap()
.msync()
para obligarlo a hacerlo?La información de mi Mac está bastante anticuada, ya no puede ser la magia del núcleo para hacer esto. Como tal, sugiero usar Linux para este programa, donde puede montar una carpeta o partición como intercambio de manera muy simple.
Elimine las incertidumbres del uso de una carpeta de intercambio dinámico. Cree una partición física de intercambio (solo una partición vacía sin formato, con código de tipo de tabla de disco para intercambio, en Linux es código hexadecimal
0x82
). Luego:mount -vat swap
pdisk /dev/disk? -dump
/dev/disk?s?? none swap sw 0 0
fuente