Por que as ordens de grandeza 'zfs list -t snapshot' são mais lentas do que 'ls .zfs / snapshot'?

5

Com todas as versões do ZFS no Linux que já experimentei, usar zfs list para listar todas as capturas instantâneas de um sistema de arquivos ou volum ( zfs list -r -t snapshot -H -o name pool/filesystem ) sempre leva muito mais tempo do que ls .zfs/snapshot , o que é imediato:

$ time ls -1 /srv/vz/subvol-300-disk-1/.zfs/snapshot
[list of 1797 snapshots here]
real    0m0.023s
user    0m0.008s
sys     0m0.014s

# time zfs list -r -t snapshot -H -o name vz/subvol-300-disk-1
[same list of 1797 snapshots]
real    1m23.092s
user    0m0.110s
sys     0m0.758s

Este bug é específico para o ZFS-on-Linux?

Alguém com uma caixa Solaris ou FreeBSD ZFS pode realizar um teste semelhante (em um sistema de arquivos com centenas de snapshots em discos rígidos giratórios)?

Existe uma solução alternativa para obter uma lista rápida de instantâneos para um volume , que por natureza não tem um diretório .zfs ?

Eu executei o teste acima com o ZFS-on-Linux 0.6.5.2-2-wheezy no kernel 2.6.32-43-pve x86_64 (Proxmox), mas eu sempre vi esse problema, tanto em antigos quanto nos mais recentes Versões do ZFS e do kernel.

Aqui estão as estatísticas do pool:

# zpool list
NAME   SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
vz    25.2T  9.42T  15.8T         -     5%    37%  1.00x  ONLINE  -

Ele contém 114 sistemas de arquivos e 1 volume, cada um com centenas de instantâneos, pois é um servidor de backup zfs send / zfs recv .

Solução: zfs list é lento porque busca informações adicionais, mesmo que não sejam exibidas. A solução é adicionar -o name -s name , isto é, usar zfs list -t snapshot -o name -s name

    
por Tobia 23.08.2016 / 11:14

2 respostas

1

As operações de instantâneos são uma função do número de instantâneos que você tem, RAM, desempenho de disco e espaço em disco. Este seria um problema geral do ZFS , não algo exclusivo da variante do Linux.

A melhor pergunta é: Por que você tem 1797 instantâneos de um zvol? Isso definitivamente é mais do que o recomendado e me faz pensar no que mais está acontecendo no sistema. / p>

As pessoas dizem que "os instantâneos do ZFS são gratuitos", mas isso nem sempre é verdade.

Embora os snaps do ZFS não tenham um impacto no desempenho produção , o número alto que você precisa claramente requer que os acessos ao disco enumerem.

Disk access time > RAM access time , daí a diferença de ordem de magnitude.

strace output. Observe o tempo por syscall e imagine como ele seria escalonado com o número de snapshots em seu sistema de arquivos.

# strace -c ls /ppro/.zfs/snapshot

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0        10           read
  0.00    0.000000           0        17           write
  0.00    0.000000           0        12           open
  0.00    0.000000           0        14           close
  0.00    0.000000           0         1           stat
  0.00    0.000000           0        12           fstat
  0.00    0.000000           0        28           mmap
  0.00    0.000000           0        16           mprotect
  0.00    0.000000           0         3           munmap
  0.00    0.000000           0         3           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         2           ioctl
  0.00    0.000000           0         1         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           fcntl
  0.00    0.000000           0         2           getdents
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0         1           statfs
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         2         1 futex
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.000000                   133         2 total

versus

# strace -c zfs list -t snapshot

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00    0.003637          60        61         7 ioctl
  0.00    0.000000           0        12           read
  0.00    0.000000           0        50           write
  0.00    0.000000           0        19           open
  0.00    0.000000           0        19           close
  0.00    0.000000           0        15           fstat
  0.00    0.000000           0        37           mmap
  0.00    0.000000           0        19           mprotect
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         4           brk
  0.00    0.000000           0         2           rt_sigaction
  0.00    0.000000           0         1           rt_sigprocmask
  0.00    0.000000           0         3         1 access
  0.00    0.000000           0         1           execve
  0.00    0.000000           0         1           getrlimit
  0.00    0.000000           0         1           arch_prctl
  0.00    0.000000           0         2         1 futex
  0.00    0.000000           0         1           set_tid_address
  0.00    0.000000           0         1           set_robust_list
------ ----------- ----------- --------- --------- ----------------
100.00    0.003637                   250         9 total
    
por 23.08.2016 / 11:46
4

zfs list -t snapshot sempre leva muito mais ordem de magnitude do que ls .zfs/snapshot

Você também está comparando duas operações completamente diferentes.

zfs list -t snapshot enumera todos os instantâneos do ZFS no sistema - e fornecem muitas informações sobre esses instantâneos, como a quantidade de espaço usada. Execute isso em strace para ver as chamadas do sistema feitas.

ls .zfs/snapshot está apenas emitindo uma lista de nomes simples de um diretório. Não há nada a fazer além de ler os nomes - e não fornecer mais nada.

    
por 23.08.2016 / 12:20