Неожиданно истекают тайники NFS

молодцы!

Я изо дня в день боролся с этой проблемой, поэтому я надеялся, что кто-то любезно предоставит мне руку здесь.

Цель: создать установку NFS4 + CacheFilesd с высокой задержкой, с низкой пропускной способностью, где локальные кеши никогда не истекают. Единственной семантикой недействительности должны быть обратные вызовы сервера NFS, когда что-то обновляется (что отлично работает, кстати, изменения в файлах сервера мгновенно передаются клиенту). Это крепление доступно только для чтения, поэтому никаких замков нет.

Проблема. Несмотря на то, что он всегда корректно считывает запрошенный файл из локального кеша, он продолжает извлекать атрибуты файлов, если у них не было доступа за последние 60 секунд или около того независимо от установленного actimeo = 86400. Кажется, что это связано с тем, как часто файл открывается, так как он отлично работает, пока я продолжаю открывать его каждые 50 секунд или меньше.

Доказательство концепции:

(Задержка сети сервера искусственно установлена ​​на 2000 мс, поэтому я могу четко определить, когда выполняется проверка атрибута)

Подождите 50 секунд после того, как каждый запрос даст 100% -ный кеш-хит, как предполагалось. Это будет продолжаться бесконечно:

root@client:~# while : ; do /usr/bin/time -f%e cat /nfs-mount/2bytes-file > /dev/null ; sleep 50 ; done 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 

Теперь, устанавливая задержку между запросами до 70 секунд, посмотрите, как непоследовательный результат:

 root@client:~# while : ; do /usr/bin/time -f%e cat /nfs-mount/2bytes-file > /dev/null ; sleep 70 ; done 0.00 0.00 0.00 0.00 0.00 0.00 6.00 # <- Attributes fetched. Debug log recorded "NFS: nfs_update_inode(0:69/68697599 fh_crc=0xb9b7a69e ct=2 info=0x26040)" 4.00 # <- Attributes fetched. Debug log recorded "NFS: nfs_update_inode(0:69/68697599 fh_crc=0xb9b7a69e ct=2 info=0x26040)" 0.00 0.00 0.00 6.00 # <- Attributes fetched. Debug log recorded "NFS: nfs_update_inode(0:69/68697599 fh_crc=0xb9b7a69e ct=2 info=0x26040)" 4.00 # <- Attributes fetched. Debug log recorded "NFS: nfs_update_inode(0:69/68697599 fh_crc=0xb9b7a69e ct=2 info=0x26040)" 0.00 0.00 0.00 

Кроме того, nfsstats добавляет дополнительные «getattr», когда эти задержки происходят:

 create delegpurge delegreturn getattr getfh link 2 0% 0 0% 82 0% 177063 10% 87644 5% 0 0% 

И, наконец, когда задержка установлена ​​на 110 секунд или более, каждый отдельный запрос заканчивается тем, что по какой-то причине проверяется на сервере:

 root@client:~# while : ; do /usr/bin/time -f%e cat /nfs-mount/2bytes-file > /dev/null ; sleep 110 ; done 6.00 6.00 6.00 6.00 6.00 6.00 6.00 

Мне удалось воспроизвести одно и то же поведение, слушая этот 2-байтовый файл через HTTP с помощью nginx вместо «cat» и «ioping».

Cachefiled не очищает что-либо самостоятельно, поскольку в его разделе более чем достаточно места:

 /dev/vdb 20G 3,0G 16G 17% /disk2/fscache 

Я знаю, что это касается только метаданных файлов, а не самого содержимого, потому что, когда я выполняю тот же тест с файлом 2 ГБ (который больше, чем размер физической памяти клиента), он зависает в течение 2 секунд (установленная сеть задержка ), а затем он начинает считывать локально кэшированный файл Cachefilesd с диска, как ожидалось.

Я действительно не понимаю, что происходит в течение этих 1-2 минут, что заставляет клиента перепроверить с сервером обновления, и это убивает цель моей установки.

/ и т.д. / экспорта:

 /cache 192.168.122.234(ro,async,no_subtree_check) 

Крепление клиента:

 root@client:~# mount -t nfs4 -o lookupcache=all,actimeo=86400,nocto,ro,intr,soft,proto=tcp,async,fsc 192.168.122.1:/cache /nfs-mount root@client:~# cat /proc/mounts | grep nfs 192.168.122.1:/cache /nfs-mount nfs4 ro,relatime,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,acregmin=86400,acregmax=86400,acdirmin=86400,acdirmax=86400,soft,nocto,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.122.234,fsc,local_lock=none,addr=192.168.122.1 0 0 

Сервер Centos 7, клиент Ubuntu 16.04. Пакеты получают из репозиториев дистрибутива.

root @ client: ~ # dpkg -l | grep nfs ii libnfsidmap2: amd64 0.25-5 amd64 Библиотека idmapping для NFS ii nfs-common 1: 1.2.8-9ubuntu12 amd64 Файлы поддержки NFS, общие для клиента и сервера ii nfs4-acl-tools 0.3.3-3 amd64 Утилиты командной строки и GUI ACL для клиента NFSv4

Я также попытался использовать Ubuntu в качестве сервера и CentOS 7 в качестве клиента безрезультатно.

Любое понимание в этом отношении очень ценится. Большое спасибо!

  • Linux: разница между использованием autofs с NFS и использованием fstab
  • Каковы последствия запуска исполняемых файлов над NFS?
  • Сделать суперпользователь действовать как какой-либо другой пользователь в определенном дереве каталогов
  • Как монтировать общие ресурсы NFS через / etc / fstab - доступ, запрещенный сервером при установке
  • Как настроить разные разрешения на родительскую / подпапку, используя обмен файлами FreeBSD / NFS?
  • Вложенные монтируемые nfs отказываются на стороне клиента
  • NFS-файл блокировки не работает, я не понимаю?
  • Не удается установить параметр «-o remount» на общем ресурсе NFS для работы в Slackware 13.1
  • Сквош все UID автоматически, без "all_squash"
  • Ошибка при установке каталога с хоста через NFS
  • Не удалось подключить root fs через NFS
  • Linux и Unix - лучшая ОС в мире.