¿Aumentar el número máximo de descriptores de archivo abiertos en Snow Leopard?

101

Estoy tratando de hacer algo que requiera una gran cantidad de descriptores de archivos

sudo ulimit -n 12288es tan alto como Snow Leopard quiere llegar; más allá de esto resulta en

/ usr / bin / ulimit: línea 4: ulimit: archivos abiertos: no se puede modificar el límite: argumento no válido.

Quiero aumentar el número mucho más alto, digamos 100000. ¿Es posible?

Chris Poole
fuente
44
Las respuestas de esta pregunta ya no funcionan en OSX Mavericks.
Howard
2
Ejecutar echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confy reiniciar funciona para mí en Mavericks.
Lri

Respuestas:

95

El uso del ulimitcomando solo cambia los límites de recursos para el shell actual y sus hijos y sudo ulimitcrea un shell raíz, ajusta sus límites y luego sale (por lo que, hasta donde puedo ver, no tiene ningún efecto real).
Para superar los 12288, debe ajustar el núcleo kern.maxfilesy los kern.maxfilesperprocparámetros, y también (al menos de acuerdo con esta entrada del blog , que es un resumen de esta discusión ) un límite de lanzamiento. Puede usar launchctl limitpara ajustar todo esto a la vez:

sudo launchctl limit maxfiles 1000000 1000000

Para hacer esto permanente (es decir, no restablecer cuando reinicia), cree que /etc/launchd.confcontiene:

limit maxfiles 1000000 1000000

Luego puede usar ulimit(pero sin el sudo) para ajustar su límite de proceso.

Si esto no lo hace, es posible que se encuentre con límites de tamaño en el núcleo. Si su modelo lo admite , puede ser útil iniciar el núcleo en modo de 64 bits .

Gordon Davisson
fuente
1
sudo launchctl limit maxfiles 1000000 unlimitedNi el límite rígido ni el límite flexible para "maxfiles" pueden ser ilimitados. Utilice un parámetro numérico para ambos.
Thomas Hunter
2
Tenga cuidado al agregar esa línea a launchd.conf. Creo que si el número es demasiado pequeño, puede inutilizar su computadora. Por ejemplo, lo usé limit maxfiles 1024 1024y me costó mucho volver a cambiarlo.
Shawn
1
Desgraciadamente: "El archivo /etc/launchd.conf ya no se consulta para que se ejecuten subcomandos durante el inicio temprano; esta funcionalidad se eliminó por razones de seguridad".
Alice Purcell
No funciona, mi número de fd no puede superar los 6k, incluso si configuro ulimit -Sn 10240 con éxito.
Jian Weihang
Los números de @JianWeihang fd son por proceso, por lo que supongo que otros procesos tienen 4000 archivos abiertos. ¿Por casualidad ejecutas Chrome? ;)
Trejkaz
41

Lo siguiente debería resolver la mayoría de las soluciones (y se enumeran en orden de jerarquía):

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile

Notas:

  1. Deberá reiniciar para que estos cambios surtan efecto.
  2. AFAIK ya no puede establecer límites a 'ilimitado' en OS X
  3. launchctl maxfiles están delimitados por sysctl maxfiles y, por lo tanto, no pueden superarlos
  4. sysctl parece heredar kern.maxfilesperproc de launchctl maxfiles
  5. ulimit parece heredar su valor 'abrir archivos' de launchctl por defecto
  6. puede establecer un ulimit personalizado dentro de / etc / profile, o ~ / .profile; Si bien esto no es obligatorio, he proporcionado un ejemplo
  7. Tenga cuidado al establecer cualquiera de estos valores en un número muy alto en comparación con su valor predeterminado: las características existen estabilidad / seguridad. He tomado estos números de ejemplo que creo que son razonables, escritos en otros sitios web.
errant.info
fuente
3
Desgraciadamente: "El archivo /etc/launchd.conf ya no se consulta para que se ejecuten subcomandos durante el inicio temprano; esta funcionalidad se eliminó por razones de seguridad".
Alice Purcell
34

¡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. En Library/LaunchDaemonscrear un archivo llamado limit.maxfiles.plisty pegar lo siguiente (no dude en cambiar los dos números (que son los límites blandos y duros, 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
2
Esta respuesta es excelente, y encontré algunos antecedentes para agregar aquí, @ninjaPixel: blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Dean Radcliffe
20

Parece que OS X Lion no permitirá un valor "ilimitado":

% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.

Proporcionar valores numéricos tanto para el límite blando como para el duro hace el trabajo:

% sudo launchctl limit maxfiles 4096 8192
crishoj
fuente
3
Si uno de los valores era ilimitado , usarlo -1como valor da como resultado 12288. Es posible usar valores numéricos más grandes, por ejemplo sudo launchctl limit maxfiles 15000 150000. Sin embargo, no estoy seguro de que esta configuración tenga efecto.
Daniel Beck
8

En Mavericks es simple. Como usuario habitual:

ulimit -n 8192

Puede verificar la configuración actualizada a través de

ulimit -a

En mi máquina

ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       709
-n: file descriptors                8192
Clustermagnet
fuente
2
Considere revisar su solución. Está configurando un ulimit de 1024, luego muestra los descriptores del archivo de salida como 8192 (debería ser 1024). Tu enfoque también es probelmático sin sudo, intenta cambiarlo varias veces por ti mismo.
y3sh
1
no se debe usar sudo aquí, pero esta respuesta es incorrecta. Los usuarios de Mavericks deben usar echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confy luego reiniciar su máquina
Kyle Chadha
3

En OS X 10.13.6 esto funciona para mí:

$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576
Petr Javorik
fuente
1

Algunos límites no se pueden cambiar ulimit, ya que solo se aplican al shell actual, por lo tanto, el launchctlcomando se debe usar para cambiar los límites globalmente, por ejemplo

sudo launchctl limit maxfiles 100000 unlimited

Tenga en cuenta que la aplicación de estos límites en /etc/launchd.conf(como se sugiere en otras respuestas) ya no es compatible con las versiones recientes de macOS. Aunque todavía puede usar launchd.plist(ver :) como archivos de configuración man launchd.plistpor usuario o en todo el sistema plistcomo se sugiere aquí , allá y allá .


Para que estos límites sean persistentes, puede usar el /etc/sysctl.confarchivo y agregar, por ejemplo:

kern.maxprocperuid=1000
kern.maxproc=2000
kern.maxfilesperproc=20000
kern.maxfiles=50000

Para que los cambios surtan efecto, es necesario reiniciar.

Para ver los límites actuales, ejecute: launchctl limit o sysctl -a | grep ^kern.max.

Consulte también: ¿Cómo persistir la configuración de ulimit en macOS?

kenorb
fuente