Por que o ZFS no Linux não lê o cache?

1

Eu tenho um zpool de teste configurado com um único disco giratório de 4 TB conectado por USB que lê cerca de 40MB / s.

Tenho quatro SSDs internos SATA2 rápidos de 300 GB configurados como cache para este disco. Eu posso ler cerca de 900MB / seg deste L2ARC.

Estou lendo um conjunto de dados em grande parte estático de 400 GB deste pool.

O sistema em questão tem mais de 200 GB de memória livre, o que, presumo, opera a > 1500 MB / s para nossos objetivos.

Every 1.0s: zpool iostat -y -v 1 1 ; zpool status -v                                                las2: Tue Oct 16 20:20:07 2018

                                                      capacity     operations     bandwidth
pool                                                alloc   free   read  write   read  write
--------------------------------------------------  -----  -----  -----  -----  -----  -----
storage                                              417G  3.22T    239      2  29.7M   132K
  usb-Seagate_M3_Portable_NM12QHQF-0:0-part1         417G  3.22T    239      2  29.7M   132K
cache                                                   -      -      -      -      -      -
  ata-INTEL_SSDSC2BA400G3_BTTV41450D92400HGN-part3  52.8G   291G     11      0   927K   128K
  ata-INTEL_SSDSC2BA400G3_BTTV423000XA400HGN-part3  52.9G   291G     13      0  1.48M      0
  ata-INTEL_SSDSC2BA400G3_BTTV423406FG400HGN-part3  52.7G   291G      8      0   324K      0
  ata-INTEL_SSDSC2BA400G3_BTTV423406G6400HGN-part3  52.9G   291G      5      0   336K      0
--------------------------------------------------  -----  -----  -----  -----  -----  -----
  pool: storage
 state: ONLINE
  scan: scrub repaired 0B in 1h56m with 0 errors on Sun Oct 14 02:20:56 2018
config:

        NAME                                                STATE     READ WRITE CKSUM
        storage                                             ONLINE       0     0     0
          usb-Seagate_M3_Portable_NM12QHQF-0:0-part1        ONLINE       0     0     0
        cache
          ata-INTEL_SSDSC2BA400G3_BTTV41450D92400HGN-part3  ONLINE       0     0     0
          ata-INTEL_SSDSC2BA400G3_BTTV423000XA400HGN-part3  ONLINE       0     0     0
          ata-INTEL_SSDSC2BA400G3_BTTV423406FG400HGN-part3  ONLINE       0     0     0
          ata-INTEL_SSDSC2BA400G3_BTTV423406G6400HGN-part3  ONLINE       0     0     0

errors: No known data errors

AIUI, leituras colocadas em cache no ARC na memória do sistema. Quando isso atinge algum nível de "full", eles são despejados no L2ARC, 1.1TB de SSD rápido.

Quando executo um tar -c . | pv > /dev/null de um dos diretórios praticamente inalterados nesse conjunto, vejo cerca de 40 MB / s - a velocidade das leituras do HDD subjacente e lento.

O problema é que eu vejo pela segunda vez também! Às vezes aumenta para 80-100MB / seg, mas também às vezes cai para 10MB / seg. Eu esperaria que 99% das leituras viessem da memória ou do rápido L2ARC.

O que dá? Eu esperaria ver a partir de velocidades de memória RAM como esta caixa tem 256GB de memória do sistema e mais de 200GB do que é livre. Caso contrário, ainda há centenas de gigabytes de L2ARC não utilizados.

O que estou fazendo de errado? Por que esses dados não estão sendo lidos do ARC a uma velocidade extremamente alta (> 1 GB / s)? Falhando nisso, por que não está sendo lido do L2ARC (> 500MB / s)? Por que estou vendo 40-80MB / seg em um sistema principalmente descarregado?

Ubuntu bionic 18.04.1 x86_64 system.

Linux las2 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

zfs-auto-snapshot/now 1.2.4-1 all [installed,local]
zfs-zed/now 0.7.5-1ubuntu16.4 amd64 [installed,local]
zfsutils-linux/now 0.7.5-1ubuntu16.4 amd64 [installed,local]
    
por sneak 17.10.2018 / 05:29

1 resposta

2

Existem dois problemas aqui.

Primeiro, seu conjunto de dados não cabe na memória e é despejado com base no LRU (Menos recentemente usado). Isso significa que, depois de percorrer todo o conjunto de dados, se você começar novamente desde o início, nada do que você está procurando estará no ARC.

O segundo problema é que o L2ARC não é preenchido do jeito que você pensa. É preenchido quando os dados são despejados do ARC, mas a taxa de preenchimento é reduzida. Eu acredito que o limite padrão é 8MB / S, o que terá um pequeno impacto no segundo passe de leitura. Para resolver isso, acredito que você deve verificar os parâmetros ZFS "l2narc_write_max" e "l2arc_write_boost".

    
por 28.11.2018 / 22:41