Desempenho lento devido ao txg_sync para o ZFS 0.6.3 no Ubuntu 14.04

3

Estou usando o ZFS nativo com o "ZFS no Linux" instalado a partir do aqui . A configuração não foi um problema e estou usando na configuração espelhada com dois HDDs WD 4TB Red. Infelizmente estou tendo problemas de desempenho, quando escrevendo no disco-matriz. Quando a leitura de desempenho está OK.

Estou tendo o problema de que, durante grandes gravações no array, o processo de cópia pare de ~ 5-10MB / s a cada ~ 5 segundos, conforme relatado pelo rsync. As velocidades entre as barracas são ~ 75MB / s, o que está alinhado com outros sistemas de arquivos e com o que eu esperaria do sistema (tentei o btrfs, que tem ~ 85MB / s). Observando iotop , descobri que as trava de cópias coincidem com o processo txg_sync performing / hogging I / O. Esta questão parece ser a questão da E / S "rajada" que parece ser um problema comum com o ZFS (consulte aqui e aqui ). Eu apliquei a opção do primeiro link

options zfs zfs_prefetch_disable=1

que ajudou um pouco com os problemas de desempenho, mas não os resolveu. O intervalo de 5s de txg_sync parece ser o de vfs.zfs.txg.timeout="5" (por exemplo, 5s), que é a configuração padrão do ZFS no Linux.

Esse comportamento é normal ou há outras configurações que eu posso tentar? Em caso afirmativo, alguma sugestão? Note que não encontrei muitas das opções nos dois links ...

EDIT 2: Para acompanhar um pouco: O sistema que estou usando é um HP ProLiant Microserver N36L, que atualizei para 8 GB de RAM ECC. Os comandos que usei para criar o volume do ZFS são fornecidos aqui. Note que estou usando -o ashift=12 como eu achei (encontrado no FAQ do zfsonlinux) que isso deve fazer com que o ZFS funcione bem com os blocos de 4096Bytes de Advanced Format Disks.

$ zpool create -o ashift=12 -m /zpools/tank tank mirror ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0871252 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E3PKP1R0
$ zfs set relatime=on tank
$ zfs set compression=lz4 tank
$ zfs create -o casesensitivity=mixed tank/data

Adicionada a opção zfs_prefetch_disable a /etc/modprob.d/zfs.conf para tornar as alterações permanentes:

options zfs zfs_prefetch_disable=1

Para que:

$ cat /sys/module/zfs/parameters/zfs_prefetch_disable 
1

EDIT 1: Conforme solicitado, adicionei a saída zpool get all . Note que esqueci de mencionar que liguei a compressão na piscina ...

$ zpool get all
NAME  PROPERTY               VALUE                  SOURCE
tank  size                   3.62T                  -
tank  capacity               39%                    -
tank  altroot                -                      default
tank  health                 ONLINE                 -
tank  guid                   12372923926654962277   default
tank  version                -                      default
tank  bootfs                 -                      default
tank  delegation             on                     default
tank  autoreplace            off                    default
tank  cachefile              -                      default
tank  failmode               wait                   default
tank  listsnapshots          off                    default
tank  autoexpand             off                    default
tank  dedupditto             0                      default
tank  dedupratio             1.00x                  -
tank  free                   2.21T                  -
tank  allocated              1.42T                  -
tank  readonly               off                    -
tank  ashift                 12                     local
tank  comment                -                      default
tank  expandsize             0                      -
tank  freeing                0                      default
tank  feature@async_destroy  enabled                local
tank  feature@empty_bpobj    active                 local
tank  feature@lz4_compress   active                 local
    
por packoman 21.01.2015 / 19:37

1 resposta

2

Pacoman,       Parece que, como você tem duas unidades WD-RED em um espelho, o IO para gravar o grupo de consistências ZIL em disco está causando um alto IO. Há sempre um ZIL (Write-Cache). Se você não tiver nenhum dispositivo LOG, o dispositivo de log estará no próprio pool e poderá ser tão grande quanto a velocidade máxima de gravação * 5 segundos. Você provavelmente está lendo o ZIL e confirmando os dados para armazenamento permanente a cada 5 segundos. Perguntas:

  1. Você tem um dispositivo SLOG? Este é idealmente um Drive DRAM (HGST ZeusRAM, etc ...).
  2. Você tem algum dispositivo de cache para ler? Idealmente, um monte de Flash, como uma placa PCIe de 480GB.

Minha recomendação seria criar um SLOG em outro lugar que não seja o pool (até mesmo o dispositivo de inicialização é melhor do que não, supondo que NÃO seja flash). Desta forma você não está lendo e escrevendo para o espelho intensamente a cada 5 segundos.

    
por 06.03.2015 / 10:12