¿Existe una solución para el error "Demasiados archivos abiertos en el sistema" en OS X 10.7.1?

191

Necesito deshacerme del molesto límite de "Demasiados archivos abiertos en el sistema" en OS X 10.7.1. 

¿Hay alguna manera?

John Wilund
fuente
44
¿Quieres explicar más sobre cuándo sucede esto? ¿En que circunstancias?
slhck
1
@slhck: tengo el mismo problema. Las circunstancias son básicamente "al azar". Soy un desarrollador, por lo que estoy usando mi Mac con bastante frecuencia: ejecutando una o más bases de datos, un servidor web, herramientas de prueba, uno o más navegadores y un reproductor de música a la vez. Google Chrome parece ser un programa que tiene muchos archivos abiertos.
Nathan Long
En realidad, mi "uso intensivo" no era el problema; mi configuración para el número máximo de archivos abiertos para el kernel y por proceso fue mucho menor de lo que deberían ser los valores predeterminados.
Nathan Long
2
Si leyó el comentario de Nathan y se preguntó por qué no incluyó ningún detalle sobre los valores predeterminados, es porque lo explicó todo en su respuesta, a continuación. (¡Buena respuesta! :)
Olie
Estoy en la misma circunstancia de uso que Nathan Long, y descubrí que reiniciar Apache fue el único paso que "resolvió" el problema. Apliqué todos los aumentos del límite a continuación, pero no me ayudaron de inmediato. Estoy ejecutando la línea de comando phpUnit tests> selenium server> firefox> apache> php> mysql, todo en el mismo macbook. Solía ​​funcionar bien hasta que actualicé a rebeldes. El error que obtengo está en la aplicación web que se está probando, es decir, php / apache se está quedando sin archivos, por lo que presumiblemente no está controlado por la configuración del shell.
scipilot

Respuestas:

225

De acuerdo con este útil artículo (que recomiendo leer):

De forma predeterminada, la cantidad máxima de archivos que Mac OS X puede abrir se establece en 12,288 y la cantidad máxima de archivos que puede abrir un proceso determinado es 10,240.

Puede verificar esto con:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Puede aumentar los límites (bajo su propio riesgo) con:

  • sysctl -w kern.maxfiles=20480 (o cualquier número que elija)
  • sysctl -w kern.maxfilesperproc=18000 (o cualquier número que elija)

Para hacer que el cambio sea permanente, úselo sudopara poner su configuración /etc/sysctl.conf(que quizás tenga que crear), así:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Nota: En OS X 10.10 o inferior, puede agregar la configuración en me /etc/launchd.confgusta limit maxfilesy anulará lo que haya puesto aquí.

De nuevo, del artículo:

Una vez que haya hecho esto, el núcleo tendrá una cantidad máxima de archivos, pero el shell podría no tenerlo. Y como la mayoría de los procesos que ocuparán tantos archivos serán iniciados por el shell, querrá aumentar eso.

El comando para eso es:

ulimit -S -n 2048 # or whatever number you choose

Ese cambio también es temporal; solo dura la sesión de shell actual. Puede añadirlo a su archivo de configuración de comandos ( .bashrc, .zshrco lo que sea) si desea que se ejecute cada vez que abra un shell.

Nathan Long
fuente
1
¿Qué límite se aplica a los procesos iniciados haciendo clic en los iconos en el área de inicio? ¿Y cómo cambiar ese límite? Cuando dices "shell", supongo que te refieres a un shell terminal interactivo.
Cheeso
@Cheeso: creo que el límite general del sistema (sysctl) o el límite de launchd, el que sea menor, controla eso.
Nathan Long
1
crear un /etc/launchd.conf con límite de contenido maxfiles 1000000 ¡1000000 funcionó muy bien para mí! (OSX 10.8.2 aquí)
Zugwalt
1
Puse kern.maxfiles=65000 kern.maxfilesperproc=65000en /etc/sysctl.conf y reinicié. kern.maxfiles se ignoró y se mantuvo como predeterminado, pero kern.maxfilesperproc se configuró en 65000. No tengo /etc/launchd.conf, ¿qué pasa con eso?
Pferrel
2
Si alguien tiene problemas con los archivos max que no se pegan, es porque hay un espacio final después de la línea maxfiles, que debe eliminarse.
jjathman
62

¡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 un archivo en /Library/LaunchDaemons/limit.maxfiles.plisty pegue 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
funcionó perfectamente, gracias! En mi caso, el error se manifestó en un proceso de Java con el mensajeIO Error: Bad file descriptor (Write failed)
agradl
1
También funciona en El Capitan 10.11.6
Troy Daniels
todavía no puede cambiar el ulimit para shell. El máximo se mantiene 1024, haga lo que haga
DataGreed
En el paso 2, ejecute: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen
33

