GNU/Linux >> Linux Esercitazione >  >> Linux

Perché git fallisce su push/fetch con troppi file aperti

Ci sono due messaggi di errore simili:

EMFILE: Too many open files
ENFILE: Too many open files in system

Sembra che tu riceva EMFILE , il che significa che il numero di file per un singolo processo è stato superato. Quindi, controllando se vi può aprire i file è irrilevante—vi utilizzerà la propria tabella di file separata. Controlla i tuoi limiti con:

$ ulimit -n
1024

Quindi sul mio sistema c'è un limite di 1024 file aperti in un singolo processo. Non dovresti chiedere al tuo amministratore di sistema (per favore non usare l'acronimo SA, è troppo opaco; se devi abbreviare, usa "sysadmin") per alzare il limite.

Potresti voler controllare quali file Git apre eseguendo Git sotto strace .

Questo potrebbe essere un bug in Git o in una libreria, o potrebbe essere che stai usando una vecchia versione di qualcosa, o potrebbe essere qualcosa di più bizzarro. Prova strace prima per vedere quali file apre e controlla se Git li chiude.

Aggiornamento da Hazok:

Dopo aver utilizzato i consigli di cui sopra, risulta che l'errore è stato causato da troppi oggetti sciolti. C'erano troppi oggetti sciolti perché git gc non veniva eseguito abbastanza spesso.


Perché è successo?

Dalla documentazione git:

Quando ci sono approssimativamente più di questo numero di oggetti sciolti nel repository, git gc --auto li comprimerà. Alcuni comandi di Porcelain utilizzano questo comando per eseguire di tanto in tanto una raccolta dei rifiuti leggeri. Il valore predefinito è 6700.

Qui "Alcuni comandi di porcellana" include git push , git fetch ecc. Quindi, se il numero massimo di file aperti limita ulimit -n <6700, alla fine verrai bloccato da git gc --auto una volta che hai ~6700 oggetti sciolti in un singolo repository git.

Sono di fretta. Come risolverlo?

Se disponi di autorizzazioni sufficienti per regolare il sistema ulimit:

$ sudo ulimit -n 8192

Altrimenti, puoi disabilitare git gc impostando git config gc.auto 0 , in modo da poter inviare i tuoi commit locali al remoto, eliminare il repository e clonarlo di nuovo senza migliaia di oggetti sciolti.

Come possiamo evitare che ciò accada di nuovo?

Imposta git config --global gc.auto 200 , dove 200 è un valore inferiore al limite massimo di file aperti. Se hai scelto un valore troppo piccolo, git gc verrebbe eseguito troppo frequentemente, quindi scegli con saggezza.

Se imposti gc.auto=0 , gli oggetti sciolti non verranno mai impacchettati a meno che non si esegua git gc manualmente. Quindi potrebbero esserci centinaia di migliaia di file accumulati nella stessa directory, il che potrebbe essere un problema, specialmente per il disco rigido meccanico o gli utenti Windows. (Vedi anche:Quanti file in una directory sono troppi? e Va bene (dal punto di vista delle prestazioni) avere centinaia o migliaia di file nella stessa directory Linux?).


Linux
  1. Perché Files (nautilus) apre una nuova finestra anche se ce n'è già una aperta?

  2. Avvio di udev:udevd inotify_init non riuscito:troppi file aperti

  3. Perché sed fallisce con i caratteri internazionali e come risolverlo?

  4. Perché Tomcat funziona con la porta 8080 ma non con la 80?

  5. bash:/bin/tar:elenco di argomenti troppo lungo durante la compressione di molti file con tar

Cosa fa Linux con i file esistenti in un punto di montaggio?

Perché l'aggiornamento yum non riesce in CentOS 6.4?

Troppi file aperti (CentOS7) - già provato a impostare limiti più alti

Perché find -mtime non funziona come previsto su file con fusi orari diversi?

Perché ntpd è in ascolto su così tante porte/indirizzi?

Il riempimento del disco con dd rimuove i file in modo sicuro?