Esiste una correzione per l'errore "Troppi file aperti nel sistema" su OS X 10.7.1?


191

Devo liberarmi del fastidioso limite "Troppi file aperti nel sistema" su OS X 10.7.1. 

C'è un modo?


4
Vuoi spiegare di più su quando questo accade? In quali circostanze?
slhck,

1
@slhck - Ho lo stesso problema. Le circostanze sono fondamentalmente "casuali". Sono uno sviluppatore, quindi sto usando il mio Mac abbastanza pesantemente: eseguendo uno o più database, un web server, strumenti di test, uno o più browser e un lettore musicale contemporaneamente. Google Chrome sembra essere un programma con molti file aperti.
Nathan Long,

In realtà, il mio "uso pesante" non era il problema; le mie impostazioni per il numero massimo di file aperti per kernal e per processo erano molto inferiori a quelle che dovrebbero essere le impostazioni predefinite.
Nathan Long,

2
Se hai letto il commento di Nathan e ti sei chiesto perché non includesse dettagli sui valori predefiniti, è perché ha spiegato tutto nella sua risposta, di seguito. (Bella risposta! :)
Olie il

Sono nelle stesse circostanze d'uso di Nathan Long e ho scoperto che il riavvio di Apache è stato l'unico passo che "risolveva" il problema. Ho applicato tutti gli aumenti di limite indicati di seguito, ma non mi hanno aiutato immediatamente. Sto eseguendo test phpUnit a riga di comando> server selenio> firefox> apache> php> mysql tutti sullo stesso macbook. Lavorava bene fino a quando non sono passato ai maverick. L'errore che ottengo è nella webapp in fase di test, ovvero è php / apache a corto di file, quindi presumibilmente non controllato dall'impostazione della shell.
scipilot,

Risposte:


225

Secondo questo utile articolo (che consiglio di leggere):

Per impostazione predefinita, il numero massimo di file che Mac OS X può aprire è impostato su 12.288 e il numero massimo di file che un determinato processo può aprire è 10.240.

Puoi verificarli con:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Puoi aumentare i limiti (a tuo rischio e pericolo) con:

  • sysctl -w kern.maxfiles=20480 (o qualunque numero tu scelga)
  • sysctl -w kern.maxfilesperproc=18000 (o qualunque numero tu scelga)

Per rendere permanente la modifica, utilizzare sudoper inserire le impostazioni /etc/sysctl.conf(che potrebbe essere necessario creare), in questo modo:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Nota: in OS X 10.10 o versioni precedenti, puoi aggiungere un'impostazione in /etc/launchd.conflike limit maxfilese sovrascriverà qualunque cosa tu abbia inserito qui.

Ancora una volta, dall'articolo:

Una volta fatto questo, il kernel stesso avrà un numero massimo di file ma la shell potrebbe non esserlo. E poiché la maggior parte dei processi che occuperanno così tanti file verranno avviati dalla shell, vorrai aumentarlo.

Il comando per questo è:

ulimit -S -n 2048 # or whatever number you choose

Anche questo cambiamento è temporaneo; dura solo per la sessione di shell corrente. È possibile aggiungere al file di configurazione della shell ( .bashrc, .zshrco qualsiasi altra cosa) se si desidera che venga eseguito ogni volta che si apre una shell.


1
quale limite si applica ai processi avviati facendo clic sulle icone nell'area di avvio? E come cambiare quel limite? Quando dici "shell", suppongo che intendi una shell terminale interattiva.
Cheeso,

@Cheeso - Penso che il limite generale del sistema (sysctl) o il limite di avvio, qualunque sia il più basso, lo controlla.
Nathan Long,

1
la creazione di un file /etc/launchd.conf con il limite massimo dei file 1000000 1000000 ha funzionato perfettamente per me! (OSX 10.8.2 qui)
Zugwalt,

1
Ho inserito kern.maxfiles=65000 kern.maxfilesperproc=65000/etc/sysctl.conf e riavviato. kern.maxfiles è stato ignorato e è rimasto predefinito, ma kern.maxfilesperproc è stato impostato su 65000. Non ho /etc/launchd.conf, quindi che succede?
pferrel

2
Se qualcuno ha problemi con max file che non si attaccano, è perché c'è uno spazio finale dopo la linea maxfiles, che deve essere cancellato.
jjathman,

62

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

Per OS X Sierra (10.12.X) devi:

