¿Qué comando controla los límites de archivos abiertos?

¿Qué comando/archivo de configuración controla los límites de archivos abiertos en OS X? ¿Hay un comando diferente para OS X 10.5/10.6/10.7? Las opciones que exploro a continuación son ulimit, sysctlylaunchctl

"Demasiados archivos abiertos" aparentemente es un error común en Leopard, quizás en otras versiones de OS X:

Hay muchas formas (¿relacionadas?) de ver los límites de archivos abiertos:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 512
virtual memory          (kbytes, -v) unlimited


$ launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     1024           2048           
maxfiles    2048           4096       

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

Se ha afirmado en algunas de las publicaciones anteriores que estos se pueden modificar con los siguientes comandos:

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

Sin embargo, de los comandos anteriores, solo los sysctlcomandos tienen algún efecto aparente (es decir ulimit -n, launchctl limitno muestran cambios después de que se hayan ingresado los comandos anteriores, mientras sysctl -aque muestran los cambios solicitados).

Las ubicaciones correspondientes para cambiar estos parámetros para el sistema operativo son:

/etc/sysctl.conf
/etc/launchd.conf

También descubrí una respuesta que dice que ulimitsolo controla el shell actual.

¿Cómo puedo ajustar hacia arriba los límites máximos de archivos / máximo de archivos abiertos en macOS?

Respuestas (4)

La respuesta simple solía ser que había múltiples límites y el límite más bajo que alcanza en una instancia específica generará su error. Ahora el 10.12 launchctl limit maxfilestambién está en la mezcla. Para obtener detalles sobre la implementación, esta excelente respuesta está recibiendo recompensas y merece más votos que la que puedo darle.

Otros hilos relevantes son:

El ulimitnivel se establece bajo para evitar que un script de shell deficiente inunde el núcleo con archivos abiertos.

Está ahí para dejar un poco de espacio en el kern.maxfilesperprocrecuento máximo de archivos para que un proceso pueda usar la mayoría, pero no todo, el espacio del controlador de archivos abiertos del kernel.

Para situaciones normales, el kern.maxfileses el factor limitante final.

En Sierra: los límites son 256 archivos abiertos y un máximo ilimitado, por lo que descubro que tener de 3 a 4 mil archivos configurados para el límite suave funciona para casi todo nuestro hardware y aún mantiene el sistema receptivo cuando un proceso fuera de control abre demasiados archivos Nos gusta mantener nuestros servidores de desarrollo en el límite de 256 para que detectemos el software problemático y con fugas en desarrollo/prueba y prueba en lugar de descubrirlo en producción.

No soy un fanático de los archivos de 10k; tal vez con el almacenamiento APFS y NVMe veamos el día en que eso no sea impensable, pero intente ceñirse a cientos o miles para sus límites de archivos. Especialmente si su Mac tiene un límite de proceso bajo , tener tantos archivos abiertos por tan pocos procesos puede ser problemático.

Parece que hay un método completamente diferente para cambiar el límite de archivos abiertos para cada versión de OS X.

Para OS X Sierra (10.12.X) necesita:

1. Cree Library/LaunchDaemonsun archivo con el nombre limit.maxfiles.plisty pegue lo siguiente (siéntase libre de cambiar los dos números (que son los límites suaves y duros, respectivamente):

<?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>64000</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist> 

2. Cambia el propietario de tu nuevo archivo:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3. Cargue estas nuevas configuraciones:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. Por último, comprueba que los límites son correctos:

launchctl limit maxfiles
Parece que tengo problemas para establecer maxfiles en ilimitado de esta manera al establecer el segundo valor en 'ilimitado'. ¿Alguna idea?

Lo siguiente debería resolver los problemas más comunes (y se enumeran en orden de jerarquía):

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile

Notas:

  1. Deberá reiniciar para que estos cambios surtan efecto.
  2. AFAIK, ya no puede establecer límites para 'ilimitado' en OS X
  3. los maxfiles de launchctl están limitados por los maxfiles de sysctl y, por lo tanto, no pueden superarlos
  4. sysctl parece heredar kern.maxfilesperproc de launchctl maxfiles
  5. ulimit parece heredar su valor de 'archivos abiertos' de launchctl por defecto
  6. puede establecer un ulimit personalizado dentro de /etc/profile, o ~/.profile; aunque esto no es necesario, he proporcionado un ejemplo
  7. Tenga cuidado al establecer cualquiera de estos valores en un número muy alto en comparación con su valor predeterminado: las características existen estabilidad/seguridad. Tomé estos números de ejemplo que creo que son razonables, escritos en otros sitios web.

En palabras simples:

  • El ulimitcomando proporciona "control sobre los recursos disponibles para el shell y los procesos que crea" (consulte: help ulimity man bash). Los recursos proporcionados al shell están limitados por los límites de recursos del sistema.

  • Controla el launchctlconsumo máximo de recursos del sistema por parte del proceso actual (ver: man setrlimity man launchctl). Los valores máximos están limitados por los límites del núcleo.

  • Los sysctllímites del kernel de controles (ver: man sysctly Límites del kernel de ajuste de BSD ).

Para aumentar los límites, puede usar cada uno de los comandos, según el problema.

Ver también: ¿Cuál es la relación entre `launchctl limit` y `ulimit`?


Para el problema con demasiados archivos abiertos, esto depende de qué límite flexible o estricto se haya alcanzado (ya sea un script de shell local, el script global ejecutado por root, una aplicación o todos los procesos al mismo tiempo). Vale la pena aumentar todos los límites (límites de shell, launchd y kernel).

Para aumentar los límites de forma persistente, consulte: ¿Cómo controlar de forma persistente el consumo máximo de recursos del sistema en Mac?