GNU/Linux >> Belajar Linux >  >> Linux

Mengapa git gagal saat Push/fetch dengan Terlalu banyak file terbuka

Ada dua pesan kesalahan serupa:

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

Sepertinya Anda mendapatkan EMFILE , yang berarti bahwa jumlah file untuk setiap proses terlampaui. Jadi, memeriksa apakah vi dapat membuka file tidak relevan—vi akan menggunakan tabel filenya sendiri yang terpisah. Periksa batas Anda dengan:

$ ulimit -n
1024

Jadi di sistem saya, ada batas 1024 file terbuka dalam satu proses. Anda tidak perlu bertanya kepada administrator sistem Anda (jangan gunakan akronim SA, terlalu buram; jika Anda harus menyingkat, gunakan "sysadmin") untuk menaikkan batas.

Anda mungkin ingin memeriksa file mana yang dibuka Git dengan menjalankan Git di bawah strace .

Ini bisa jadi bug di Git atau di perpustakaan, atau bisa jadi Anda menggunakan versi lama dari sesuatu, atau bisa juga sesuatu yang lebih aneh. Coba strace pertama untuk melihat file mana yang dibuka, dan periksa apakah Git menutup file tersebut.

Pembaruan dari Hazok:

Setelah menggunakan rekomendasi di atas, ternyata error tersebut disebabkan karena terlalu banyak objek yang lepas. Ada terlalu banyak objek lepas karena git gc tidak cukup sering dijalankan.


Mengapa ini terjadi?

Dari dokumentasi git:

Ketika ada lebih dari ini banyak objek lepas di repositori, git gc --auto akan mengemasnya. Beberapa perintah Porselen menggunakan perintah ini untuk melakukan pengumpulan sampah ringan dari waktu ke waktu. Nilai defaultnya adalah 6700.

Di sini "Beberapa perintah Porselen" menyertakan git push , git fetch dll. Jadi jika file terbuka maksimal membatasi ulimit -n <6700, Anda akhirnya akan diblokir oleh git gc --auto setelah Anda mendapatkan ~6700 objek lepas dalam satu repo git.

Saya sedang terburu-buru. Bagaimana cara memperbaikinya?

Jika Anda memiliki izin yang memadai untuk menyesuaikan ulimit sistem:

$ sudo ulimit -n 8192

Jika tidak, Anda dapat menonaktifkan git gc dengan mengatur git config gc.auto 0 , sehingga Anda dapat mendorong komit lokal ke jarak jauh, menghapus repo, dan menggandakannya kembali tanpa ribuan objek lepas.

Bagaimana kami dapat mencegah hal ini terjadi lagi?

Tetapkan git config --global gc.auto 200 , di mana 200 adalah nilai yang kurang dari batas maksimum file terbuka Anda. Jika Anda memilih nilai yang terlalu kecil, git gc akan berjalan terlalu sering, jadi pilihlah dengan bijak.

Jika Anda menyetel gc.auto=0 , objek lepas tidak akan pernah dikemas kecuali Anda menjalankan git gc secara manual. Jadi mungkin ada ratusan ribu file yang terkumpul di direktori yang sama, yang mungkin menjadi masalah, terutama untuk hard drive mekanis atau pengguna Windows. (Lihat juga:Berapa banyak file dalam direktori yang terlalu banyak? dan Bolehkah (berdasarkan kinerja) memiliki ratusan atau ribuan file dalam direktori Linux yang sama?).


Linux
  1. Menyelesaikan kesalahan Mysql:Terlalu banyak file yang terbuka

  2. Mengapa File (nautilus) Membuka Jendela Baru Meskipun Sudah Ada Yang Terbuka?

  3. Mengapa Tomcat bekerja dengan port 8080 tetapi tidak dengan 80?

  1. bash:/bin/tar:Daftar argumen terlalu panjang saat mengompresi banyak file dengan tar

  2. Mengapa rsync gagal menyalin file dari /sys di Linux?

  3. Mengapa mengikat pemasangan file setelah tautan gagal dengan ENOENT?

  1. Mengapa Perintah Ls Lambat Mengganggu Di Direktori Nfs Dengan Banyak File?

  2. Mengapa find -mtime tidak berfungsi seperti yang diharapkan pada file dengan zona waktu berbeda?

  3. Mengapa ntpd mendengarkan begitu banyak port/alamat?