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

19

¿Qué archivo de comando / 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 exploro a continuación son ulimit, sysctlylaunchctl

Aparentemente, "demasiados archivos abiertos" 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 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 -ny launchctl limitno muestran ningún cambio 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 de max files / max open files en macOS?

keflavich
fuente

Respuestas:

9

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 en 10.12 launchctl limit maxfilestambién está en la mezcla. Para obtener detalles sobre la implementación, esta gran respuesta es obtener recompensas y merece más votos que el que puedo darle.

Otros hilos relevantes son:

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

El kern.maxfilesperprocestá ahí para dejar un poco de espacio en los archivos max cuenta para que un proceso puede utilizar la mayoría, pero no todo el espacio identificador de archivos abiertos del núcleo.

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

En Sierra: los límites son 256 archivos abiertos y un máximo ilimitado, así que descubro que tener de 3 a 4 mil archivos establecidos para el límite flexible funciona para casi todo nuestro hardware y aún mantiene el sistema receptivo cuando un proceso desbocado abre demasiados archivos. Nos gusta mantener nuestros servidores de desarrollo en el límite de 256 para que podamos detectar software con fugas y problemático en el desarrollo / puesta en escena y las pruebas en lugar de descubrirlo en la producción.

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

bmike
fuente
9

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. En Library/LaunchDaemonscrear un archivo llamado limit.maxfiles.plisty pegar lo siguiente (no dude en cambiar los dos números (que son los límites blando y duro, 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. Cambie el propietario de su 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. Finalmente, verifique que los límites sean correctos:

launchctl limit maxfiles
ninjaPixel
fuente
Parece que tengo problemas para configurar los maxfiles en ilimitado de esta manera al configurar el segundo valor en 'ilimitado'. ¿Alguna idea?
user200857
7

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 a 'ilimitado' en OS X
  3. launchctl maxfiles están delimitados por sysctl maxfiles y, por lo tanto, no pueden superarlos
  4. sysctl parece heredar kern.maxfilesperproc de launchctl maxfiles
  5. ulimit parece heredar su valor 'abrir archivos' de launchctl por defecto
  6. puede establecer un ulimit personalizado dentro de / etc / profile, o ~ / .profile; Si bien esto no es obligatorio, 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. He tomado estos números de ejemplo que creo que son razonables, escritos en otros sitios web.
errant.info
fuente
0

En palabras simples:

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

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

  • Los sysctlcontroles del núcleo que los límites (ver: man sysctly los límites de sintonización del núcleo 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 exacto suave o duro 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 manera persistente el consumo máximo de recursos del sistema en Mac?

kenorb
fuente