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?