ZFS: boa leitura, mas má velocidade de gravação

4

Estou encarregado de fazer o download e processar grandes quantidades de dados financeiros. Cada dia de negociação, temos que adicionar cerca de 100 GB.

Para lidar com essa quantidade de dados, alugamos um servidor virtual (3 núcleos, 12 GB de RAM) e um dispositivo de bloqueio de 30 TB do data center da nossa universidade.

Na máquina virtual, instalei o Ubuntu 16.04 e o ZFS no Linux. Em seguida, criei um pool do ZFS no dispositivo de bloco de 30 TB. O principal motivo para usar o ZFS é o recurso de compactação, pois os dados são bem compactáveis (~ 10%). Por favor, não seja muito duro comigo por não seguir a regra de ouro que o ZFS quer ver bare metal, eu sou forçado a usar a infraestrutura como ela é.

O motivo da postagem é que enfrento um problema de baixa velocidade de gravação. O servidor é capaz de ler dados com cerca de 50 MB / s do dispositivo de bloco, mas a gravação de dados é dolorosamente lenta, com cerca de 2-4 MB / s.

Veja algumas informações sobre o conjunto e o conjunto de dados:

zdb

tank:
version: 5000
name: 'tank'
state: 0
txg: 872307
pool_guid: 8319810251081423408
errata: 0
hostname: 'TAQ-Server'
vdev_children: 1
vdev_tree:
    type: 'root'
    id: 0
    guid: 8319810251081423408
    children[0]:
        type: 'disk'
        id: 0
        guid: 13934768780705769781
        path: '/dev/disk/by-id/scsi-3600140519581e55ec004cbb80c32784d-part1'
        phys_path: '/iscsi/[email protected]%3Asn.606f4c46fd740001,0:a'
        whole_disk: 1
        metaslab_array: 30
        metaslab_shift: 38
        ashift: 9
        asize: 34909494181888
        is_log: 0
        DTL: 126
        create_txg: 4
features_for_read:
    com.delphix:hole_birth
    com.delphix:embedded_data

zpool get all

NAME  PROPERTY                    VALUE                       SOURCE
tank  size                        31,8T                       -
tank  capacity                    33%                         -
tank  altroot                     -                           default
tank  health                      ONLINE                      -
tank  guid                        8319810251081423408         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                        21,1T                       -
tank  allocated                   10,6T                       -
tank  readonly                    off                         -
tank  ashift                      0                           default
tank  comment                     -                           default
tank  expandsize                  255G                        -
tank  freeing                     0                           default
tank  fragmentation               12%                         -
tank  leaked                      0                           default
tank  feature@async_destroy       enabled                     local
tank  feature@empty_bpobj         active                      local
tank  feature@lz4_compress        active                      local
tank  feature@spacemap_histogram  active                      local
tank  feature@enabled_txg         active                      local
tank  feature@hole_birth          active                      local
tank  feature@extensible_dataset  enabled                     local
tank  feature@embedded_data       active                      local
tank  feature@bookmarks           enabled                     local
tank  feature@filesystem_limits   enabled                     local
tank  feature@large_blocks        enabled                     local

zfs get all tank/test

