¿Por qué no se mantiene la configuración de kern.maxfiles en /etc/sysctl.conf?

He estado recibiendo varios errores del tipo "demasiados archivos abiertos en el sistema" en Yosemite (10.10.1). Buscar alrededor sugiere configuración kern.maxfilesy kern.maxfilesperprocessen /etc/sysctl.conf.

He intentado esto y kern.maxfilesperprocessse pega después de un reinicio, pero kern.maxfilesno lo hace.

% cat /etc/sysctl.conf 
# NB DO NOT COPY AND PASTE THIS INTO YOUR CONFIG FILE - IT DOESN'T WORK
kern.maxfiles=20480 
kern.maxfilesperproc=18000

(reiniciar)

% sysctl kern.maxfiles
kern.maxfiles: 12288
% sysctl kern.maxfilesperproc   
kern.maxfilesperproc: 18000

Si lo configuro manualmente en la línea de comando, funciona, por lo que no parece que esté excediendo ningún límite superior:

% sudo sysctl -w kern.maxfiles=20480 
kern.maxfiles: 12288 -> 20480
% sysctl kern.maxfiles               
kern.maxfiles: 20480

He visto advertencias sobre la anulación de estos valores, /etc/launchd.confpero no tengo este archivo:

% cat /etc/launchd.conf
cat: /etc/launchd.conf: No such file or directory

La búsqueda de Spotlight no encuentra ninguna otra mención de kern.maxfiles, así que no tengo ideas. ¿Cualquier otra sugerencia?

@w00t Revertí la edición que eliminó los espacios finales del archivo conf; dado que estos espacios eran en realidad el problema en primer lugar, creo que tiene más sentido dejarlos en la pregunta.
bastante justo, pregunta editada en su lugar para indicar esto.
@w00t su última edición propuesta fue rechazada por un mod de diamante (no por mí), posiblemente porque ya edité una advertencia en el texto mismo después de revertir su edición. Debería haberte avisado cuando hice eso. Tu punto era bueno, así que después de revertir y comentar, sentí que necesitaba algo . ¿Espero que mi última edición lo cubra?

Respuestas (3)

Aunque no responde directamente a su pregunta, encontrará dos soluciones en superusuario :

  1. Para ajustar los límites de archivos abiertos en todo el sistema en Mac OS X Yosemite, debe crear dos archivos de configuración. El primero es un archivo de lista de propiedades (también conocido como plist) en '/Library/LaunchDaemons/limit.maxfiles.plist' que contiene la siguiente configuración XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
        <dict>
          <key>Label</key>
            <string>limit.maxfiles</string>
          <key>ProgramArguments</key>
            <array>
              <string>launchctl</string>
              <string>limit</string>
              <string>maxfiles</string>
              <string>65536</string>
              <string>65536</string>
            </array>
          <key>RunAtLoad</key>
            <true/>
          <key>ServiceIPC</key>
            <false/>
        </dict>
      </plist>
    

    Esto establecerá el límite de archivos abiertos en 65536. El segundo archivo de configuración de plist debe almacenarse /Library/LaunchDaemons/limit.maxproc.plistcon los siguientes contenidos:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
      <plist version="1.0">
        <dict>
          <key>Label</key>
            <string>limit.maxproc</string>
          <key>ProgramArguments</key>
            <array>
              <string>launchctl</string>
              <string>limit</string>
              <string>maxproc</string>
              <string>2048</string>
              <string>2048</string>
            </array>
          <key>RunAtLoad</key>
            <true />
          <key>ServiceIPC</key>
            <false />
        </dict>
      </plist>
    

    Ambos archivos plist deben ser propiedad de 'root:wheel' y tener permisos '-rw-r--r--'. Estos permisos deberían estar en su lugar de forma predeterminada, pero puede asegurarse de que estén en su lugar ejecutando sudo chmod 644 <filename>. Si bien los pasos explicados anteriormente harán que los límites de archivos abiertos en todo el sistema se establezcan correctamente al reiniciar, puede aplicarlos manualmente ejecutando launchctl limit.

    Además de establecer estos límites en el nivel del sistema, recomendamos establecer también en el nivel de la sesión agregando las siguientes líneas a su 'bashrc', 'bashprofile' o archivo análogo:

    ulimit -n 65536
    ulimit -u 2048
    

    Al igual que los archivos plist, su archivo bashrc o similar debe tener -rw-r--r--permisos. En este punto, puede reiniciar su computadora e ingresar ulimit -n en su terminal. Si su sistema está configurado correctamente, debería ver que maxfiles se ha establecido en 65536.

    Ajuste el límite de maxfiles y maxproc según lo necesite

    Obtenido de: http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/

  2. La modificación /etc/launchd.confde muchas consultas de Google y sugerencias SO no parecía funcionar para mí en Yosemite (10.10). Lo que terminó funcionando, después de numerosas combinaciones de cambio/reinicio/prueba, fue modificar (o crear si no existe) el /etc/sysctl.confarchivo.

    Esto es lo que tuve que poner para que funcione

    kern.maxfiles=65536
    kern.maxfilesperproc=65536
    

    No estoy seguro de si 'kern.maxfiles' necesita estar allí, pero cuando lo tenía solo, todavía tenía el mismo problema, cuando agregué 'kern.maxfilesperproc' todo comenzó a funcionar.

Si una o ambas de esas soluciones funcionan para usted, dé crédito a los carteles originales.

Aunque esto no resolvió el problema, proporciona una solución alternativa (el primer archivo plist). Gracias también por la ayuda en la búsqueda de la causa real. Recompensa otorgada.
¿Quizás sabe cómo establecer el límite superior en "ilimitado" como lo hace OS X de forma predeterminada? Específicamente, estoy buscando adaptar esta respuesta para elevar el ulimit -n a 1000 y no cambiar ningún otro aspecto para ejecutar algunas pruebas de rendimiento para un paquete de software.
@bmike hmm, ¿qué límite superior? -n = 1000 como límite suave y un límite duro ilimitado. ¿Qué sistema operativo? 10.10 o 10.9 y menos?
Descubrí otra forma de hacer lo que quería poniendo el programa en launchctl y usando los límites allí en un plist. Publicaré una nueva pregunta una vez que mis cambios de código se revisen y se fusionen en otro lugar.
Si está utilizando Java en MacOS X, también debe pasar -XX:-MaxFDLimita la JVM para recoger el límite de descriptor de archivo más alto.

Mediante una combinación de inicio seguro/verboso, registro de consola y google, encontré un problema similar que me llevó a descubrir un espacio final en la línea maxfiles. Eliminar este espacio resolvió el problema.

Por favor, verifique que las líneas en sysctl.conf no tengan un espacio final. Esto parece estar causando un problema con Yosemite mientras que funcionaba correctamente con versiones anteriores.

Configuraciones corregidas (estas se pueden copiar de forma segura):

kern.maxfiles=20480
kern.maxfilesperproc=18000

Eliminar los espacios en blanco finales solo requiere un paso:

sed -i '~' -e's/[[:space:]]*$//' /etc/sysctl.conf

El comando anterior también guarda una copia de seguridad en /etc/sysctl.conf~.

este archivo ya no funciona en las versiones más nuevas de macOS