Quale comando controlla i limiti del file aperto?

20

Quale file di comando / configurazione controlla i limiti del file aperto su OS X? Esiste un comando diverso per OS X 10.5 / 10.6 / 10.7? Le opzioni che esploro qui sotto sono ulimit , sysctl e launchctl

"Troppi file aperti" è apparentemente un errore comune su Leopard, forse altre versioni di OS X:

Ci sono molti modi (correlati?) per visualizzare i limiti del file aperto:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 512
virtual memory          (kbytes, -v) unlimited


$ launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     1024           2048           
maxfiles    2048           4096       

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

È stato affermato in alcuni dei post sopra che questi possono essere modificati con i seguenti comandi:

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

Tuttavia, dai comandi precedenti, solo i comandi sysctl hanno un effetto apparente (cioè ulimit -n e launchctl limit non mostrano alcuna modifica dopo aver inserito i comandi precedenti, mentre sysctl -a mostra le modifiche richieste ).

Le posizioni corrispondenti per modificare questi parametri per il sistema operativo sono:

/etc/sysctl.conf
/etc/launchd.conf

Ho anche scoperto uno risposta che legge che ulimit controlla solo la shell corrente.

Come posso regolare verso l'alto i limiti max files / max open su macOS?

    
posta keflavich 14.12.2011 - 18:58
fonte

4 risposte

9

La semplice risposta era che c'erano più limiti e il limite più basso che raggiungi in un'istanza specifica genererà il tuo errore. Ora anche il 10.12% dilaunchctl limit maxfiles è nel mix. Per i dettagli sull'implementazione, questa ottima risposta ha una generosità e merita più voti di quella che posso dargli.

altri thread rilevanti sono:

Il livello ulimit è impostato su un valore basso per impedire a uno script di shell scadente di inondare il kernel con file aperti.

Il kern.maxfilesperproc è lì per lasciare una piccola stanza nel conteggio dei file massimi in modo che un processo possa utilizzare la maggior parte, ma non tutto lo spazio aperto del gestore file dal kernel.

Per situazioni normali, il kern.maxfiles è il fattore limitante finale.

Su Sierra - i limiti sono 256 file aperti e max illimitati, quindi sto scoprendo che avere da 3 a 4 mila file impostati per il limite software funziona praticamente per tutto il nostro hardware e mantiene il sistema reattivo quando si verifica un processo in fuga apre troppi file. Ci piace mantenere i nostri server di sviluppo al limite 256 in modo da catturare software non affidabile e problematico nello sviluppo / staging e test piuttosto che scoprirlo in produzione.

Non sono un fan dei 10k file - forse con l'archiviazione APFS e NVMe vedremo il giorno in cui non è impensabile, ma cerca di restare con centinaia o migliaia di dollari per i limiti dei tuoi file.

    
risposta data 14.04.2012 - 22:19
fonte
8

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) devi:

1. In Library/LaunchDaemons crea un file chiamato limit.maxfiles.plist e incolla 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
    
risposta data 24.01.2017 - 16:00
fonte
6

Quanto segue dovrebbe risolvere i problemi più comuni (e sono elencati nell'ordine della loro 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

Note:

  1. Avrai bisogno di riavviare per rendere effettive queste modifiche.
  2. AFAIK non puoi più impostare limiti a 'illimitato' in OS X
  3. i file max 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 non è richiesto, ho fornito un esempio
  7. Sii prudente quando imposti 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.
risposta data 03.12.2012 - 13:08
fonte
0

In parole semplici:

  • Il comando ulimit fornisce "il controllo sulle risorse disponibili per la shell e i processi che crea" (vedi: help ulimit e man bash ). Le risorse date alla shell sono limitate dai limiti delle risorse di sistema.

  • Il launchctl controlla il massimo consumo di risorse di sistema dal processo corrente (vedi: man setrlimit e man launchctl ). I valori massimi sono limitati dai limiti del kernel.

  • Il sysctl controlla i limiti del kernel (vedi: man sysctl e Tuning di BSD Limiti del kernel ).

Per aumentare i limiti, puoi utilizzare ciascuno dei comandi, a seconda del problema.

Vedi anche: Qual è la relazione tra "limite di launchctl" e "ulimit"?

Per il problema con troppi file aperti, questo dipende da quale limite soft o hard è stato raggiunto (indipendentemente dal fatto che si tratti di uno script di shell locale, dello script globale eseguito da root , un'app o di tutti i processi allo stesso tempo). Vale la pena aumentare tutti i limiti (shell, launchd e limiti del kernel).

Per aumentare costantemente i limiti, consulta: Come controllare costantemente il consumo massimo delle risorse di sistema su Mac?

    
risposta data 11.01.2018 - 20:32
fonte

Leggi altre domande sui tag