El nofile
límite predeterminado para las cuentas de usuario de OS X parece ser de unos 256 descriptores de archivos en estos días. Estoy tratando de probar algún software que necesita muchas más conexiones que las abiertas a la vez.
En una caja típica de Debian que ejecuta el módulo de límites de pam, editaría /etc/security/limits.conf
para establecer límites más altos para el usuario que ejecutará el software, pero estoy desconcertado sobre dónde establecer estos límites en OS X.
¿Hay una GUI en algún lugar para ello? ¿Hay un archivo de configuración en algún lugar para ello? ¿Cuál es la forma más ordenada de cambiar los límites predeterminados en OS X?
Respuestas:
Bajo Leopard el proceso inicial es
launchd
. Los ulimits predeterminados de cada proceso se heredan delaunchd
. Como referencia, los límites predeterminados (compilados) sonPara cambiar cualquiera de estos límites, agregue una línea (es posible que primero necesite crear el archivo)
/etc/launchd.conf
, los argumentos son los mismos que se le pasaron allaunchctl
comando. Por ejemploSin embargo,
launchd
ya ha comenzado su shell de inicio de sesión, por lo que la forma más sencilla de hacer que estos cambios surtan efecto es reiniciar nuestra máquina. (Use >> para agregar a /etc/launchd.conf.)fuente
sysctl.maxfiles
? (pregunta relacionada: apple.stackexchange.com/questions/33715/too-many-open-files )echo
bajo sudo pero tratando de que su shell no privilegiado se agregue al archivo, lo que no tiene permiso para hacer. Intenta en suecho "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf
lugar.no funciona porque sudo está en el lugar equivocado, intente esto:
fuente
Límites de la cáscara
Los recursos disponibles para el shell y los procesos pueden ser cambiados por
ulimit
comandos que se pueden añadir a los scripts de arranque como~/.bashrc
o~/.bash_profile
para usuarios individuales o/etc/bashrc
para todos los usuarios . Ejemplo de línea para agregar:Ver:
help ulimit
yman bash
para más información.Límites del sistema
En general, los límites del sistema están controlados por Launchd framework y se pueden cambiar mediante un
launchctl
comando, p. Ej.Para que los cambios sean persistentes, debe crear un archivo de lista de propiedades en carpetas específicas compatibles con Launch que actúe como agente de inicio.
Aquí está el comando de ejemplo que crea dicho archivo de inicio:
Sin embargo, el archivo se cargaría en el inicio del sistema para cargarlo y ejecutarlo manualmente:
Para verificar los límites actuales, ejecute:
launchctl limit
.Consulte: Creación de demonios de lanzamiento y agentes .
Límites del núcleo
sysctl
comando.sysctl -a | grep ^kern.max
.sudo sysctl -w kern.maxfiles=20480
.Relacionado:
Métodos obsoletos
En una versión anterior de macOS, podría establecer estos límites en todo el
/etc/sysctl.conf
sistema como lo hace normalmente en Unix, sin embargo, parece que no es compatible.Usando
~/.launchd.conf
o/etc/launchd.conf
parece que tampoco es compatible con ninguna versión existente de macOS. wikiLo mismo con el
/etc/rc.local
archivo de inicio, no es compatible con macOS.fuente
Ahora tengo que encontrar por qué existen 2 medios para verificar / establecer límites ...
Bien, parece
ulimit
ysysctl
da una falsa sensación positiva de que realmente hacen algo, pero en cambio parecen ser inútiles . ¿Alguien podría verificar eso?Bien, estoy empezando a entender. A partir de v10.4, ya no hay ningún
init
proceso, ha sido reemplazado porlaunchd
, que también se ejecuta con un PID de 1.Y, por supuesto, vale la pena mencionar que
ulimit
es un shell incorporado,launchctl
es un programa independiente del shell.fuente
En OS X, si está intentando modificar los límites de software para un demonio o proceso o tarea, la forma correcta de cambiar estos límites de software no es cambiando la configuración de lanzamiento predeterminada para todos los procesos, sino configurándola para el proceso. tratando de correr
Esto se logra en su archivo launchd .plist para su proceso.
Si tiene un demonio o proceso en ejecución para el que necesita tener más archivos abiertos, cree un archivo plist y agregue estos parámetros:
Un ejemplo, usando mongodb. Creo un archivo .plist llamado org.mongo.mongodb.plist y lo guardo en /Library/LaunchDaemons/org.mongo.mongodb.plist. El archivo se ve así:
Ahora su proceso tiene los recursos que necesita, sin interferir con la configuración global del sistema. Esto se configurará automáticamente al reiniciar. O, si no desea reiniciar, puede ejecutar
Si su proceso o tarea es más un agente que un demonio, puede colocar el .plist en / Library / LaunchAgents en su lugar. Se aplican diferentes reglas sobre cómo launchd controlará su proceso en cualquier caso. LaunchDaemons parece reservado para los procesos que launchd intentará mantenerse al día en todo momento.
fuente
Lo siguiente debería resolver la mayoría de las soluciones (y se enumeran en orden de jerarquía):
Notas:
fuente
Mi experiencia es que mi tarea de alto conteo de procesos solo tuvo éxito con:
Los dos primeros pueden entrar
/etc/sysctl.conf
y el valor ulimit en launchd.conf, para una configuración confiable.Como tcp / ip era parte de lo que estaba haciendo, también necesitaba aumentar
desde su defecto 128.
Antes de aumentar los límites del proceso, recibía fallas de "bifurcación", recursos insuficientes. Antes de aumentar kern.ipc.somaxconn, recibía errores de "tubería rota".
Esto fue mientras ejecutaba un número justo (500-4000) de procesos separados en mi monstruosa Mac, OS 10.5.7, luego 10.5.8, ahora 10.6.1. Bajo Linux en la computadora de mis jefes, simplemente funcionó.
Pensé que el número de procesos estaría más cerca de 1000, pero parece que cada proceso que comencé incluía su propia copia del shell además del elemento real que realizaba el trabajo real. Muy festivo
Escribí un juguete de exhibición que decía algo así como:
y vi el número máximo de procesos en ps -ef y dando vueltas en netstat esperando a
TIME_WAIT
que expiraran ... Con los límites elevados, vi más de 3500TIME_WAIT
artículos en su punto máximo.Antes de elevar los límites, podía "escabullirme" en el umbral de falla, que comenzó por debajo de 1K pero aumentó a un alto valor de 1190 ... cada vez que fue empujado al fracaso, podría tomar un poco más la próxima vez, probablemente debido a algo caché que se expandió a su límite cada vez que falló.
Aunque mi caso de prueba tenía una "espera" como su declaración final, todavía había MUCHOS procesos separados que esperaban después de salir.
Obtuve la mayor parte de la información que utilicé de las publicaciones en Internet, pero no toda fue precisa. Tu kilometraje puede variar.
fuente