7 votos

Corregir "fork: recurso temporalmente no disponible" en OS X / MacOS

Me encontré con algunos problemas en mi Mac con OS X El Capitan 10.11.6 que parecían estar relacionados con los límites de recursos. Estaba viendo cosas como error: cannot spawn o unable to fork o

-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable

Por el hecho de que mi sistema no se congelaba por completo ni escupía errores por todas partes, supuse que lo que estaba ocurriendo era que había alcanzado mi límite en el número de procesos que puedo ejecutar.

$ ulimit -u
709

709 son muchos procesos, pero estaba ejecutando muchos servidores en mi Mac, así que parecía posible que estuviera usando esa cantidad. Probé este comando, que imprime cuántos procesos está ejecutando el usuario (en realidad 1 más que el número de procesos)

$ ps -xu $(id -ru) | wc -l
fork: Resource temporarily unavailable

OK, no pude ejecutar ese comando, que crea 3 procesos, así que probablemente estaba en el límite de procesos. Y el mensaje de error no empezaba con -bash por lo que no se trataba de ulimit tampoco. Estaba llegando al límite del sistema kern.maxprocperuid .

Pude confirmarlo ejecutando un shell como root :

$ id -ru
501
$ sudo -i
root# ps -xu 501 | wc -l
706

Sí, 706 < 709, pero mdworker Los procesos van y vienen de forma rutinaria, por lo que estar cerca del límite era prueba suficiente.

¿Cómo puedo aumentar el límite del número de procesos que puedo ejecutar? Busqué respuestas y encontré artículos que sugerían crear un archivo /Library/LaunchDaemons/limit.maxproc.plist con este 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>4096</string>
 </array>
 <key>RunAtLoad</key>
 <true />
 <key>ServiceIPC</key>
 <false />
 </dict>
</plist>

Lo hice y reinicié y ahora

$ ulimit -u
2048

Lo cual sería genial, excepto que

$ sysctl kern.maxproc
kern.maxproc:
1064

ESTO ES PELIGROSO . Lo que significa es que todo el sistema sigue estando limitado a un máximo de 1064 procesos, pero un usuario individual puede crear más que eso. Cuando el sistema alcanza el número máximo de procesos, generalmente se bloquea rápidamente y de forma muy grave. Por lo tanto, es muy importante que no se permita a ningún usuario crear suficientes procesos para llenar la tabla de procesos, por lo que en el Mac los usuarios están limitados a 2/3 del número total de procesos.

Encontré sugerencias similares con respecto al número máximo de archivos abiertos maxfiles y maxfilesperproc que son aún más peligrosas, porque un solo proceso no debería estar cerca de poder abrir el límite de todo el sistema sobre el número total de archivos abiertos.

La otra cuestión es que, si 709 procesos no eran suficientes, es muy poco probable que 1000 procesos tampoco lo sean.

Entonces, ¿cuál es la forma correcta de arreglar "Demasiados archivos abiertos" o "bifurcación: recurso temporalmente no disponible" en OS X El Capitan?

12voto

Old Pro Puntos 2851

Si su ordenador choca habitualmente con los límites de los procesos y no se debe a un programa descontrolado o a un malware, entonces, en lugar de intentar anular los valores por defecto, debería cambiar a un conjunto diferente de valores por defecto conocido como "Modo de rendimiento" (también conocido como "Modo de rendimiento del servidor" o perfmode o serverperfmode ).

Para hacer esto en El Capitan (y las versiones posteriores de MacOS hasta nuevo aviso), no es necesario crear nuevos archivos ni complicarse con la activación o desactivación de SIP, todo lo que hay que hacer es

$ sudo nvram boot-args="serverperfmode=1 $(nvram boot-args 2>/dev/null | cut -f 2-)"

Esto es oficialmente apoyado por Apple y cambia la configuración por defecto de su ordenador de un ordenador interactivo que va a utilizar para el correo electrónico y la navegación web a un servidor que va a utilizar para ejecutar un montón de software no interactivo.

Los nuevos límites dependen de la cantidad de memoria que tengas y requieren que tengas al menos 16 GiB de memoria instalada, pero como mínimo, verás que tu límite de usuario en el número de procesos que puedes ejecutar aumenta de 709 a 3.750 y muchos otros límites se incrementan . Y lo que es más importante, los límites de todo el sistema también aumentarán para que un solo usuario o programa deshonesto no pueda colapsar el sistema por agotamiento de recursos.

Esta es una forma mucho mejor de aumentar los límites de tu sistema porque aumenta todos los límites interrelacionados de forma coherente, teniendo en cuenta las capacidades de tu ordenador específico. También es mucho más fácil de hacer. La única desventaja es que si alguna vez restablece su NVRAM, tendrá que ejecutar el programa nvram para volver a activar el modo de rendimiento. Pero eso también es una ventaja, porque si los nuevos ajustes realmente te dan problemas, todo lo que necesitas hacer para deshacerlos es restablecer tu NVRAM, que es un paso normal en la recuperación cuando las cosas van realmente mal. Si en cambio creas los archivos plist de LauchDaemons que algunas personas sugieren, tendrías que acordarte de ellos para recordar editarlos o borrarlos para volver a una configuración estándar.

3 votos

¿Cuál es la mejor manera de identificar lo que está consumiendo demasiados procesos? Últimamente tengo con frecuencia este problema de límite de procesos, y ya tengo definidos límites bastante altos. Cuando miro el top o el Monitor de Actividad, no veo el culpable.

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