¿Cómo controlar constantemente el consumo máximo de recursos del sistema en Mac?

85

Antes de Mavericks, podía usar el /etc/launchd.confarchivo para cambiar el consumo máximo de recursos del sistema, por ejemplo:

limit maxfiles 16384 unlimited
limit maxproc 16384 unlimited

Ya no funciona en Mavericks.

¿Cuál es la forma correcta de hacerlo en la versión reciente de OS X?

Howard
fuente
Sus límites están por encima del máximo para OS X. maxfiles se completa en 10240 y el límite de maxproc es 1064. Si la respuesta aprobada solucionara los límites, le daría un pulgar hacia arriba ... pero ha estado allí mal y sin corregir durante un buen año + ahora ..
Joey T
@atmosx: Debería ser /etc/sysctl.conf, no /etc/sysctrl.conf.
Siu Ching Pong -Asuka Kenji-
1
@JoeyT: ¡De hecho, puedes establecerlo en un límite superior! Pero primero debe comprar "OS X Server" en "App Store" si tiene Mac OS X 10.8 (Mountain Lion) o 10.9 (Mavericks). (¡Sí, debe pagar USD $ 19.99 para cambiar una configuración!) En resumen, debe ejecutar sudo serverinfo --setperfmode trueuna vez para poner su máquina en "Modo de rendimiento del servidor". Entonces, tiene un "máximo más alto", dependiendo de la configuración de su máquina. Consulte mi publicación en debates.apple.com/thread/5166397 para obtener más detalles. Para 10.10 (Yosemite), el modo está activado de forma predeterminada (¡al menos en mi máquina!). Vea mi respuesta a continuación.
Siu Ching Pong -Asuka Kenji-

Respuestas:

87

Límite de sesión de shell

Los límites establecidos a través de ulimitsolo afectan los procesos creados por la sesión de shell actual.

  • El "límite suave" es el límite real que se utiliza. Podría establecerse, siempre que no sea mayor que el "límite duro".
  • El "límite duro" también podría establecerse, pero solo en un valor menor que el actual, y solo en un valor no menor que el "límite suave".
  • El "límite duro", así como los límites de todo el sistema, podrían ser aumentados por root(el administrador) ejecutando comandos de configuración del sistema o modificando los archivos de configuración del sistema.

Después de terminar la sesión de shell (por Ctrl+ D, exito al cerrar la Terminal.appventana, etc.), la configuración desaparece. Si desea la misma configuración en la próxima sesión de shell, agregue la configuración al script de inicio de shell.

NOTA: Si está utilizando bash, entonces debería ser ~/.bash_proileo ~/.bash_login. Si está utilizando otros proyectiles, probablemente debería serlo ~/.profile.

Límite del sistema (requiere reiniciar para que surta efecto)

Para 10.9 (Mavericks), 10.10 (Yosemite), 10.11 (El Capitan) y 10.12 (Sierra):

Debe crear un archivo en /Library/LaunchDaemons/limit.maxfiles.plist(propietario:, root:wheelmodo:) 0644:

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

Debe cambiar los números según sus necesidades. Son el "límite blando" ( 262144) y el "límite duro" ( 524288) respectivamente. Para obtener más información, consulte la página del manual ejecutando man launchd.plist.

Para 10.8 (Mountain Lion):

Puede agregar las siguientes líneas a /etc/sysctl.conf(propietario:, root:wheelmodo:) 0644:

kern.maxfiles=524288
kern.maxfilesperproc=262144

Debe cambiar los números según sus necesidades. Son el "límite de todo el sistema" ( kern.maxfiles) y el "límite por proceso" ( kern.maxfilesperproc) respectivamente. Para obtener más configuraciones, consulte la página del manual ejecutando man sysctlo lea el código fuente en /usr/include/sys/sysctl.h.

Para Mac OS X anterior (supongo que funciona en 10.7 (Lion) o antes):

Puede agregar la siguiente línea a /etc/launchd.conf(propietario:, root:wheelmodo:) 0644:

limit maxfiles 262144 524288

Debe cambiar los números según sus necesidades. Son el "límite blando" ( 262144) y el "límite duro" ( 524288) respectivamente.

Si el sistema no le permite establecer los límites por encima de un cierto valor ...

