Bagaimana saya bisa tahu kalau saya kehabisan jam tangan?

47

Saya menggunakan aplikasi yang menggunakan jam tangan yang tidak sah. Saya sudah siap

fs.inotify.max_user_watches=32768

di /etc/sysctl.conftapi tadi malam aplikasi berhenti pengindeksan kecuali aku berlari secara manual, yang membuat saya curiga saya dari jam tangan.

Karena saya tidak tahu apa untungnya adalah ketika saya meningkatkan angka ini (apakah ia mengkonsumsi lebih banyak RAM?), Saya tidak tahu apakah saya harus menambah saja angka ini, jadi saya ingin tahu apakah ada cara saya dapat mengetahui apakah itu menggunakan semua jam tangan ini dan apa untungnya untuk meningkatkannya.

Jorge Castro
sumber
Pertanyaan ini telah menjadi sangat relevan lagi karena ternyata pada 18.04 membuka kunci layar tidak mungkin jika seseorang telah kehabisan jam tangan inode.
kasperd

Jawaban:

64

Bagaimana Anda tahu kalau Anda kehabisan arloji? ekor akan tahu!

  • Mulai taildengan opsi -f(ikuti) pada file lama apa pun, misalnya 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 , ini akan gagal dengan kesalahan yang agak samar ini :
      tail: tidak dapat menonton '/ var / log / dmsg': Tidak ada ruang tersisa di perangkat

Untuk yang penasaran: Mengapa ekor " ekor "?

  • Sebenarnya, aplikasi apa pun yang ditulis dengan baik harus memberi tahu Anda, karena API / panggilan yang tidak sah dengan jelas memberi tahu mereka apa kesepakatannya.
  • Coba strace tail -f ...saja, dan ketika berhasil, diakhiri dengan:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • tetapi jika gagal, yaitu Anda kehabisan jam tangan , itu akan mengatakan:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (Tidak ada ruang tersisa di perangkat)
    

Bisakah Anda menambah arloji? Seberapa banyak? Ada pengorbanan?

Jawaban singkat: Tentu, tidak berkeringat. Langsung ke setengah juta (524288) jika Anda mau ... memori tambahan yang digunakan harus diabaikan pada sistem modern dengan memori 4GB +.

  • 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.
  • Jadi, dengan asumsi Anda menetapkan maks pada 524288, dan semua digunakan (tidak mungkin), Anda akan menggunakan kira-kira. 256 MB / 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.
  • Apa nilai maksimalnya? Saya kira tidak ada, secara teori, selama Anda memiliki RAM yang cukup. Dalam praktiknya, 524288 telah direkomendasikan secara resmi oleh aplikasi , dan orang-orang telah menetapkannya menjadi 2 juta , dengan penggunaan memori yang menyertainya, tentu saja.

ish
sumber
5
Jika Anda juga ingin tahu jumlah aktual jam tangan tidak aktif (jadi lebih dari ya / tidak), sudo lsof | grep -i inotify | wc -l
pilih
2
Tautan "aplikasi yang ditulis dengan baik" rusak.
Gaurav Sharma
11

Saya tidak tahu apakah saya harus menambah jumlah ini

Cara mudah untuk memeriksa apakah Anda mencapai max_user_watchesnilai Anda adalah, dengan pengguna Anda, untuk menggunakan inotifywatch, dari paket inotify-tools, dan memeriksa apakah Anda masih dapat mengumpulkan informasi dari file.

Misalnya inotifywatch -v /home/bruno/.profileuntuk saya kembali:

Establishing watches...
Total of 1 watches.
Finished establishing watches, now collecting statistics.

Jadi inotifytidak ada masalah membuat arloji baru, tidak ada masalah di sini.

Jika Anda telah mencapai batas maksimum dalam jam tangan yang tidak sah, itu akan mengembalikan sesuatu seperti

Failed to watch /home/bruno/.profile; upper limit on inotify watches reached!

Jika Anda melihat sesuatu seperti ini, maka Anda telah mencapai batas dan perlu menambah batas jam tangan yang diizinkan.

Apakah ini mengkonsumsi lebih banyak RAM?

Ya, benar. Namun menurut ini artikel lama jumlah mengkonsumsi minimal dibandingkan dengan aspek-aspek lain dari desktop berjalan.

--GUNA PENGGUNAAN--

Struktur data yang tidak diotifikasi ringan:

inotify watch adalah 40 bytes perangkat inotify adalah 68 bytes acara inotify adalah 272 bytes

Jadi dengan asumsi perangkat memiliki 8192 jam tangan, strukturnya hanya akan mengkonsumsi memori 320KB. Dengan jumlah maksimum 8 perangkat yang diizinkan ada pada satu waktu, ini masih hanya 2,5 MB

Setiap perangkat juga dapat memiliki 256 acara yang antri pada satu waktu, yang jumlahnya mencapai 68KB per perangkat. Dan hanya 0,5 MB jika semua perangkat dibuka dan memiliki antrian acara lengkap.

Jadi sekitar 3 MB memori digunakan dalam kasus yang jarang dari semuanya terbuka dan penuh.

Setiap arloji inotify pin inode dari direktori / file dalam memori, ukuran inode berbeda per sistem file tetapi mari kita asumsikan bahwa itu adalah 512 bye.

Jadi dengan asumsi jumlah maksimum jam tangan global aktif, ini akan menjabarkan 32 MB inode dalam cache inode. Sekali lagi bukan masalah pada sistem modern.

Saya tentu saja dengan asumsi hal-hal tidak banyak berubah sejak artikel itu ditulis tetapi melihat angka-angka saya tidak akan khawatir dan meningkatkan batas tidak akan meningkatkan konsumsi RAM banyak.


Posting terkait tentang inotify

Bruno Pereira
sumber
Maaf kawan, saya memiliki draft terbuka kemarin selama beberapa jam dan tidak melihat jawaban Anda sebelum saya memposting milik saya. Saya kira tidak apa-apa karena mereka memiliki dua pendekatan berbeda :-) Bisakah Anda mengklarifikasi bahwa dalam kernel baru-baru ini, inotify menggunakan 0,5KB (pada 32-bit) atau 1KB (64-bit) dari memori kernel per jam, karena info lama dari 2005 sepertinya tidak benar lagi?
ish