CPU'ya yoğun olmayan bir alternatif mi?


12

Her ana makinenin herhangi bir zamanda birkaç yüz bin dosyanın açık olduğu bir Apache Cassandra kümesi çalıştırıyoruz .

Periyodik aralıklarla bir dizi açık dosya almak ve bu sayıyı grafite beslemek istiyoruz , ancak lsofaltında collectdkoştuğumuzda, bu arada olağanüstü miktarda CPU'yu tamamlamak ve çiğnemek birkaç dakika sürüyor .

Ben lsof sağladığı aynı verileri elde etmek için alternatif ve daha kolay bir yol, ya da hatta farkedilir derecede CPU yemek olmaz lsof çalıştırmak için bir yol olup olmadığını merak ediyorum? (Her ne kadar bu ikinci yöntemin tamamlanması şu anda olduğundan çok daha uzun süreceğini varsaysam da ... ideal değil).

Belki de çekirdek, açık dosya sayısını içeren bir yerde bazı değişkenleri korur? Hüsn-ü kuruntu?

Güncelleme:

Yanıtlardan birine yanıt olarak, -bve -nbayraklarını zaten kullanıyoruz . İşte tam komut altında çalışan var collectd:

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

Yanıtlar:


12

Büyük olasılıkla soketin ağ adreslerini çözmeniz gerekmez, bu nedenle en azından -nanahtarı kullanın . Sonra da ile engelleme işlemleri atlamak isteyebilirsiniz -b.

Bu ilk 2 anahtar gerçekten daha hızlı hale getirmelidir.

Ve sonra -luids çözmekten kaçının. Ve -Lbağlantıları saymamak için. Vb bakın adam lsof .

Alternatif olarak, Linux ile aşağıdaki /proc/<PID>/fdgibi bağlantıları saymak için bir komut dosyası oluşturabilirsiniz :

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


Her zaman get - find: /proc/{{number}}/fd/5': No such file or directory find: / proc / {{number}} / fdinfo / 5 ': Böyle bir dosya veya dizin yok - Q @ Benoît Bunu nasıl önleyebilirim?
BG Bruno

2
@BrunoBG: dene:echo /proc/*/fd/* | wc -w
Olivier Dulac

Thx @OlivierDulac bariz biriydi :-)
BG Bruno

iyi öneriler, ama zaten -n ve -b seçeneklerini kullanıyor .... Daha fazla öneriye ihtiyacım var
Michael Martinez

1
Çok sayıda fd'niz varsa @OlivierDulac çalışmayabilir.
Benoît

5

Yanlış yapıyorsun.

itibaren man proc

   /proc/sys/fs/file-nr

Bu (salt okunur) dosya üç sayı içerir: ayrılan dosya tanıtıcılarının sayısı (yani, şu anda açılmış olan dosya sayısı); boş dosya tanıtıcılarının sayısı; ve maksimum dosya tanıtıcısı sayısı (yani, / proc / sys / fs / file-max ile aynı değer). Ayrılan dosya tanıtıcılarının sayısı maksimuma yakınsa maksimumu artırmayı düşünmelisiniz. Linux 2.6'dan önce, çekirdek tahsis edilen dosya dinamik olarak işliyor, ancak onları tekrar serbest bırakmadı. Bunun yerine, serbest dosya tanıtıcıları yeniden tahsis için bir listede tutuldu; "boş dosya tanıtıcıları" değeri bu listenin boyutunu gösterir. Çok sayıda serbest dosya tanıtıcısı, açık dosya tanıtıcılarının kullanımında geçmişte bir zirve olduğunu gösterir. Linux 2.6'dan bu yana çekirdek, serbest bırakılmış dosya tanıtıcılarını serbest bırakıyor ve "

Eğer kedi sonra tam olarak ne olduğunu veren kedi eğer ilk değer görünecektir.

Kayıt için ben lsofbile bir miktar şekerleme ile eşleştirmek için çıkış alamadım ama çekirdek lsofzaten söylediklerini listeden daha otoriter söylerse bu toplamak .


1
İşte benim lsof çıktısı: [root@ec2- cassandra101 ~]$ time lsof -b -n -w -l -L | stdbuf -i0 -o0 -e0 wc -l 1018065. İşte dosya nr söylenenler: [root@ec2- cassandra101 ~]$ cat /proc/sys/fs/file-nr 2784 0 3093428. Büyük tutarsızlık (27.000'e karşı 1.000.000+), lsofkendileriyle ilişkili bir dosya tanımlayıcıya sahip olmayan her şeyi içeren gerçeğinden kaynaklanmaktadır : kütüphane dosyaları, münhasırlar, vb. Yani, sadece dosya tanımlayıcılarıyla ilgileniyorsanız, o zaman file-nrgitmek için yoldur, aksi takdirde lsof veya eşdeğeri gerekir.
Michael Martinez

inode-nrBunun yerine aynı yerde deneyin .
Matthew Ife
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.