NAME       PROPERTY               VALUE                  SOURCE
tank/test  type                   filesystem             -
tank/test  creation               Do Jul 21 10:04 2016   -
tank/test  used                   19K                    -
tank/test  available              17,0T                  -
tank/test  referenced             19K                    -
tank/test  compressratio          1.00x                  -
tank/test  mounted                yes                    -
tank/test  quota                  none                   default
tank/test  reservation            none                   default
tank/test  recordsize             128K                   default
tank/test  mountpoint             /tank/test             inherited from tank
tank/test  sharenfs               off                    default
tank/test  checksum               on                     default
tank/test  compression            off                    default
tank/test  atime                  off                    local
tank/test  devices                on                     default
tank/test  exec                   on                     default
tank/test  setuid                 on                     default
tank/test  readonly               off                    default
tank/test  zoned                  off                    default
tank/test  snapdir                hidden                 default
tank/test  aclinherit             restricted             default
tank/test  canmount               on                     default
tank/test  xattr                  on                     default
tank/test  copies                 1                      default
tank/test  version                5                      -
tank/test  utf8only               off                    -
tank/test  normalization          none                   -
tank/test  casesensitivity        mixed                  -
tank/test  vscan                  off                    default
tank/test  nbmand                 off                    default
tank/test  sharesmb               off                    default
tank/test  refquota               none                   default
tank/test  refreservation         none                   default
tank/test  primarycache           all                    default
tank/test  secondarycache         all                    default
tank/test  usedbysnapshots        0                      -
tank/test  usedbydataset          19K                    -
tank/test  usedbychildren         0                      -
tank/test  usedbyrefreservation   0                      -
tank/test  logbias                latency                default
tank/test  dedup                  off                    default
tank/test  mlslabel               none                   default
tank/test  sync                   disabled               local
tank/test  refcompressratio       1.00x                  -
tank/test  written                19K                    -
tank/test  logicalused            9,50K                  -
tank/test  logicalreferenced      9,50K                  -
tank/test  filesystem_limit       none                   default
tank/test  snapshot_limit         none                   default
tank/test  filesystem_count       none                   default
tank/test  snapshot_count         none                   default
tank/test  snapdev                hidden                 default
tank/test  acltype                off                    default
tank/test  context                none                   default
tank/test  fscontext              none                   default
tank/test  defcontext             none                   default
tank/test  rootcontext            none                   default
tank/test  relatime               off                    default
tank/test  redundant_metadata     all                    default
tank/test  overlay                off                    default
tank/test  com.sun:auto-snapshot  true                   inherited from tank

Você pode me dar uma dica do que eu poderia fazer para melhorar a velocidade de gravação?

Atualização 1

Após seus comentários sobre o sistema de armazenamento, fui ao departamento de TI. O cara me disse que o bloco lógico que o vdev exporta é na verdade 512 B.

Esta é a saída de dmesg :

[    8.948835] sd 3:0:0:0: [sdb] 68717412272 512-byte logical blocks: (35.2 TB/32.0 TiB)
[    8.948839] sd 3:0:0:0: [sdb] 4096-byte physical blocks
[    8.950145] sd 3:0:0:0: [sdb] Write Protect is off
[    8.950149] sd 3:0:0:0: [sdb] Mode Sense: 43 00 10 08
[    8.950731] sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, supports DPO and FUA
[    8.985168]  sdb: sdb1 sdb9
[    8.987957] sd 3:0:0:0: [sdb] Attached SCSI disk

Então 512 blocos lógicos B mas 4096 B bloco físico?!

Eles me fornecem algum sistema de arquivos temporário para o qual posso fazer backup dos dados. Em seguida, testarei primeiro a velocidade no dispositivo bruto antes de configurar a piscina a partir do zero. Vou enviar uma atualização.

Atualização 2

Eu destruí a piscina original. Então eu corri alguns testes de velocidade usando dd , os resultados são ok - em torno de 80MB / s em ambas as direções.

Como verificação adicional, criei uma partição ext4 no dispositivo. Eu copiei um grande arquivo zip para essa partição ext4 e a velocidade média de gravação é de cerca de 40MB / s. Não é bom, mas suficiente para meus propósitos.

Eu continuei criando um novo pool de armazenamento com os seguintes comandos

zpool create -o ashift=12 tank /dev/disk/by-id/scsi-3600140519581e55ec004cbb80c32784d
zfs set compression=on tank
zfs set atime=off tank
zfs create tank/test

Depois, copiei novamente um arquivo zip para o novo sistema de arquivos test . A velocidade de gravação é baixa, apenas em torno de 2-5 MB / s.

Alguma idéia?

Atualização 3

tgx_sync é bloqueado quando copio os arquivos. Eu abri um ticket no repositório github do ZoL.

    
por BayerSe 21.07.2016 / 13:50

1 resposta

1

Você definiu ashift=0 , o que causa velocidades de gravação baixas quando você possui unidades HD que usam setores de 4096 bytes. Sem ashift , o ZFS não alinha corretamente as gravações nos limites do setor - > discos rígidos precisam ler-modificar-gravar 4096 setores de bytes quando o ZFS está escrevendo setores de 512 bytes.

Use ashift=12 para fazer o ZFS alinhar gravações em setores de 4096 bytes.

Você também precisa verificar se o alinhamento de sua partição está correto em relação ao disco rígido em uso.

    
por 21.07.2016 / 14:09