Назад | Перейти на главную страницу

Сервер NFS и задержка использования tail -f?

У нас есть два сервера Solaris, назовем их Алиса и Боб.

У нас также есть NFS-сервер Solaris, используемый ими обоими, назовем его Чарли.

Алиса записывает в текстовый файл журнала на сервере NFS, который затем читается Бобом, который воздействует на события в этом файле журнала.

Проблема, с которой мы сталкиваемся, заключается в том, что Боб видит обновления файла от Алисы с некоторой задержкой.

Для тестирования я запустил на Алисе:

while [ 0 ]; do echo `date` | tee -a dummy_logfile; sleep 1; done

Это просто записывает вывод из date каждую секунду в текстовый файл, который хранится на сервере NFS.

Что касается Боба, я делаю:

tail -f dummy_logfile

Я заметил, что Боб видит события с задержкой примерно на 3 секунды. Команда tail -f отобразит лог-строку, затем сделает паузу примерно на 3 секунды, затем выдаст 3-секундные строки журнала, затем еще 3 секунды ничего, затем выдает другой набор и т. Д.

Однако, если на Бобе я делаю:

while [ 0 ]; do cat dummy_logfile ; sleep 1; done

Он мгновенно повторяет каждую строку в dummy_logfile.

Так похоже tail -f чтение общего ресурса NFS задерживается, но чтение кота через общий ресурс NFS - нет. У меня создалось впечатление, что tail -f было почти мгновенно.

Есть ли что-нибудь во взаимодействии NFS, буферов, кеша и т.д., что могло бы объяснить такое поведение? Каждая кошка как-то форсирует обновление или что-то в этом роде?

Кроме того, делая tail -f на Алисе (сервер, генерирующий файл dummy_logfile) кажется почти мгновенным, так что это не похоже на проблему с tail -f сам.

Ура, Виктор

Я считаю, что tail -f смотрит на атрибуты файла, чтобы определить точку EOF, но атрибуты обычно кэшируются в течение определенного времени в NFS. cat просто передает все байты.

Смонтируйте NFS с опцией «noac». Это отключит кеширование всех атрибутов. По умолчанию атрибуты кэшируются как минимум на 3 секунды, что по совпадению является именно тем, насколько длительной кажется ваша задержка. Вы можете изменить параметр acregmin = x, чтобы установить это значение ниже, но, похоже, вы хотите полностью отключить кеширование.

Предупреждение: это, вероятно, снизит производительность, если вы используете общий ресурс NFS для чего-либо еще.

Дополнительная информация о NFS на странице руководства здесь: http://linux.die.net/man/5/nfs