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.