¿Cómo aumento el espacio de intercambio máximo en Mac OS X?

14

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_pagerdice 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 -Sopció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.

Mark Adler
fuente
También publiqué esta pregunta en apple.stackexchange.com, pero no ha habido ninguna respuesta allí.
Mark Adler
1
La razón por la que puede mallocmá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.
ctrl-alt-delor
No puedo ver por qué crees que el párrafo 5 es cierto, no se deduce del párrafo 4 (aunque comienzas con "así"). ¿También has intentado agregar muchos intercambios? (La pregunta no está clara sobre esto, aunque sospecho que la respuesta es sí).
ctrl-alt-delor
@richard Sí, sé por qué 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.
Mark Adler
@richard Porque el mensaje del kernel dice "intercambio bajo". En cuanto a "agregar muchos intercambios", no, no lo he hecho porque no sé cómo. Esa es precisamente esta pregunta. ¿Cómo agrego espacio de intercambio? Por supuesto, el kernel agrega espacio de intercambio automáticamente, pero solo hasta un límite. De ahí la raíz de la pregunta: ¿Cómo aumento el límite de espacio de intercambio del núcleo?
Mark Adler

Respuestas:

4

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.

sin datos
fuente
2
¡Gran idea! Tenía muchas esperanzas. Por desgracia, fueron lanzados contra la dura costa de la realidad. El kernel todavía eliminó el proceso por grandes cantidades de intercambio, al igual que antes (mensaje de consola de "intercambio bajo"), a pesar de que estaba usando un archivo que había creado para usar como memoria virtual mmap().
Mark Adler
Lo siento, la mayor parte de mi experiencia es con Linux. Pero, tal vez el problema es que el núcleo no está volviendo al archivo y manteniéndolo en la RAM. ¿Qué pasa si llama periódicamente msync()para obligarlo a hacerlo?
datos el
0

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:

  1. Edite el archivo / etc / rc, encuentre la sección de intercambio y coméntelo todo. agrega la líneamount -vat swap
    • significa montar todas las particiones de intercambio en / etc / fstab
  2. correr pdisk /dev/disk? -dump
    • "?" es el número de disco de su disco duro, el número al lado de la partición de intercambio
  3. Edite o cree / etc / fstab (probablemente no existe) agregue una línea como /dev/disk?s?? none swap sw 0 0
    • ? es tu disco
    • ?? es el número de la partición de intercambio.
  4. reiniciar.
Máximo poder
fuente