Ядро ініціює досягнуту межу перегляду


206

В даний час я стикаюся з проблемою у вікні linux, де в якості root у мене є команди повернення помилки, оскільки досягнуто обмеження перегляду.

# 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'.` 

Я трохи погуглився, і кожне знайдене нами рішення - збільшити ліміт за допомогою:

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

Але мені не вдалося знайти жодної інформації про наслідки підвищення цієї цінності. Я думаю, що значення ядра за замовчуванням було встановлено з причини, але воно здається недостатнім для конкретних звичаїв. (наприклад, при використанні Dropbox з великою кількістю папок або програмного забезпечення, яке контролює безліч файлів)

Тож ось мої запитання:

  • Чи безпечно підвищувати цю цінність і якими були б наслідки занадто високої вартості?
  • Чи є спосіб дізнатись, що таке встановлені на даний момент годинники та який процес встановив їх, щоб можна було визначити, чи досягнута межа не викликана несправним програмним забезпеченням?

Ви, мабуть, перевірили це до цього часу, оскільки це вже 8 місяців, але ваш накопичувач повний? "хвіст: не можу дивитися" / var / log / messages ": На пристрої не залишилось місця"
froggythefrog

Відповіді:


273

Чи безпечно підвищувати цю цінність і якими були б наслідки занадто високої вартості?

Так, можна підвищити це значення і нижче можливі витрати [ джерело ]:

  • Кожен використаний годинник inotify займає 540 байт (32-бітова система) або 1 кБ (подвійний - на 64-бітній) [джерела: 1 , 2 ]
  • Це виходить з пам’яті ядра , яке неможливо замінити.
  • Якщо припустити, що ви встановили максимум на 524288, і всі вони були використані (малоймовірно), ви б використовували приблизно 256 МБ / 512 МБ 32-бітної / 64-бітної пам'яті ядра.
    • Зауважте, що ваша програма також використовуватиме додаткову пам'ять для відстеження ручок, що ініціюють, шляхів до файлів / каталогів тощо - скільки залежить від його дизайну.

Щоб перевірити максимальну кількість інотифікованих годин:

cat /proc/sys/fs/inotify/max_user_watches

Щоб встановити максимальну кількість годин, що ініціюються

Тимчасово:

  • Виконайте sudo sysctl fs.inotify.max_user_watches=бажане значення в кінці.

Постійно ( більш детальна інформація ):

  • поставити fs.inotify.max_user_watches=524288у свої налаштування sysctl. Залежно від вашої системи вони можуть знаходитися в одному з наступних місць:
    • Debian / RedHat: /etc/sysctl.conf
    • Arch: помістіть новий файл /etc/sysctl.d/, наприклад/etc/sysctl.d/40-max-user-watches.conf
  • ви можете перезавантажити параметри sysctl, щоб уникнути перезавантаження: sysctl -p(Debian / RedHat) або sysctl --system(Arch)

Перевірте, чи досягнуто максимальної кількості інотифікованих годин:

Використовуйте tailпараметр -f(follow) на будь-якому старому файлі, наприклад tail -f /var/log/dmesg: - Якщо все добре, він відобразить останні 10 рядків і призупинить; перервати з Ctrl-C - якщо у вас немає годин , це не вдасться із цією явною помилкою :

хвіст: не можу дивитися '/ var / log / dmsg': на пристрої не залишилось місця

Щоб побачити, чим користуються годинники, що не застосовуються

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

Перший стовпець вказує кількість інотифікованих fds (не кількість годин, хоча), а другий показує PID цього процесу [джерела: 1 , 2 ].


3
I guess very few codes need the values higher than the defaultDropbox може вимагати більш високого обмеження, залежно від того, скільки файлів у вас є. Я підняв мою без проблем. насправді сповіщення про випускну скриньку (яке відбувається, коли вона досягає своєї межі) явно пропонує вам підняти її.
Фальмарі

1
@ ultrasawblade- inotify замінено dnotify. dnotify був повільним і глючним. inotify може використовуватися в каталогах, і каталог буде "змінено", коли один з файлів у цьому каталозі (глибина одного рівня) буде змінено. Довідники - це все-таки файли.
битгаміт

6
"Постійно: замініть значення в / proc / sys / fs / inotify / max_user_watches" <- це невірно. Щоб зробити це постійним, вам потрібно змінити/etc/sysctl.conf
Merc

3
sysctl! = systemd, у вашому поясненні. А /etc/sysctl.dтакож працює над новішими системами на базі RedHat.
aairey

1
@stackexchanger, якщо ви впевнені, що вони подібні (наприклад, ви протестували), будь ласка, надішліть і відредагуйте Запитання. Я сам не перевіряв, і я знаю, що дистрибутив має тенденцію до виправлення пакетів, тому поведінка може бути різною для одних і тих же пакетів. Це не кажучи вже про відмінності у версіях пакетів.
thepang
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.