Terlalu banyak file terbuka - cara menemukan pelakunya

69

Saat berjalan tail -f filename, saya mendapat pesan berikut:

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

Apakah itu masalah potensial?

Bagaimana cara mendiagnosis apa yang bertanggung jawab untuk semua file terbuka? Saya memiliki daftar proses yang dicurigai, tetapi jika ternyata tidak menjadi biang keladinya, instruksi yang tidak bergantung pada mengetahui proses mana yang akan diperiksa akan bermanfaat.

Andrew Grimm
sumber
1
Sudahkah Anda meningkatkan jumlah deskriptor file yang tersedia melalui ulimit?
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams Itu mungkin bermanfaat bagi pengguna lain, tetapi bagi saya rasanya seperti mengobati gejalanya daripada penyakitnya.
Andrew Grimm
Meskipun Anda tidak salah, terkadang aplikasi memiliki alasan yang sah untuk membuka banyak file.
Ignacio Vazquez-Abrams

Jawaban:

72

Anda dapat menggunakan lsof untuk memahami siapa yang membuka begitu banyak file. Biasanya server (web) yang membuka banyak file, tetapi lsof pasti akan membantu Anda mengidentifikasi penyebabnya.

Setelah Anda memahami siapa pria jahat yang Anda bisa

Jika output dari lsof cukup besar coba arahkan kembali ke file dan kemudian buka file

Contoh (Anda mungkin harus Ctrl+ Cperintah pertama)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log
Andrea Olivato
sumber
37
Untuk yang malas:lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
itsadok
1
Saya mendapat kesalahan yang sama dan menggunakan ulimit tidak berhasil. Perintah tail -F masih mengembalikan kesalahan. Saya meningkatkan batas dari 1024 menjadi 3000 jadi saya akan membayangkan bahwa saya memiliki cukup ruang pada saat itu ... Saya kira saya harus reboot!
Alexis Wilke
15
Saya menemukan baris itsadok membantu, tetapi saya pikir Anda harus mengurutkan terlebih dahulu (karena uniqhanya bekerja dengan garis yang berdekatan), jalankan uniq, lalu sortir lagi. Jadi lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier
19
Menyortir dan menghitung sebagian besar file yang terbuka jelas merupakan hal terbaik untuk dilakukan. Tampilkan nama proses dan juga pid: '' 'lsof | awk '{print $ 2 "" $ 1; } '| sort -rn | uniq -c | sort -rn | head -20 '' '
gaoithe
2
@gaoithe jika Anda memasukkannya ke dalam jawaban, saya dengan senang hati akan menjawabnya:)
Matt Ball
23

Jika ada orang lain yang membutuhkannya ...

ulimit -a

Akan menampilkan semua batas saat ini. Secara khusus ulimit -n 70000akan menetapkan batas deskriptor file.

Juga...

cat /proc/sys/fs/file-max

Akan menampilkan / mengatur batas kernel jika diedit.

sudo echo 200000 > /proc/sys/fs/file-max

Penjelasan lebih rinci dapat ditemukan di ...

Bagaimana cara meningkatkan batas file terbuka untuk pengguna non-root?

kervin
sumber
3
ulimits ada sehingga Anda dapat tetap mengontrol penggunaan sumber daya di sistem Anda. Cara terbaik untuk meningkatkannya secara individual untuk proses yang Anda tahu perlu menggunakan banyak deskriptor file. Dengan menjaganya tetap ketat dalam pengujian, Anda akan menemukan proses yang mungkin terus membocorkan deskriptor file dari waktu ke waktu. Perhatikan juga bahwa pegangan file digunakan untuk akses perangkat apa pun di unix / linux. misalnya setiap soket jaringan yang terbuka oleh suatu proses menggunakan pegangan file. Itu menjelaskan mengapa Anda dapat menekan "terlalu banyak file terbuka" jika file sistem file biasa serta file perangkat seperti koneksi jaringan.
gaoithe