1. Crea un file in /Library/LaunchDaemons/limit.maxfiles.pliste incolla quanto segue (sentiti libero di cambiare i due numeri (che sono i limiti soft e hard, rispettivamente):

<?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

ha funzionato perfettamente, grazie! Nel mio caso l'errore si è manifestato in un processo Java con il messaggioIO Error: Bad file descriptor (Write failed)
agradl

1
Funziona anche su El Capitan 10.11.6
Troy Daniels il

non è ancora possibile modificare l'ulimit per la shell. Il massimo rimane 1024 qualunque cosa io faccia
DataGreed

Al passaggio 2: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen,

33

Dovrai aumentare le tue impostazioni ulimit - è abbastanza basso su OS X in questi giorni - 256 per impostazione predefinita. Aggiungi ulimit -n 4096o simile al tuo ~ / .profile o equivalente e questo lo risolverà nel tuo ambiente locale. Corri ulimit -aper controllare i tuoi livelli attuali

Per vedere le impostazioni di sistema, esegui questo:

launchctl limit maxfiles

È impostato un po 'più alto in Lion (10240) in base al processo rispetto al passato. Ma se lo stai ancora colpendo lì, puoi impostarlo più in alto usando lo stesso comando con i livelli desiderati. Per rendere permanenti le modifiche /etc/launchd.conf è necessario aggiungere le righe pertinenti.


1
256? Sono 2560 descrittori di file per me e non l'ho mai cambiato. Il limite è 266 processi (cf ulimit -a).
slhck,

2
Lo stesso per me, 256 file su MacOS X Maverick
Climbatize

4
256 anche su OS X Yosemite
Alexander,

2
256 anche su El Capitan.
TMN,

1
256 in Yosemite.
Jaec,

31

Un'altra opzione potrebbe essere trovare il colpevole:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

Per l'ultimo potresti vedere quali file sono aperti:

sudo lsof -n | grep socketfil

E uccidi il processo se lo desideri

kill $pid

Dai commenti:

Per quello che vale, puoi anche ottenere un elenco degli ID di processo con i file più aperti utilizzando

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail

Utile! Ma l'ordinamento su OS X (10.11) non richiede -h. (Forse -g?)
Robert Calhoun,

Per me ha funzionato bene senza -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop il

Così sia senza-h
sanmai

Questa è l'unica risposta che mi ha aiutato a sradicare il mio problema .. grazie :)
SgtPooki

1
Utilizzare lsof -n +c 0per impedire il troncamento del nome del processo.
vaughan,

10

Gente, su Mavericks 10.9.4

ulimit -n 2048funziona bene. Potrebbe essere necessario avviare una nuova sessione di accesso.


3

Per gli ultimi macOS (al momento della scrittura: 10.14.1), è possibile utilizzare sudo launchctl limit maxfiles 64000 524288(per impostazione predefinita era 256), ma funziona solo nella sessione corrente. Utilizzare il launchctllavoro da @ninjaPixel ( https://superuser.com/a/1171028/760235 ) per una soluzione permanente.


Come ti è venuto in mente il numero 524288? I miei valori precedenti erano 256 e illimitati.
Chip Roberson,

1

Puoi correre

lsof -n

quale processo apre troppi file.

quindi uccidilo.

o

sysctl -w kern.maxfiles=20480

cambiarlo in uno più grande.


3
Spiegare in che modo questa risposta differisce da quelle già fornite.
Stephen Rauch,

1

Dopo tutte le modifiche sopra il mio java non ha fatto più di 10000 file. La soluzione era questa bandiera jvm -XX: -MaxFDLimit


0

L'ho incontrato mentre facevo un chmod -R, quindi l'ho fatto prendendo piccoli passi, ad es

# for each directory
find . -type d -exec chmod 755 {} \;

1
Anche se questo può essere un modo per aggirare, non sembra effettivamente rispondere alla domanda. Forse spiegare che non puoi liberarti del messaggio e poi proporlo come un modo per renderlo meno problematico migliorerebbe la tua risposta.
music2myear

0

Simile a https://superuser.com/a/1171028/367819

Per verificare i limiti attuali sul tuo sistema Mac OS X, esegui:

launchctl limit maxfiles

Le ultime due colonne sono rispettivamente i limiti soft e hard.

Per regolare i limiti dei file aperti su base di sistema in Yosemite di Mac OS X, è necessario creare due file di configurazione. Il primo è un file dell'elenco delle proprietà (aka plist) in /Library/LaunchDaemons/limit.maxfiles.plist che contiene la seguente configurazione XML:

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

Ciò imposterà il limite dei file aperti su 200000. Il secondo file di configurazione del plist dovrebbe essere archiviato in /Library/LaunchDaemons/limit.maxproc.plist con i seguenti contenuti:

<?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.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

Entrambi i file plist devono essere di proprietà di root: wheel e avere le autorizzazioni -rw-r - r--. Queste autorizzazioni dovrebbero essere presenti per impostazione predefinita, ma è possibile assicurarsi che siano presenti eseguendo sudo chmod 644. Sebbene i passaggi sopra descritti consentano di impostare correttamente i limiti dei file aperti a livello di sistema al riavvio, è possibile applicarli manualmente eseguendo il limite di avvio.

Oltre a impostare questi limiti a livello di sistema, ti consigliamo di impostare anche a livello di sessione aggiungendo le seguenti righe al tuo file bashrc, bashprofile o analogo:

ulimit -n 200000
ulimit -u 2048

Come i file plist, il tuo file bashrc o simile dovrebbe avere le autorizzazioni -rw-r - r--. A questo punto, puoi riavviare il computer e inserire ulimit -n nel tuo terminale. Se il tuo sistema è configurato correttamente, dovresti vedere che maxfiles è stato impostato su 200000.


Puoi seguire questo articolo per maggiori dettagli.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


Ricorda di riavviare il Mac per rendere effettivi i valori.


O il post deve essere contrassegnato come duplicato se esiste già una risposta, altrimenti, si prega di pubblicare le informazioni pertinenti da un link, poiché il link potrebbe non essere valido per sempre.
zymhan,
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.