it-swarm-tr.com

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

Şu anda inotify izleme sınırına ulaşıldığı için kök olarak hata döndüren komutları olan bir linux kutusunda bir sorunla karşı karşıyayım.

# 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, sınırı artırmakla:

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

Ama bu değeri yükseltmenin sonuçları hakkında hiçbir bilgi bulamadım. Sanırım varsayılan çekirdek değeri bir nedenden dolayı ayarlanmış, ancak belirli kullanımlar için yetersiz görünüyor. (ör. Dropbox'ı çok sayıda klasörle veya çok sayıda dosyayı izleyen bir yazılımla 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ış olan saatlerin ne olduğunu ve hangi işlemin, ulaşılan sınıra hatalı bir yazılımdan kaynaklanıp kaynaklanmadığını belirleyebilmek için ayarlanmasının bir yolu var mı?
221
Ultraspider

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

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

  • Her kullanılmış inotify saat 540 bayt (32 bit sistem) veya 1 kB (çift - 64 bit) alır [kaynaklar: 1 , 2 ]
  • Bu, çekirdek belleği 'dan çıkar, ki bu da silinemez.
  • Maks. 524288 olarak ayarlandığını ve tümünün kullanıldığını (olanaksız) varsayarsak, yaklaşık 256 MB/512 MB 32 bit/64 bit çekirdek belleği kullanırsınız.
    • Uygulamanızın inotify tutamaçlarını, dosya/dizin yollarını vb. İzlemek için ek bellek kullanacağını unutmayın - tasarımına ne kadar bağlıdır.

Maksimum inotify saat sayısını kontrol etmek için:

cat /proc/sys/fs/inotify/max_user_watches

Maksimum inotify saati sayısını ayarlamak için

Geçici:

  • Sonunda tercih ettiğiniz değerle Sudo sysctl fs.inotify.max_user_watches= Çalıştırın.

Kalıcı olarak ( daha ayrıntılı bilgi ):

  • sysctl ayarlarınıza fs.inotify.max_user_watches=524288 ekleyin. Sisteminize bağlı olarak, aşağıdaki yerlerden birinde olabilirler:
    • Debian/RedHat: /etc/sysctl.conf
    • Arch: /etc/sysctl.d/ İçine yeni bir dosya koyun, ör. /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:

Eski bir dosyada -f (Takip et) seçeneğiyle tail kullanın, ör. tail -f /var/log/dmesg: - Her şey yolundaysa, son 10 satırı gösterir ve duraklar; Ctrl-C ile iptal - Eğer saatler dışındaysanız , bu başarısız olur biraz şifreli hata :

tail: '/ var/log/dmsg' izleyemiyor: Cihazda boşluk kalmadı

İnotify saatlerini nelerin 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ını değil) gösterir ve ikinci sütun o sürecin PID'sini gösterir [kaynaklar: 1 , 2 ].

294
tshepang