alternatif non-cpu-intensif untuk lsof?

12

Kami menjalankan gugus Apache Cassandra di mana setiap host memiliki beberapa ratus ribu file yang dibuka pada waktu tertentu.

Kami ingin dapat memperoleh jumlah file yang terbuka secara berkala dan memasukkan angka ini ke dalam grafit , tetapi ketika kami berjalan di lsofbawah collectd, itu berakhir membutuhkan waktu beberapa menit untuk menyelesaikan dan mengunyah jumlah CPU yang tidak terkendali sementara itu .

Saya bertanya-tanya apakah ada cara alternatif dan lebih ramah untuk mendapatkan data yang sama yang disediakan oleh lsof, atau bahkan cara menjalankan lsof yang tidak akan memakan CPU secara mencolok? (Meskipun saya berasumsi metode terakhir ini mungkin akan membutuhkan waktu lebih lama untuk menyelesaikan daripada yang saat ini ... tidak ideal).

Mungkin kernel mempertahankan beberapa variabel di suatu tempat yang berisi jumlah file yang terbuka? Angan-angan?

Memperbarui:

Sebagai tanggapan terhadap salah satu jawaban, kami sudah menggunakan -bdan -nflag. Inilah perintah lengkapnya karena saya menjalankannya di bawah collectd:

sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l
Michael Martinez
sumber

Jawaban:

12

Anda mungkin tidak perlu menyelesaikan alamat jaringan untuk soket, jadi paling tidak gunakan -nsakelar. Maka Anda mungkin juga ingin melewatkan operasi pemblokiran -b.

2 sakelar pertama ini harus benar-benar membuatnya lebih cepat.

Dan kemudian -luntuk menghindari penyelesaian uids. Dan -Luntuk menghindari penghitungan tautan. Dll. Lihat pria lsof .

Atau, dengan Linux, Anda dapat membuat skrip untuk menghitung tautan di bawah /proc/<PID>/fdseperti ini:

find /proc -mindepth 3 -maxdepth 3 -type l | awk -F/ '$4 == "fd" { s++ } END { print s }'

Benoît
sumber
Saya selalu dapat - menemukan: /proc/{{number}}/fd/5': No such file or directory find: / proc / {{number}} / fdinfo / 5 ': Tidak ada file atau direktori seperti itu - Q @ Benoît bagaimana saya bisa menghindarinya?
BG Bruno
2
@ BrunoBG: coba:echo /proc/*/fd/* | wc -w
Olivier Dulac
Thx @OlivierDulac yang jelas :-)
BG Bruno
saran yang bagus, tetapi sudah menggunakan opsi -n dan -b .... Saya perlu lebih banyak saran
Michael Martinez
1
@OlivierDulac mungkin tidak berfungsi jika Anda memiliki fd dalam jumlah yang sangat besar.
Benoît
5

Kamu melakukannya dengan salah.

Dari man proc

   /proc/sys/fs/file-nr

File ini (hanya baca) berisi tiga angka: jumlah pegangan file yang dialokasikan (yaitu, jumlah file yang dibuka saat ini); jumlah pegangan file gratis; dan jumlah maksimum menangani file (yaitu, nilai yang sama dengan / proc / sys / fs / file-max). Jika jumlah pegangan file yang dialokasikan mendekati maksimum, Anda harus mempertimbangkan untuk meningkatkan maksimum. Sebelum Linux 2.6, file yang dialokasikan kernel menangani secara dinamis, tetapi tidak membebaskannya lagi. Sebaliknya pegangan file gratis disimpan dalam daftar untuk realokasi; nilai "pegangan file bebas" menunjukkan ukuran daftar itu. Sejumlah besar pegangan file gratis menunjukkan bahwa ada puncak masa lalu dalam penggunaan pegangan file terbuka. Sejak Linux 2.6, kernel melakukan deallocate menangani file yang dibebaskan, dan "

Nilai pertama jika Anda kucing yang memberi Anda apa yang Anda inginkan akan muncul.

Sebagai catatan saya tidak bisa mendapatkan lsofoutput untuk mencocokkan bahkan dengan sejumlah fudging tapi saya kumpulkan kalau itu yang dikatakan kernel lebih otoritatif daripada daftar yang Anda dapatkan lsof.

Matthew Ife
sumber
1
Berikut adalah output lsof saya: [root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065. Berikut adalah apa yang berkas-nr mengatakan: [root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428. Perbedaan besar (1.000.000+ versus 2784) disebabkan oleh fakta yang lsofmencakup semua hal yang tidak memiliki deskriptor file yang terkait dengannya: file perpustakaan, file yang dapat dieksekusi, dll. Jadi, jika Anda hanya tertarik pada deskriptor file, maka file-nradalah cara untuk pergi, jika tidak, Anda perlu lsof atau setara.
Michael Martinez
Coba inode-nralih-alih di lokasi yang sama.
Matthew Ife