Inotify saatler dışında olup olmadığımı nasıl anlarım?


47

Inotify saat tüketen bir uygulama kullanıyorum. Ben çoktan ayarladım

fs.inotify.max_user_watches=32768

içinde /etc/sysctl.confben elle ran sürece ancak dün gece uygulamam saatler dışında yaşıyorum şüphelenmeye beni açar, endeksleme durdu.

Bu sayıyı arttırdığımda takas işleminin ne olduğunu bilmediğimden (daha fazla RAM tüketiyor mu?), Bu sayıyı artırmam gerekip gerekmediğini bilmiyorum, bu yüzden bir yol olup olmadığını bilmek istiyorum Tüm bu saatleri kullanıp kullanmadığını ve takasların ne için artırılabileceğini söyleyebilir.


Bu soru, 18.04'te ortaya çıktığı için tekrar oldukça önem kazanmıştır. İnode saatlerinin tükenmesi durumunda ekran kilidinin açılması mümkün değildir.
kasperd

Yanıtlar:


64

Mesai saatleri dışında olup olmadığını nasıl anlarsınız? kuyruk anlatacağım!

  • Başlangıç tailile -fherhangi bir eski dosyada, örneğin üzerinde (gidin) seçeneği tail -f /var/log/dmesg:
    • Her şey yolundaysa, son 10 satırı gösterecek ve duraklatacak; Ctrl-C ile iptal
    • Eğer saatler dışındaysanız, bu biraz şifreli hata ile başarısız olur :
      kuyruk: '/ var / log / dmsg' izleyemiyorum: cihazda boş alan kalmadı

Meraklı için: Kuyruk neden bir " kuyruk "?

  • Aslında, iyi yazılmış herhangi bir uygulamanın size nezaket göstermesi gerekir, çünkü inotify API / çağrıları anlaşmanın ne olduğunu açıkça söyler.
  • strace tail -f ...Bunun yerine deneyin ve başarılı olduğunda, ile biter:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ...) = 1
    
  • Fakat başarısız olursa, yani siz saatler dışındaysanız, şöyle diyecektir:
    inotify_add_watch (4, "/ var / log / dmesg", IN_MODIFY ..)
     = -1 ENOSPC (cihazda yer kalmadı)
    

Saatleri artırabilir misin? Ne kadar? Herhangi bir takas var mı?

Kısa cevap: Elbette, ter yok. İsterseniz, düz bir yarım milyona (524288) gidin ... kullanılan ilave bellek 4GB + bellek içeren modern bir sistemde göz ardı edilebilir olmalıdır .

  • Kullanılan inotify saatlerinin her biri 540 bayt (32 bit sistem) veya 1 kB (çift 64 bit) alıyor [kaynaklar: 1 , 2 ]
  • Bu, çekirdeğin belleğinden çıkarılabilir bir durum değildir.
  • Yani, maksimum değeri 524288 olarak ayarladığınızı ve hepsinin kullanıldığını (imkânsız) kabul edersek, yaklaşık. 256 MB / 512 MB 32 bit / 64 bit çekirdek belleği

    • Uygulamanızın ayrıca inotify tutamaçlarını, dosya / dizin yollarını vb. Takip etmek için ek bellek kullanacağını unutmayın - ne kadar tasarımına bağlı olduğunu.
  • Maksimum değer nedir? Sanırım hiçbiri, teoride, yeterli RAM’in olduğu sürece. Uygulamada, 524288 resmi olarak uygulamalar tarafından önerilmiş ve buna eşlik eden bellek kullanımıyla insanlar bunu 2 milyona ayarlamışlar.


5
Ayrıca, mevcut inotify saatlerinin gerçek sayısını da bilmek istiyorsanız (bu nedenle daha sonra evet / hayır),sudo lsof | grep -i inotify | wc -l
Frank Nocke 14:17

2
"iyi yazılmış uygulama" bağlantısı koptu.
Gaurav Sharma,

11

Bilmiyorum, bu sayıyı arttırmalı mıyım?

max_user_watchesDeğerinize ulaşıp ulaşmadığınızı kontrol etmenin kolay yolu, kullanıcınızla birlikte inotifywatch, paketten kullanmak inotify-toolsve hala bir dosyadan bilgi toplayıp toplayamayacağınızı kontrol etmektir .

Örneğin inotifywatch -v /home/bruno/.profilebenim için döner:

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

Öyleyse inotify, yeni bir saat yaratmada sorun yok, burada sorun yok.

Inotify saatler içindeki maksimum limitinize ulaştıysanız, şöyle bir şey döndürür:

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

Böyle bir şey görürseniz o zaman sınıra ulaştınız ve izin verilen saat sınırını arttırmanız gerekecek.

Daha fazla RAM tüketiyor mu?

Evet öyle. Ancak bu eski makaleye göre, tükettiği miktar çalışan bir masaüstünün diğer yönleriyle karşılaştırıldığında asgari düzeydedir.

--HAFIZA KULLANIMI--

İnotify veri yapıları hafiftir:

inotify watch 40 bayt inotify cihaz 68 bayt inotify olay 272 bayt

Bir cihazın 8192 saati olduğunu varsayarsak, yapılar sadece 320 KB bellek tüketecekler. Bir seferde var olmasına izin verilen maksimum 8 cihaz sayısıyla bu sadece 2,5 MB

Her bir cihaz, bir seferde kuyruğa alınmış, olay başına 68KB olan 256 olay içerebilir. Ve tüm aygıtların açılması ve tam bir olay kuyruğunun olması durumunda sadece .5 MB

Bu nedenle, nadiren açık ve dolu olan her durumda yaklaşık 3 MB bellek kullanılır.

Her inotify saati, bir dizinin / dosyanın inode'unu bellekte işaretler, bir inode'un büyüklüğü her dosya sistemi için farklıdır, ancak bunun 512 bye olduğunu varsayar.

Bu nedenle, maksimum global saat sayısının etkin olduğunu varsayarsak, bu işlem inode önbelleğindeki 32 MB inode değerini azaltacaktır. Yine modern bir sistemde sorun değil.

Elbette, makale yazıldığı için çok fazla değişmediğini farz ediyorum ama rakamlara bakmak endişelenmeyeceğim ve limiti arttırmak RAM tüketimini artırmayacak.


İlgili yazılar inotify


Üzgünüm dostum, dün birkaç saatliğine bir taslak açtım ve cevabımı benimkini göndermeden önce görmedim. İki farklı yaklaşıma sahip olduklarından beri sorun yok :-) Eski çekirdekte, inotify'ın eski bilgilerden beri saat başına 0.5KB (32 bit) veya 1KB (64 bit) çekirdek belleği kullandığını açıklayabilir misiniz? 2005 artık doğru görünmüyor mu?
ish
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.