caches NFS que expiram inesperadamente

2

companheiros!

Eu tenho lutado com esse desafio o dia todo agora, então eu esperava que alguém pudesse gentilmente me ajudar aqui.

Meta: Para criar uma configuração NFS4 + CacheFilesd em um link de alta latência e baixo rendimento, em que os caches locais nunca expiram. A única semântica de invalidação deve ser os retornos de chamada do Servidor NFS quando algo é atualizado (o que está funcionando bem, a propósito, as alterações nos arquivos do servidor são repassadas instantaneamente para o cliente). Essa montagem é somente leitura, portanto, não há bloqueios.

O problema: Mesmo que ele sempre leia corretamente o arquivo solicitado do cache local, ele continua buscando os atributos dos arquivos se ele não tiver sido acessado nos últimos 60 segundos, independentemente de actimeo = 86400 sendo definido. Parece ter algo a ver com a frequência com que o arquivo é aberto, já que funciona perfeitamente enquanto eu o abro a cada 50 segundos ou menos.

Prova de conceito:

(A latência de rede do servidor é artificialmente configurada para 2000 ms para que eu possa identificar claramente quando a verificação de atributos está sendo realizada)

Aguarde 50 segundos após cada solicitação gerar 100% de acertos do cache como pretendido. Isso continuará indefinidamente:

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

Agora, definindo o atraso entre as solicitações para 70 segundos, veja como o resultado é inconsistente:

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

Além disso, o nfsstats adiciona um "getattr" extra quando esses atrasos ocorrem:

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

E, finalmente, quando o atraso é definido para 110 segundos ou mais, todas as solicitações acabam sendo verificadas no servidor por algum motivo:

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

Eu consegui reproduzir o mesmo comportamento, servindo esse arquivo de 2 bytes de comprimento via HTTP com nginx ao invés de "cat" e através de "ioping" também.

O cachefiled não está limpando nada por conta própria, já que há espaço suficiente em sua partição:

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

Eu sei que é apenas alcançar os metadados dos arquivos e não o conteúdo em si, porque quando executo o mesmo teste em um arquivo de 2 GB (que é mais do que o tamanho da memória física do cliente), ele fica pendurado por 2 segundos rede estabelecida atraso) e, em seguida, ele começa a ler o cachefilesd localmente em cache arquivo do disco conforme o esperado.

Eu realmente não entendo o que está acontecendo durante esses 1-2 minutos que faz com que o cliente verifique novamente com o servidor para atualizações, e isso elimina o propósito da minha configuração.

/ etc / exports:

/cache 192.168.122.234(ro,async,no_subtree_check)

Montagem do cliente:

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

O servidor é o Centos 7, o cliente é o Ubuntu 16.04. Os pacotes são obtidos a partir dos repositórios da distro.

root @ client: ~ # dpkg -l | grep nfs ii libnfsidmap2: amd64 0.25-5 amd64 Biblioteca de idmapping do NFS ii nfs-common 1: 1.2.8-9ubuntu12 amd64 Arquivos de suporte a NFS comuns ao cliente e servidor ii nfs4-acl-tools 0.3.3-3 amd64 Utilitários de linha de comandos e GUI ACL para o cliente NFSv4

Eu também tentei usar o Ubuntu como servidor e o CentOS 7 como cliente sem sucesso.

Qualquer insight sobre esse assunto é muito apreciado. Muito obrigada!

    
por G.Ashburn 03.09.2016 / 13:29

0 respostas