El sistema no le permite establecer un valor superior a un "máximo duro" (propuesto por Apple). Para aumentar este "máximo duro", debe comprar "OS X Server" en "App Store", luego debe ejecutar el siguiente comando una vez:

sudo serverinfo --setperfmode true

Esto activa el "modo de rendimiento del servidor" en su máquina. Luego puede establecer el máximo de acuerdo con la configuración de su máquina (consulte esto) . Lo intenté antes (en Mountain and Mavericks) y funciona. Por favor, vea mi publicación ( aquí ) para más información.

Referencias

Siu Ching Pong -Asuka Kenji-
fuente
1
Gracias; Estoy usando Yosemite y la técnica de plist LaunchDaemon funcionó para mí. Creo que es el único que lo hace. Para cualquiera que necesite esto, tenga en cuenta que se requiere un reinicio para que surta efecto .
nc.
1
@Carolina del Norte. : Se agregó "Requerir reinicio para que surta efecto" a mi respuesta. He estado trabajando demasiado tiempo en el campo, por lo que no sabía que algunas personas no lo saben. ¡Gracias por recordar!
Siu Ching Pong -Asuka Kenji-
2
Estoy usando 10.9.5 pero solo el /etc/launchd.confenfoque muestra algún efecto cuando corro ulimit -n. ¿Podría alguien actualizar las instrucciones si esto es significativo?
Sridhar Sarnobat
1
El método 10.10 Yosemite también funciona en 10.11 El Capitán. Aunque no pude configurarlo como "ilimitado", tuve que usar un número realmente alto
2015
1
@aolszowka: Vea esto para saber cómo aumentar ese límite a través de /etc/sysctl.conf: superuser.com/questions/827984/…
Rob Johansen el
11

Parece que crear el archivo /etc/launchd.confy poner su comando dentro de él debería ser el truco.


Si no funciona, probablemente pueda editar o crear el /etc/rc.localarchivo y agregar su comando dentro de él, ya que hay pocas posibilidades de que Apple elimine la compatibilidad con el límite en la línea de comando.


Edición 1 :
debería haber comenzado con eso, la launchd página del manual hace referencia a los siguientes archivos:

  ~/Library/LaunchAgents         Per-user agents provided by the user.
  /Library/LaunchAgents          Per-user agents provided by the administrator.
  /Library/LaunchDaemons         System-wide daemons provided by the administrator.
  /System/Library/LaunchAgents   Per-user agents provided by Mac OS X.
  /System/Library/LaunchDaemons  System-wide daemons provided by Mac OS X.

Mi apuesta es que ahora necesitas poner tu comando ya sea dentro ~/Library/LaunchAgentso fuera /Library/LaunchDaemons.
Deberías probar ambos.

Edición 2 :
también tenga en cuenta que launchd necesita un archivo xml y no solo scripts. se ha diseñado una interfaz gráfica de usuario para ayudar en tal tarea, una no libre es Lingon . Quizás existan otros productos gratuitos.

Kiwy
fuente
Como hay mucha información en mi publicación, ¿puedes decir cuál fue la buena?
Kiwy
mira mi respuesta a continuación.
Howard
Ambos /etc/launchd.confy /etc/rc.localse ignoran en 10.10 y posteriores, ya que en 10.10 launchd fue rediseñado y SystemStarter fue eliminado.
nisetama
@nise no dude en actualizar mi respuesta si surge algo nuevo en la versión reciente de Mac OS
Kiwy
10

Acabo de agregar estas dos líneas en mis .bash_profile
trabajos como un encanto

ulimit -n 1024
ulimit -u 1024
pixelass
fuente
2
No influye en los límites del sistema.
not2savvy
1
Sin embargo, eso podría estar bien si los límites de su sistema son lo suficientemente altos. Para comprobar cuáles son, simplemente puedes correr ulimit -n -H. En macOS High Sierra estaba unlimitedcambiando el límite "suave" del usuario en .bash_profileel truco.
Joshua Pinter
9

Límites del sistema

Cambiar los límites en /etc/launchd.confo /etc/rc.localya no es compatible con macOS reciente. Ver: Sistemas y tecnología antiguos .

En su lugar, debe crear un nuevo agente de lanzamiento .

