Setelah upgrade ke Fedora 15 baru-baru ini, saya menemukan bahwa sejumlah alat gagal dengan kesalahan di sepanjang baris:
tail: inotify resources exhausted
tail: inotify cannot be used, reverting to polling
Bukan hanya tail
itu yang melaporkan masalah dengan notifikasi, juga. Apakah ada cara untuk menginterogasi kernel untuk mengetahui proses atau proses apa yang menghabiskan sumber daya yang tidak diotifikasi? sysctl
Pengaturan yang terkait dengan inotify saat ini terlihat seperti ini:
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
fs.inotify.max_queued_events = 16384
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -exec sh -c 'cat $(dirname {})/../cmdline; echo ""' \; 2>/dev/null
Anda mungkin kehabisan jam tangan yang tidak sah dan bukan kejadian. Untuk mengetahui siapa yang membuat banyak jam tangan:
echo 1 >> /sys/kernel/debug/tracing/events/syscalls/sys_exit_inotify_add_watch/enable
untuk mengaktifkan pelacakan jam tangan;cat /sys/kernel/debug/tracing/tracing_enabled
untuk memastikan itu diatur ke 1 dan jika tidak dilakukanecho 1 >> /sys/kernel/debug/tracing/tracing_enabled
;/sys/kernel/debug/tracing/trace
untuk menonton berapa banyak jam tangan yang dibuat dan proses apa.Setelah selesai, pastikan untuk menggema 0 ke dalam file aktifkan (dan file tracing_enabled jika Anda juga harus mengaktifkannya) untuk mematikan pelacakan sehingga Anda tidak akan terkena dampak kinerja terus melacak.
sumber
echo 1 | sudo tee /sys/kernel/debug/tracing/tracing_on
di distro modern (Ubuntu 18.04.2 LTS).Seperti yang dikatakan @Jonathan Kamens, Anda mungkin kehabisan arloji. Saya memiliki naskah premade ,
inotify-consumers
bahwa daftar ini untuk Anda:Di sini Anda dengan cepat melihat mengapa batas default 8K pengamat terlalu sedikit pada mesin pengembangan, karena hanya contoh WebStorm cepat maxes ini ketika menemukan
node_modules
folder dengan ribuan folder. Tambahkan pengamat webpack untuk menjamin masalah ...Cukup salin isi skrip (atau file di GitHub) dan letakkan di suatu tempat di
$PATH
, seperti/usr/local/bin
. Sebagai referensi, konten utama skrip hanyalah iniJika Anda bertanya-tanya bagaimana cara meningkatkan batas, berikut ini cara membuatnya permanen:
sumber
Saya mengalami masalah ini, dan tidak ada jawaban yang memberi Anda jawaban "berapa banyak jam tangan yang digunakan setiap proses saat ini?" The one-liners semua memberi Anda berapa banyak contoh terbuka, yang hanya bagian dari cerita, dan hal-hal jejak hanya berguna untuk melihat jam tangan baru dibuka.
TL; DR: Ini akan memberi Anda file dengan daftar
inotify
instance terbuka dan jumlah jam tangan yang dimilikinya, bersama dengan id dan binari yang memunculkannya, diurutkan dalam urutan menurun berdasarkan jumlah jam:Itu adalah kekacauan besar, jadi inilah cara saya sampai di sana. Untuk memulai, saya menjalankan
tail
file tes, dan melihat fd dibuka:Jadi, 4 adalah fd yang ingin kita selidiki. Mari kita lihat apa untungnya
fdinfo
:Itu terlihat seperti entri untuk arloji di bagian bawah!
Mari kita coba sesuatu dengan lebih banyak jam tangan, kali ini dengan
inotifywait
utilitas, hanya menonton apa pun yang ada di/tmp
:Aha! Lebih banyak entri! Jadi kita harus memiliki enam hal di
/tmp
dalamnya:Luar biasa. Baru saya
inotifywait
memiliki satu entri dalamfd
daftar (yang menghitung satu-liners lain di sini), tetapi enam entri dalamfdinfo
file -nya . Jadi kita bisa mencari tahu berapa banyak jam tangan yang diberikan fd untuk proses tertentu menggunakan dengan berkonsultasifdinfo
file -nya . Sekarang untuk menggabungkannya dengan beberapa hal di atas untuk mengambil daftar proses yang memberitahukan jam tangan terbuka dan menggunakannya untuk menghitung entri di masing-masingfdinfo
. Ini mirip dengan di atas, jadi saya hanya akan membuang satu-liner di sini:Ada beberapa hal yang tebal di sini, tetapi dasar-dasarnya adalah yang saya gunakan
awk
untuk membangunfdinfo
jalur darilsof
output, meraih nomor pid dan fd, melepas bendera u / r / w dari yang terakhir. Kemudian untuk setiapfdinfo
jalur yang dibangun , saya menghitung jumlahinotify
garis dan menampilkan jumlah dan pid.Akan lebih baik jika saya memiliki proses apa yang disajikan oleh pid ini di tempat yang sama, kan? Saya pikir juga begitu. Jadi, dalam sedikit sangat berantakan, aku menetap di menelepon
dirname
dua kali padafdinfo
jalan untuk mendapatkan paket ke/proc/<pid>
, menambahkan/exe
untuk itu, dan kemudian berjalanreadlink
pada yang untuk mendapatkan nama exe proses. Lempar ke sana juga, urutkan berdasarkan jumlah jam tangan, dan arahkan ke file untuk disimpan dengan aman dan kami mendapatkan:Menjalankan itu tanpa sudo untuk hanya menunjukkan proses yang saya luncurkan di atas, saya mendapatkan:
Sempurna! Daftar proses, fd, dan berapa banyak jam tangan masing-masing menggunakan, yang persis apa yang saya butuhkan.
sumber
lsof
untuk tujuan ini, saya akan merekomendasikan menggunakan-nP
flag untuk menghindari pencarian yang tidak perlu dari DNS terbalik dan nama port. Dalam kasus khusus ini, menambahkan-bw
untuk menghindari kemungkinan memblokir syscalls juga dianjurkan. Yang mengatakan, denganlsof
menelan 3 detik waktu jam dinding di workstation saya yang sederhana (yang menghabiskan 2 detik di kernel), pendekatan ini bagus untuk eksplorasi tetapi sayangnya tidak cocok untuk tujuan pemantauan.lsof | awk '/a_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | sed 's/fdinfo.*//' | sort | uniq > uniq-o
kemudiancat uniq-o | while read fdi; do count=$(cat ${fdi}fdinfo/* | grep -c inotify 2>/dev/null); exe=$(readlink ${fdi}exe); echo -e $count"\t"${fdi}"\t"$exe; done > watches
Untuk melacak proses mana yang menggunakan jam tangan tidak sah (bukan instance) Anda dapat menggunakan fitur ftrace dinamis dari kernel jika diaktifkan di kernel Anda.
Opsi kernel yang Anda butuhkan adalah
CONFIG_DYNAMIC_FTRACE
.Pertama-tama pasang sistem file debugfs jika belum di-mount.
Pergi di bawah
tracing
subdirektori dari direktori debugfs iniAktifkan pelacakan panggilan fungsi
Saring hanya
SyS_inotify_add_watch
panggilan sistemBersihkan buffer cincin jejak jika tidak kosong
Aktifkan penelusuran jika belum diaktifkan
Mulai ulang proses yang dicurigai (dalam kasus saya ini adalah crashplan, aplikasi cadangan)
Tonton inotify_watch habis
Selesai
sumber
sumber
Saya telah memodifikasi skrip yang ada di atas untuk menunjukkan daftar proses yang memakan sumber daya tidak sah :
Saya pikir ada cara untuk mengganti sed ganda saya .
Iya. Gunakan salah satunya
atau
dan Anda hanya akan mendapatkan pid.
Juga, jika Anda menambahkan
di find, Anda akan menghilangkan garis kesalahan sial yang dilemparkan oleh find. Jadi ini akan berhasil:
sumber