Tendrá que aumentar su configuración de ulimit, actualmente es bastante baja en OS X, 256 por defecto. Agregue ulimit -n 4096o similar a su ~ / .profile o equivalente y eso lo resolverá en su entorno local. Corre ulimit -apara verificar tus niveles actuales

Para ver la configuración del sistema, ejecute esto:

launchctl limit maxfiles

Se establece un poco más alto en Lion (10240) por proceso de lo que solía ser. Pero si todavía lo está presionando allí, puede configurarlo más alto con el mismo comando con los niveles deseados. Para que los cambios sean permanentes /etc/launchd.conf es donde debe agregar las líneas relevantes.

Adam C
fuente
1
256? Son 2560 descriptores de archivo para mí y nunca lo he cambiado. El límite es de 266 procesos (cf ulimit -a).
slhck
2
Lo mismo para mí, 256 archivos en MacOS X Maverick
Climbatize
44
256 en OS X Yosemite así
Alexander
2
256 en El Capitan, también.
TMN
1
256 en Yosemite.
Jaec
31

Otra opción puede ser encontrar al culpable:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

Para el último, puede ver qué archivos están abiertos:

sudo lsof -n | grep socketfil

Y elimine el proceso si así lo desea

kill $pid

De los comentarios:

Para lo que vale, también puede obtener una lista de las ID de proceso con los archivos más abiertos usando

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
sanmai
fuente
¡Servicial! Pero ordenar en OS X (10.11) no toma -h. (Tal vez -g?)
Robert Calhoun
Para mí funcionó bien sin -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop
Así sea sin-h
sanmai
Esta es la única respuesta que me ayudó a resolver mi problema ... gracias :)
SgtPooki
1
Se usa lsof -n +c 0para evitar truncar el nombre del proceso.
vaughan
10

Gente, en Mavericks 10.9.4

ulimit -n 2048funciona bien. Es posible que deba iniciar una nueva sesión de inicio de sesión.

Clustermagnet
fuente
3

Para la última versión de macOS (al momento de escribir: 10.14.1), puede usar sudo launchctl limit maxfiles 64000 524288(por defecto era 256), pero solo funciona dentro de la sesión actual. Utilice el launchctltrabajo de @ninjaPixel ( https://superuser.com/a/1171028/760235 ) para obtener una solución permanente.

Dzmitry Hubin
fuente
¿Cómo se te ocurrió el número 524288? Mis valores anteriores eran 256 e ilimitados.
Chip Roberson
1

Tu puedes correr

lsof -n

qué proceso abre demasiados archivos.

entonces mátalo.

o

sysctl -w kern.maxfiles=20480

cámbielo a uno más grande.

SaintKnight
fuente
3
Explique cómo esta respuesta difiere de las que ya se dieron.
Stephen Rauch
1

Después de todos los cambios anteriores, mi Java no hizo más de 10000 archivos. La solución fue esta bandera jvm -XX: -MaxFDLimit

Uros Velickovic
fuente
0

Lo encontré mientras hacía un chmod -R, así que lo solucioné dando pasos más pequeños, por ejemplo

# for each directory
find . -type d -exec chmod 755 {} \;
Miguel
fuente
1
Si bien esto puede ser una solución alternativa, no parece responder realmente la pregunta. Quizás explicando que no puede deshacerse del mensaje y luego proponiéndolo como una forma de hacerlo menos problemático mejoraría su respuesta.
music2myear
0

Similar a https://superuser.com/a/1171028/367819

Para verificar los límites actuales en su sistema Mac OS X, ejecute:

launchctl limit maxfiles

Las dos últimas columnas son los límites blandos y duros, respectivamente.

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

Esto establecerá el límite de archivos abiertos en 200000. El segundo archivo de configuración de plist debe almacenarse en /Library/LaunchDaemons/limit.maxproc.plist con el siguiente contenido:

<?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 deben estar establecidos de manera predeterminada, pero puede asegurarse de que estén en su lugar ejecutando sudo chmod 644. 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 sesión agregando las siguientes líneas a su archivo bashrc, bashprofile o análogo:

ulimit -n 200000
ulimit -u 2048

Al igual que los archivos plist, su archivo bashrc o similar debe tener permisos -rw-r - r--. 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 200000.


Puedes seguir este artículo para más detalles.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


Recuerde reiniciar su Mac para que los valores sean efectivos.

angelokh
fuente
O bien, la publicación debe marcarse como un duplicado si ya hay una respuesta, de lo contrario, publique la información relevante desde un enlace, ya que el enlace puede no ser válido para siempre.
zymhan