Çekirdek inotify saat sınırına ulaşıldı


206

Şu anda, kök olarak komutları geri döndürme komutları bulunduğundan, inotify saat sınırına ulaşıldığından dolayı bir linux kutusunda sorun yaşıyorum.

# tail -f /var/log/messages
[...]
tail: cannot watch '/var/log/messages': No space left on device
# inotifywatch -v /var/log/messages
Establishing watches...
Failed to watch /var/log/messages; upper limit on inotify watches reached!
Please increase the amount of inotify watches allowed per user via '/proc/sys/fs/inotify/max_user_watches'.` 

Biraz googledim ve bulduğum her çözüm limiti yükseltmek için:

sudo sysctl fs.inotify.max_user_watches=<some random high number>

Ancak bu değeri arttırmanın sonuçlarına dair herhangi bir bilgi bulamadım. Sanırım varsayılan çekirdek değeri bir nedenden dolayı ayarlandı, ancak belirli kullanımlar için yetersiz görünüyor. (örneğin, çok fazla sayıda klasör içeren Dropbox veya çok fazla dosyayı izleyen yazılım kullanırken)

Sorularım işte burada:

  • Bu değeri yükseltmek güvenli midir ve çok yüksek bir değerin sonuçları ne olur?
  • Halihazırda ayarlanmış saatlerin hangileri olduğunu ve ulaşılan limitin hatalı bir yazılımdan kaynaklanıp kaynaklanmadığını belirleyebilmek için hangi süreci ayarlayabileceklerini bulmanın bir yolu var mı?

Muhtemelen bunu 8 aylık olduğundan bu yana kontrol ettiniz, ancak sürücünüz dolu mu? "tail: '/ var / log / messages' izleyemiyorum: cihazda yer kalmadı"
froggythefrog

Yanıtlar:


273

Bu değeri yükseltmek güvenli midir ve çok yüksek bir değerin sonuçları ne olur?

Evet, bu değeri yükseltmek güvenlidir ve aşağıda muhtemel maliyetler [ kaynak ]:

  • 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.
  • Maksimum değeri 524288 olarak ayarladığınızı ve hepsinin kullanıldığını (olanaksız) kabul edersek, yaklaşık 256 MB / 512 MB 32 bit / 64 bit çekirdek belleği kullanırsınız.
    • 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.

Inotify saatlerinin maksimum sayısını kontrol etmek için:

cat /proc/sys/fs/inotify/max_user_watches

Inotify saatlerinin maksimum sayısını ayarlamak için

Geçici:

  • sudo sysctl fs.inotify.max_user_watches=Sonunda tercih ettiğiniz değerle koşun .

Kalıcı ( daha detaylı bilgi ):

  • fs.inotify.max_user_watches=524288Sysctl ayarlarına koymak . Sisteminize bağlı olarak, aşağıdaki yerlerden birinde olabilirler:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: /etc/sysctl.d/örneğin yeni bir dosya yerleştirin/etc/sysctl.d/40-max-user-watches.conf
  • Yeniden başlatmayı önlemek için sysctl ayarlarını yeniden yüklemek isteyebilirsiniz: sysctl -p(Debian / RedHat) veya sysctl --system(Arch)

Maksimum inotify saat sayısına ulaşılıp ulaşılmadığını kontrol edin:

Kullanım tailile -f, örneğin herhangi bir eski dosya üzerinde (gidin) seçeneği tail -f /var/log/dmesg, tüm iyi ise, son 10 satırları göstermek ve duraklar: - Ctrl-C ile iptal - Eğer sen saatler dışında , bu başarısız olur biraz şifreli hata :

kuyruk: '/ var / log / dmsg' izleyemiyorum: cihazda boş alan kalmadı

Ne inotify saatlerini kullandığını görmek için

find /proc/*/fd -lname anon_inode:inotify |
   cut -d/ -f3 |
   xargs -I '{}' -- ps --no-headers -o '%p %U %c' -p '{}' |
   uniq -c |
   sort -nr

İlk sütun inotify fds sayısını (saat sayısı değil) gösterir ve ikincisi bu işlemin PID'sini gösterir [kaynaklar: 1 , 2 ].


3
I guess very few codes need the values higher than the defaultDropbox, sahip olduğunuz dosya sayısına bağlı olarak daha yüksek bir limit gerektirebilir. Iv'e hiç sorun yaşmadan mayını büyüttü. Aslında, dropbox bildirimi (sınırına ulaştığında gerçekleşir) açıkça yükseltmenizi söyler.
Falmarri

1
@ ultrasawblade- inotify değiştirilemedi. Dnotify yavaş ve arabasıydı. inotify dizinlerde kullanılabilir ve bu dizindeki dosyalardan biri (bir seviye derinliğinde) değiştirildiğinde bir dizin "değiştirilir". Dizinler zaten sadece dosyalardır.
beatgammit

6
"Kalıcı olarak: / proc / sys / fs / inotify / max_user_watches içindeki değeri değiştir" <- bu yanlış. Bunu kalıcı hale getirmek için değiştirmeniz gerekir/etc/sysctl.conf
Merc

3
sysctl! = systemd, açıklamasında. Ayrıca /etc/sysctl.dyeni RedHat tabanlı sistemler üzerinde de çalışır.
aairey

1
@stackexchanger benzer olduklarından eminseniz (örneğin test ettiniz), o zaman lütfen Soruyu gönderin ve düzenleyin. Ben kendim kontrol etmedim ve dağıtımların paketleri düzeltme eğiliminde olduğunu biliyorum, bu nedenle davranış aynı paketler için farklı olabilir. Bu, paket versiyonlarındaki farklılıklardan da bahsetmiyor.
tshepang
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.