it-swarm-id.com

Kernel inotify batas jam tangan tercapai

Saya saat ini menghadapi masalah pada kotak linux di mana sebagai root saya memiliki perintah untuk mengembalikan kesalahan karena batas menonton tidak sah telah tercapai.

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

Saya googled sedikit dan setiap solusi yang saya temukan adalah meningkatkan batas dengan:

Sudo sysctl fs.inotify.max_user_watches=<some random high number>

Tetapi saya tidak dapat menemukan informasi tentang konsekuensi dari peningkatan nilai itu. Saya kira nilai kernel default ditetapkan karena suatu alasan tetapi tampaknya tidak memadai untuk penggunaan tertentu. (mis., ketika menggunakan Dropbox dengan banyak folder, atau perangkat lunak yang memantau banyak file)

Jadi inilah pertanyaanku:

  • Apakah aman untuk meningkatkan nilai itu dan apa konsekuensi dari nilai yang terlalu tinggi?
  • Apakah ada cara untuk mengetahui jam tangan apa yang saat ini ditetapkan dan proses mana yang mengatur mereka untuk dapat menentukan apakah batas yang dicapai tidak disebabkan oleh perangkat lunak yang salah?
221
Ultraspider

Apakah aman untuk menaikkan nilai itu dan apa konsekuensi dari nilai yang terlalu tinggi?

Ya, aman untuk menaikkan nilai itu dan di bawah ini adalah kemungkinan biaya [ sumber ]:

  • Setiap bekas jam tidak sah membutuhkan 540 byte (sistem 32-bit), atau 1 kB (ganda - pada 64-bit) [sumber: 1 , 2 ]
  • Ini keluar dari memori kernel, yang tidak dapat diganti.
  • Dengan asumsi Anda mengatur maks pada 524288 dan semua digunakan (tidak mungkin), Anda akan menggunakan sekitar 256MB/512MB memori kernel 32-bit/64-bit.
    • Perhatikan bahwa aplikasi Anda juga akan menggunakan memori tambahan untuk melacak gagang inotify, jalur file/direktori, dll. - seberapa banyak tergantung pada desainnya.

Untuk memeriksa jumlah maksimum jam tangan tidak sah:

cat /proc/sys/fs/inotify/max_user_watches

Untuk mengatur jumlah jam tangan tidak sah maksimum

Untuk sementara:

  • Lari Sudo sysctl fs.inotify.max_user_watches= dengan nilai pilihan Anda di akhir.

Permanen ( info lebih detail ):

  • taruh fs.inotify.max_user_watches=524288 ke dalam pengaturan sysctl Anda. Bergantung pada sistem Anda, mereka mungkin berada di salah satu tempat berikut:
    • Debian/RedHat: /etc/sysctl.conf
    • Arch: masukkan file baru ke /etc/sysctl.d/, mis. /etc/sysctl.d/40-max-user-watches.conf
  • anda mungkin ingin memuat ulang pengaturan sysctl untuk menghindari reboot: sysctl -p (Debian/RedHat) atau sysctl --system (Lengkungan)

Periksa untuk melihat apakah jumlah maksimum dari jam tangan yang diberitahukan telah tercapai:

Gunakan tail dengan -f (ikuti) opsi pada file lama apa pun, mis. tail -f /var/log/dmesg: - Jika semuanya baik-baik saja, itu akan menampilkan 10 baris terakhir dan berhenti; batalkan dengan Ctrl-C - Jika Anda kehabisan jam tangan , itu akan gagal dengan ini kesalahan agak samar :

tail: tidak dapat menonton '/ var/log/dmsg': Tidak ada ruang tersisa di perangkat

Untuk melihat apa yang menggunakan jam tangan tidak sah

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

Kolom pertama menunjukkan jumlah inotify fds (bukan jumlah jam tangan) dan yang kedua menunjukkan PID dari proses itu [sumber: 1 , 2 ].

294
tshepang