22 votos

Demasiados archivos abiertos

¿Qué comando / archivo de configuración controla los límites de los 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 , sysctl y launchctl

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

Hay muchas maneras (¿relacionadas?) de ver los límites de los 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 algunos de los mensajes anteriores que estos pueden ser modificados 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, sólo el sysctl los comandos tienen algún efecto aparente (es decir. ulimit -n y launchctl limit no muestran ningún cambio después de que los comandos anteriores han sido introducidos, mientras que sysctl -a muestra los cambios solicitados).

Los lugares correspondientes para cambiar estos parámetros para el SO son:

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

También descubrí uno responder a que dice que ulimit sólo controla el armazón actual.

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

11voto

Pete Puntos 1

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

Para OS X Sierra (10.12.X) es necesario:

1. En Library/LaunchDaemons crear un archivo llamado limit.maxfiles.plist y pegue lo siguiente (siéntase libre de cambiar los dos números (que son los límites suave 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. Cambia el propietario de tu nuevo archivo:

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

3. Cargue estos nuevos ajustes:

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

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

launchctl limit maxfiles

0 votos

Parece que tengo problemas para establecer el maxfiles a ilimitado de esta manera estableciendo el segundo valor a 'ilimitado'. ¿Alguna idea?

9voto

Oskar Puntos 1242

La respuesta simple solía ser que había múltiples límites y el límite más bajo que se alcanza en una instancia específica generará su error. Ahora en 10.12 launchctl limit maxfiles también está en la mezcla. Para más detalles sobre la aplicación, esta gran respuesta se está convirtiendo en una recompensa y merece más votos que los que yo puedo darle.

otros hilos relevantes son:

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

El kern.maxfilesperproc está ahí para dejar un poco de espacio en el recuento máximo de archivos para que un proceso pueda usar la mayoría pero no todo el espacio del manejador de archivos abierto del núcleo.

Para situaciones normales, el kern.maxfiles es el factor limitante final.

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

No soy un 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 trata de ceñirte a cientos o pocos miles para tus límites de archivos. Especialmente si tu Mac tiene un límite de proceso bajo tener tantos archivos abiertos por tan pocos procesos puede ser problemático.

7voto

errant.info Puntos 199

A continuación se resuelven los problemas más comunes (y se enumeran por 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. Tendrá que reiniciar para que estos cambios surtan efecto.
  2. AFAIK ya no puedes poner límites a lo "ilimitado" bajo OS X
  3. Los archivos max de launchctl están limitados por los archivos max de sysctl, y por lo tanto no puede excederlos
  4. sysctl parece heredar kern.maxfilesperproc de launchctl maxfiles
  5. ulimit parece heredar su valor de "archivos abiertos" de launchctl por defecto
  6. puedes establecer un límite personalizado dentro de /etc/profile, o ~/.perfil ; aunque esto no es necesario he proporcionado un ejemplo
  7. Sea cauteloso al establecer cualquiera de estos valores a un número muy alto en comparación con su valor por defecto - las características existen estabilidad/seguridad. He tomado estos números de ejemplo que creo que son razonables, escritos en otros sitios web.

0voto

matthew k Puntos 11

En palabras sencillas:

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

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

  • El sysctl controla los límites del núcleo (ver: man sysctl y Límites del kernel de ajuste de BSD ).

Para aumentar los límites, puede utilizar cada uno de los comandos, dependiendo del problema.

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


Para el problema de demasiados archivos abiertos, esto depende de qué límite suave o duro se ha alcanzado exactamente (si es un shell local script, el global script ejecutado por root una aplicación, o todos los procesos al mismo tiempo). Vale la pena aumentar todos los límites (shell, lanzamientod y los límites del núcleo).

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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X