Aumentare il numero massimo di descrittori di file aperti in Snow Leopard?


96

Sto cercando di fare qualcosa che richiede un gran numero di descrittori di file

sudo ulimit -n 12288 è alto come Snow Leopard vuole andare; oltre questo risulta in

/ usr / bin / ulimit: riga 4: ulimit: file aperti: impossibile modificare il limite: argomento non valido.

Voglio aumentare il numero molto più alto, diciamo 100000. È possibile?


4
Le risposte alle domande non funzionano più su OS X Mavericks.
Howard

2
In esecuzione echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.conf e il riavvio funziona per me in Mavericks.
Lri

Risposte:


91

utilizzando ulimit comando cambia solo i limiti di risorse per la shell corrente e i suoi figli e sudo ulimit crea una shell di root, regola i suoi limiti e quindi esce (avendo quindi, per quanto posso vedere, nessun effetto reale).
Per superare 12288, è necessario regolare il kernel kern.maxfiles e kern.maxfilesperproc parametri, e anche (almeno secondo questo post di blog , che è un riassunto di questa discussione ) un limite di lancio. Puoi usare launchctl limit per regolare tutti questi in una volta:

sudo launchctl limit maxfiles 1000000 1000000

Per rendere questo permanente (non resettare quando si riavvia), creare /etc/launchd.conf contenente:

limit maxfiles 1000000 1000000

Poi Puoi usare ulimit (ma senza il sudo ) per regolare il limite del processo.

Se ciò non avviene, potresti avere dei limiti di dimensioni nel kernel. Se il tuo modello lo supporta , avvio del kernel in Modalità a 64 bit posso aiutare.


sudo launchctl limit maxfiles 1000000 unlimited Né il limite rigido né quello soft per "maxfiles" possono essere illimitati. Si prega di utilizzare un parametro numerico per entrambi.
Thomas Hunter

2
Fai attenzione quando aggiungi questa linea a launchd.conf. Penso che se il numero è troppo piccolo, può rendere inutilizzabile il tuo computer. Ad esempio, ho usato limit maxfiles 1024 1024 e ho avuto davvero difficoltà a cambiarlo.
Shawn

1
Purtroppo: "Il file /etc/launchd.conf non viene più consultato per i sottocomandi da eseguire durante l'avvio anticipato, questa funzionalità è stata rimossa per motivi di sicurezza."
Alice Purcell

Non funziona, il mio numero di fd non può superare i 6k anche se ho impostato correttamente ulimit -Sn 10240.
Jian Weihang

@JianWeihang I numeri fd sono per processo quindi presumo che altri processi abbiano 4000 file aperti. Ti capita di eseguire Chrome? ;)
Trejkaz

41

Quanto segue dovrebbe risolvere la maggior parte delle soluzioni (e sono elencate in ordine di gerarchia):

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

Gli appunti:

  1. Sarà necessario riavviare per rendere effettive queste modifiche.
  2. AFAIK non puoi più impostare limiti a 'illimitato' in OS X
  3. I maxfile di launchctl sono limitati da sysctl maxfile e quindi non può superarli
  4. sysctl sembra ereditare kern.maxfilesperproc da launchctl maxfiles
  5. ulimit sembra ereditare il valore di "file aperti" da launchctl per impostazione predefinita
  6. puoi impostare un ulimit personalizzato all'interno di / etc / profile, o ~ / .profile; mentre questo non è richiesto, ho fornito un esempio
  7. Prestare attenzione quando si imposta uno qualsiasi di questi valori su un numero molto elevato rispetto al loro valore predefinito - le funzionalità esistono stabilità / sicurezza. Ho preso questi numeri esemplificativi che ritengo siano ragionevoli, scritti su altri siti web.

2
Purtroppo: "Il file /etc/launchd.conf non viene più consultato per i sottocomandi da eseguire durante l'avvio anticipato, questa funzionalità è stata rimossa per motivi di sicurezza."
Alice Purcell

30

Sembra che ci sia un metodo completamente diverso per modificare il limite dei file aperti per ciascuna versione di OS X!

Per OS X Sierra (10.12.X) è necessario:

1. Nel Library/LaunchDaemons crea un file chiamato limit.maxfiles.plist e incollare quanto segue in (sentiti libero di cambiare i due numeri (che sono rispettivamente i limiti soft e hard):

<?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. Cambia il proprietario del tuo nuovo file:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3. Carica queste nuove impostazioni:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. Infine, controlla che i limiti siano corretti:

launchctl limit maxfiles

2
Questa risposta è ottima, e ho trovato alcuni sfondi da aggiungere qui, @ninjaPixel: blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Dean Radcliffe

20

Sembra che OS X Lion non consenta "illimitato" come valore:

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

Fornire valori numerici per il limite sia morbido che rigido fa il lavoro:

% sudo launchctl limit maxfiles 4096 8192

3
Se uno dei valori era illimitato , usando -1 come risultato del valore 12288. È possibile utilizzare valori numerici più grandi, ad es. sudo launchctl limit maxfiles 15000 150000. Non sono sicuro che queste impostazioni abbiano un effetto, comunque.
Daniel Beck

7

Su Mavericks è semplice. Come utente normale:

ulimit -n 8192

Puoi controllare le impostazioni aggiornate tramite

ulimit -a

Sulla mia macchina:

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

2
Valuta la possibilità di rivedere la tua soluzione. Stai impostando un ulimit di 1024, quindi mostrando i descrittori del file di output come 8192 (dovrebbe essere 1024). Il tuo approccio è anche probelmatico senza sudo, prova a cambiarlo un paio di volte per te stesso.
y3sh

1
sudo non dovrebbe essere usato qui, ma questa risposta non è corretta. Gli utenti Mavericks dovrebbero usare echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.conf e quindi riavviare la macchina
Kyle Chadha

1

Sopra OS X 10.13.6 questo funziona per me:

$ 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

0

Alcuni limiti non possono essere modificati da ulimit, perché si applicano solo alla shell corrente, quindi launchctl il comando dovrebbe essere usato per cambiare i limiti globalmente, ad es.

sudo launchctl limit maxfiles 100000 unlimited

Si prega di notare che l'applicazione di questi limiti in /etc/launchd.conf (come suggerito in altre risposte) non è più supportato nelle recenti versioni di macOS. Anche se può ancora usare launchd.plist (vedere: man launchd.plist ) come per utente o per tutto il sistema plist file di configurazione come suggerito Qui e .


Per rendere persistenti questi limiti, puoi usare /etc/sysctl.conf file e aggiungi per esempio:

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

Affinché le modifiche abbiano l'effetto, è necessario riavviare.

Per vedere i limiti attuali, esegui: launchctl limit o sysctl -a | grep ^kern.max.

Guarda anche: Come mantenere le impostazioni ulimit in macOS?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.