tail: inotify tidak dapat digunakan, kembali ke polling: Terlalu banyak file yang terbuka

16

Ketika saya mencoba tail -f catalina.out, saya mendapatkan kesalahan:

tail: inotify cannot be used, reverting to polling: Too many open files 

Saya mencoba jawabannya di posting ini: Terlalu banyak file yang terbuka - bagaimana menemukan pelakunya

lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head

Ketika saya menjalankan perintah di atas, hasilnya adalah

17 6115

13 6413

10 6417

10 6415

9 6418

9 6416

9 6414

8 6419

4 9 

4 8

Saya tidak melihat adanya proses membuka 1024 file. Bukankah jumlah file terbuka 17,13,10,10,9? Atau saya salah memahaminya? Dan semua ini adalah bash, sshd, apache2, tomcat memiliki nomor 4.

Saya juga melakukan lsof | grep tail | wc -l yang kembali 20. Angka-angka ini tidak besar, jadi mengapa tail -f catalina.outgagal?

gbag
sumber

Jawaban:

17

Ini diselesaikan untuk saya dengan mengikuti instruksi di http://peter-butkovic.blogspot.com/2013/08/tail-inotify-resources-exhausted.html

Solusi permanen (dipertahankan di seluruh restart) Menambahkan baris:

fs.inotify.max_user_watches=1048576

untuk:

/etc/sysctl.conf

memperbaiki nilai batas secara permanen (bahkan di antara restart).

lalu lakukan a

sysctl -p
Elan Hasson
sumber
1
Meningkatkan deskriptor file tidak membantu saya. Saya tailpesan adalah sedikit berbeda: tail: inotify resources exhausted. Jawaban ini membantu saya. Anda juga dapat menggunakan sudo sysctl -w fs.inotify.max_user_watches=1048576 && sysctl -puntuk menguji apakah itu membantu tanpa memodifikasinya secara permanen. Posting ini juga membantu nefaria.com/2014/08/tail-inotify-resources-exhausted
Ruslan Stelmachenko
9

Saya pikir jawaban itu tidak lengkap (tidak mengatakan apa-apa tentang batas maksimum file yang terbuka pada sistem).

Ada dua batasan mengenai jumlah maksimum file terbuka:

  1. Batas maksimum file terbuka per proses .

    • Anda dapat melihat mana nilai batas ini menggunakan: ulimit -n
    • Anda dapat mengubah batas ini menggunakan: ulimit -n new_limit_number
    • Berikut adalah perintah untuk mendapatkan 10 proses teratas yang membuka banyak file:

      lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head
  2. Batas maksimum file terbuka per sistem .

    • Anda dapat melihat mana nilai batas ini menggunakan: cat /proc/sys/fs/file-max
    • Anda dapat mengubah batas ini menggunakan: echo new_limit_number > /proc/sys/fs/file-max
    • Hitung semua pegangan file yang terbuka: lsof | wc -l
Radu Rădeanu
sumber
6

Kemungkinan besar, Anda sudah kehabisan inotifyarloji Anda . Mungkin, Anda menjalankan beberapa alat sinkronisasi file (mis. Dropbox) di latar belakang?

Di Linux, implementasi internal tail -fperintah menggunakan inotifymekanisme secara default, untuk memonitor perubahan file. Jika Anda kehabisan semua inotifyjam tangan (8192 secara default), maka inotify -fharus beralih ke polling untuk mendeteksi perubahan pada file itu.

Tentu saja, Anda dapat memodifikasi jumlah inotifyjam tangan maksimum .

referensi:
http://www.quora.com/How-is-tail-f-implemented
http://peter-butkovic.blogspot.com/2013/08/tail-inotify-resources-exhausted.html
https: // serverfault.com/questions/510708/tail-inotify-cannot-be-used-reverting-to-polling-too-many-open-files

zeekvfu
sumber
3

sysctl fs.inotify.max_user_instancesakan mendapatkan batas per pengguna untuk inotify.

Saya mengalaminya, dan semua sistem lebar batas cukup tinggi, tetapi pengaturan oleh pengguna biasanya relatif rendah secara default, Anda dapat meningkatkannya sysctl.confdan memuatnya kembali sysctl -p.

JBat
sumber
3

Lari

ps aux | grep tail

untuk memeriksa apakah terlalu banyak perintah ekor yang berjalan, seperti spawn by crontab.

tangxinfa
sumber
ha ini sebenarnya berhasil, terlalu banyak file tailing
Alexander Mills
Bagaimana cara menerjemahkan data? Bisakah Anda menjelaskan apa arti setiap informasi dan apa yang harus dilakukan? Misalnya:root 20161 0.0 0.0 11132 1044 pts/0 S+ 17:27 0:00 grep tail
Christia
Ini adalah masalah hanya jika TERLALU BANYAK proses cocok, baris yang cocok mengandung "grep" dihasilkan oleh perintah itu sendiri. Silakan gunakan perintah "pgrep tail" sebagai gantinya.
tangxinfa