Aquí está el ejemplo de comando usando el PlistBuddycomando (ver:) man PlistBuddy:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist \
-c "add Label string com.launchd.maxfiles" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string launchctl" \
-c "add ProgramArguments: string limit" \
-c "add ProgramArguments: string maxfiles" \
-c "add ProgramArguments: string 10240" \
-c "add ProgramArguments: string unlimited" \
-c "add RunAtLoad bool true"

Y similar para el maxproclímite:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxproc.plist \
-c "add Label string com.launchd.maxproc" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string launchctl" \
-c "add ProgramArguments: string limit" \
-c "add ProgramArguments: string maxproc" \
-c "add ProgramArguments: string 2000" \
-c "add ProgramArguments: string unlimited" \
-c "add RunAtLoad bool true"

Para cargar archivos anteriores, ejecute: sudo launchctl load /Library/LaunchAgents/com.launchd.*.plist.

Notas:

  • Para imprimir el archivo, ejecute: cato PlistBuddy -x -c Print /Library/LaunchAgents/com.launchd.maxfiles.plist.
  • Para comprobar el registro de los errores durante la carga, ejecute: tail -f /var/log/system.log.
  • Para ver los actuales launchdlímites, ejecute: launchctl limit.
  • El .plistarchivo se puede colocar en la carpeta del agente por usuario o en todo el sistema ( LaunchAgents). Ver: man launchdy man launchd.plist, o esta o aquella respuesta para más detalles.

Límites del núcleo

Tenga en cuenta que los límites del sistema Launchd aún están limitados por el núcleo, por lo que no puede establecerlos por encima de los límites reales establecidos en las variables de estado del núcleo (consulte: man sysctlpara obtener ayuda).

Para ver los límites actuales del núcleo, ejecute: sysctl -a | grep ^kern.max.

Para aumentar el maxfileslímite, ejecute: sudo sysctl -w kern.maxfiles=20480.

Para que persistan, utilice un método similar para crear .plistarchivos de inicio , por ej.

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.kern.maxfiles.plist \
-c "add Label string com.kern.maxfiles" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string sysctl" \
-c "add ProgramArguments: string -w" \
-c "add ProgramArguments: string kern.maxfiles=20480" \
-c "add RunAtLoad bool true"

Límites de la cáscara

Para los límites de shell, agregue el ulimitcomando relevante ~/.bashrco el ~/.bash_profilearchivo de inicio para un usuario individual o /etc/bashrcpara todos los usuarios. Consulte: ¿Cómo agregar configuraciones persistentes de shell ulimit en Mac?

Líneas sugeridas para agregar:

# Changes the ulimit limits.
ulimit -Sn 4096      # Increase open files.
ulimit -Sl unlimited # Increase max locked memory.
kenorb
fuente
1
Tenga especial cuidado maxprocporque, de manera predeterminada, el límite del núcleo duro de ese parámetro es 1064, lo que significa que establecerlo en 2000 o "ilimitado" en realidad solo lo establece en 1064. Desafortunadamente, el núcleo no aplica eso maxprocperuid < maxproc, y la configuración que sugiera dejará el sistema con maxprocperuid=2000y maxproc=1064que es peligroso. Lea más sobre esto aquí .
Old Pro
0

Si tiene un solo programa que está alcanzando un ulimit(un límite suave en la cantidad de archivos que puede abrir un solo proceso), ulimitestá bien ajustarlo a un número mayor, especialmente si solo puede poner el ulimitcomando en su .bash_profile. Más allá de eso, aconsejo fuertemente en contra de archivos de edición como /etc/launchd.confo /etc/sysctl.confo añadir archivos plist bajo /Library/LaunchDaemons/por varias razones.

  • Los cambios en esos archivos persisten en las copias de seguridad y se transfieren a las nuevas versiones de macOS y las nuevas computadoras cuando se actualiza.

  • Si esos cambios causan problemas (lo cual es una posibilidad real), debe recordar que realizó los cambios y cuáles son los cambios, y luego vuelva a editar los archivos para deshacerlos. Esto puede suceder años después.

  • Después de algunos años de actualización, es posible que lo que solía ser un aumento en un límite ahora sea una disminución en un límite. Pero probablemente no lo sabrá porque (a) no recordará que realizó el cambio y (b) no podrá ver los nuevos límites porque los anuló desde el principio.

Una opción mucho mejor

