Kernel tidak menandakan batas jam tangan tercapai

206

Saya saat ini menghadapi masalah pada kotak linux di mana sebagai root saya memiliki perintah untuk mengembalikan kesalahan karena batas jam 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. saat 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?
Ultraspider
sumber
Anda mungkin sudah memeriksanya sekarang karena ini berumur 8 bulan, tetapi apakah drive Anda penuh? "tail: tidak dapat menonton '/ var / log / messages': Tidak ada ruang tersisa di perangkat"
froggythefrog

Jawaban:

273

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

Ya, aman untuk meningkatkan nilai itu dan di bawah ini adalah biaya yang mungkin [ sumber ]:

  • Setiap arloji bekas yang digunakan membutuhkan 540 byte (sistem 32-bit), atau 1 kB (dobel - 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 maksimum jam tangan tidak sah

Untuk sementara:

  • Jalankan sudo sysctl fs.inotify.max_user_watches=dengan nilai pilihan Anda di akhir.

Permanen ( info lebih rinci ):

  • dimasukkan fs.inotify.max_user_watches=524288ke dalam pengaturan sysctl Anda. Tergantung pada sistem Anda, mereka mungkin berada di salah satu tempat berikut:
    • Debian / RedHat: /etc/sysctl.conf
    • Lengkungan: masukkan file baru /etc/sysctl.d/, misalnya/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 jam tangan tidak sah telah tercapai:

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

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 FDS inotify (bukan jumlah jam tangan) dan yang kedua menunjukkan PID dari proses itu [sumber: 1 , 2 ].

tepang
sumber
3
I guess very few codes need the values higher than the defaultDropbox mungkin memerlukan batas yang lebih tinggi, tergantung pada berapa banyak file yang Anda miliki. Iv'e mengangkat milikku tanpa masalah. pada kenyataannya, notifikasi dropbox (yang terjadi ketika mencapai batasnya) secara eksplisit memberitahu Anda untuk menaikkannya.
Falmarri
1
@ ultrasawblade- inotify menggantikan dnotify. pemberitahuan lambat dan bermasalah. inotify dapat digunakan pada direktori, dan direktori akan "diubah" ketika salah satu file di direktori itu (sedalam level) dimodifikasi. Direktori hanyalah file.
beatgammit
6
"Secara permanen: Ganti nilai dalam / proc / sys / fs / inotify / max_user_watches" <- ini salah. Untuk membuat ini permanen, Anda perlu mengubah/etc/sysctl.conf
Merc
3
sysctl! = systemd, dalam penjelasan Anda. Dan /etc/sysctl.djuga bekerja pada sistem berbasis RedHat yang lebih baru.
aairey
1
@stackexchanger jika Anda sangat yakin ini serupa (misalnya, Anda telah menguji), silakan kirimkan dan edit ke Pertanyaan. Saya sendiri belum memeriksanya, dan saya tahu bahwa distro cenderung untuk menambal paket, sehingga perilaku dapat berbeda untuk paket yang sama. Ini belum lagi perbedaan dalam versi paket juga.
tshepang