En general, en lugar de ajustar parámetros individuales en el sistema y desequilibrar el sistema (y potencialmente permitir que un solo programa bloquee el sistema al tomar todos los recursos), si los límites predeterminados del sistema son insuficientes para sus necesidades, recomiendo hacerlo. en "Modo de rendimiento del servidor", o al menos intentarlo. Todo lo que necesita para esto es OS X / macOS 10.8 Mountain Lion o posterior y al menos 16 GiB de memoria instalada. Al principio tenía que pagar por esto, pero a partir de OS X 10.8 Mountain Lion, es gratuito y oficialmente compatible con Apple con el sistema operativo estándar.

Activar este modo aumenta drásticamente los límites del sistema, particularmente la cantidad de procesos que puede ejecutar y la cantidad de archivos que puede abrir, a costa de asignar más memoria al núcleo del sistema. Puede leer en detalle lo que cambia el modo de rendimiento del servidor en la respuesta a la pregunta "¿Qué hace serverperfmode = 1 en macOS?" .

Este modo tiene varias ventajas sobre la edición de archivos de configuración como lo sugieren otras respuestas.

  • Es un cambio de un solo parámetro, fácil de deshacer.
  • Resulta en un conjunto equilibrado de límites más altos, preservando salvaguardas contra procesos deshonestos que bloquean el sistema.
  • En la mayoría de los casos, proporciona límites más altos de lo que el núcleo permitiría, incluso con la edición de archivos de configuración.
  • Eleva los límites predeterminados para todos los procesos sin ningún cambio de configuración adicional.
  • A partir de OS X 10.11 El Capitan, el cambio de configuración se almacena en NVRAM, lo que significa que si está causando problemas, volverá al modo normal cuando realice el paso de solución de problemas de restablecer NVRAM. No tienes que recordarlo.
  • Debido a que está en NVRAM, no cambiará accidentalmente el estado al restaurar desde copias de seguridad.
  • Debido a que está en NVRAM, no se encenderá automáticamente cuando clones la configuración de tu Mac a un nuevo hardware.
  • Debido a que es oficialmente compatible con Apple, "simplemente funciona" y no recibirá quejas de los Genios de Apple por haber modificado incorrectamente el sistema cuando solicite asistencia.
  • Como se trata de un cambio de un solo parámetro, puede activarlo y desactivarlo fácilmente para solucionar problemas o comparar una configuración con la otra.

Activar o desactivar el modo de rendimiento del servidor

Para activar el Modo de rendimiento del servidor, use la Terminal para ejecutar uno de estos comandos y luego reinicie para que surta efecto:

  • Para OS X 10.11 El Capitan o posterior, enciéndalo con
sudo nvram boot-args="serverperfmode=1 $(nvram boot-args 2>/dev/null | cut -f 2-)"

y apagarlo con

sudo nvram boot-args="$(nvram boot-args 2>/dev/null | sed -e $'s/boot-args\t//;s/serverperfmode=1//')"

Los comandos anteriores son los que Apple recomienda oficialmente, pero en realidad hay un problema con ellos, y es que si ejecuta el comando "encender" dos veces, entonces debe ejecutar el comando "apagar" dos veces para apagarlo. Por lo tanto, compruebe si está activado o desactivado después de realizar un cambio ejecutando

nvram boot-args

Si la salida incluye "serverperfmode = 1", entonces la configuración está activada, y si no lo está, entonces la configuración está desactivada.

  • Para OS X 10.8 Mountain Lion, OS X 10.9 Mavericks y OS X 10.10 Yosemite, active el modo de rendimiento del servidor con
serverinfo --setperfmode 1

y apagarlo con

serverinfo --setperfmode 0

Verifique la configuración con

serverinfo --perfmode

La configuración no tendrá efecto hasta después de reiniciar el sistema.

Verificando si la computadora se está ejecutando actualmente en modo de rendimiento del servidor

Verificando la configuración le dirá si está configurado para tener efecto (o no) después de reiniciar. Para probar si está actualmente activo (suponiendo que haya seguido mi consejo y no haya editado ningún archivo de configuración que cambie la configuración), ejecute

sysctl kern.maxproc

Le dará un número que es el número máximo de procesos que permitirá el sistema. Si ese número es un múltiplo de 532 , el modo de rendimiento del servidor está desactivado. Si es un número redondo (un múltiplo de 2500), el modo de rendimiento del servidor está activado para el sistema actualmente en ejecución.

Viejo pro
fuente