
dr - Minha matriz ZFS RAIDZ2 lê a 7,5+ GB/s e grava a 2,0+ GB/s quando eu especifico um bs=128K
ou superior com dd
. OS X está assumindo 1K (conforme stat -f %k .
) e todo o meu é de aproximadamente 300 MB/s; dd
dá o mesmo desempenho com bs=1k
. Até mesmo bs=4k
dá 1,1 GB/s com dd.
O que posso fazer para melhorar a E/S geral para pelo menos 1 GB/s?
--
Detalhes:
Estou executando um sistema de arquivos SATA3 RAIDZ2 OpenZFS de 16 unidades no sistema de arquivos OSX (v1.31r2) (v5000) sobre Thunderbolt 2 (areca 8050T2 duplo) em um Mac Pro de 64 GB de 12 núcleos.
O sistema de arquivos ZFS foi criado com ashift=12
(HDDs de formato avançado com blocos de 4096 bytes) e um arquivo recordsize=128k
.
Estou vendo taxas de transferência em torno de 300 MB/s do array no OS X e do terminal usando comandos padrão (o arquivo de observação que está sendo copiado contém dados aleatórios de 10 GB):
Cópia normal:
Titanic:lb-bu admin$ time cp big-test.data /dev/null
real 0m23.730s
user 0m0.005s
sys 0m12.123s
≈ 424MB/s
--
dd
com bs=1k
:
Titanic:lb-bu admin$ time dd if=./big-test.data of=/dev/null bs=1024
9841180+0 records in
9841180+0 records out
10077368320 bytes transferred in 32.572506 secs (309382653 bytes/sec)
real 0m32.575s
user 0m1.880s
sys 0m30.695s
≈ 309MB/s
--
dd
combs=4k
Titanic:lb-bu admin$ time dd if=./big-test.data of=/dev/null bs=4096
2460295+0 records in
2460295+0 records out
10077368320 bytes transferred in 8.686014 secs (1160183301 bytes/sec)
real 0m8.688s
user 0m0.460s
sys 0m8.228s
≈1,16 GB/s
--
dd
com bs=2m
:
Titanic:lb-bu admin$ time dd if=./big-test.data of=/dev/null bs=2m
4805+1 records in
4805+1 records out
10077368320 bytes transferred in 1.162891 secs (8665788130 bytes/sec)
real 0m1.165s
user 0m0.003s
sys 0m1.162s
≈8,67 GB/s
--
OS X's read of the boot drive optimal I/O block size (1TB SSD, HFS+):
Titanic:lb-bu admin$ stat -f %k /
4096
--
OS X's read of the array's optimal I/O block size (16-drives RAIDZ2, ZFS):
Titanic:lb-bu admin$ stat -f %k .
1024
--
Também criei um volume ZFS no pool ao lado do sistema de arquivos e formatei como HFS+. Obtive o mesmo desempenho acima.
Estou rodando cerca de 20-30x abaixo do ideal! o que estou perdendo? Alguma ideia?
--
Atualização: altas velocidades foram armazenadas em cache de E/S (obrigado @yoonix). Velocidades de ≈300 MB/s ainda parecem muito lentas para este hardware.
@qasdfdsaq: a utilização da CPU durante a E/S é insignificante (todos os núcleos <5%).
zfs obtém todas as saídas:
NAME PROPERTY VALUE SOURCE
lb-bu type filesystem -
lb-bu creation Tue Sep 30 16:41 2014 -
lb-bu used 36.8T -
lb-bu available 10.0T -
lb-bu referenced 138M -
lb-bu compressratio 1.00x -
lb-bu mounted yes -
lb-bu quota none default
lb-bu reservation none default
lb-bu recordsize 128K default
lb-bu mountpoint /Volumes/lb-bu local
lb-bu sharenfs off default
lb-bu checksum on default
lb-bu compression lz4 local
lb-bu atime on default
lb-bu devices on default
lb-bu exec on default
lb-bu setuid on default
lb-bu readonly off default
lb-bu zoned off default
lb-bu snapdir hidden default
lb-bu aclmode discard default
lb-bu aclinherit restricted default
lb-bu canmount on default
lb-bu xattr on default
lb-bu copies 1 default
lb-bu version 5 -
lb-bu utf8only on -
lb-bu normalization formD -
lb-bu casesensitivity insensitive -
lb-bu vscan off default
lb-bu nbmand off default
lb-bu sharesmb off default
lb-bu refquota none default
lb-bu refreservation none default
lb-bu primarycache all default
lb-bu secondarycache all default
lb-bu usedbysnapshots 0 -
lb-bu usedbydataset 138M -
lb-bu usedbychildren 36.8T -
lb-bu usedbyrefreservation 0 -
lb-bu logbias latency default
lb-bu dedup off default
lb-bu mlslabel none default
lb-bu sync standard default
lb-bu refcompressratio 1.01x -
lb-bu written 138M -
lb-bu logicalused 36.8T -
lb-bu logicalreferenced 137M -
lb-bu snapdev hidden default
lb-bu com.apple.browse on default
lb-bu com.apple.ignoreowner off default
lb-bu com.apple.mimic_hfs off default
lb-bu redundant_metadata all default
lb-bu overlay off default
Responder1
Você não postou zpool status
isso, mas sugere na postagem que todos os 16 discos estão em um único vdev no RAIDZ2. Embora esta seja uma configuração boa e segura, você deve entender que o RAIDZ não foi projetado principalmente para velocidade. Ele foi projetado para ser quase à prova de balas. RAIDZ2 é análogo ao RAID6, mas a variante possui recursos que o tornam mais lento e seguro.
Veresse belo textopara obter todos os detalhes, mas essas duas citações devem ajudá-lo a ver o problema (ênfase minha):
Ao gravar em vdevs RAID-Z, cada bloco do sistema de arquivos é dividido em sua própria faixa em (potencialmente) todos os dispositivos do vdev RAID-Z. Isso significa que cada E/S de gravação terá que esperar até que todos os discos no vdev RAID-Z terminem de ser gravados. Portanto, do ponto de vista de um único aplicativo aguardando a conclusão de seu IO,você obterá o desempenho de gravação IOPS do disco mais lento no RAID-Z vdev.
Ao ler de vdevs RAID-Z, as mesmas regras se aplicam, pois o processo é essencialmente revertido (sem atalho round robin como no caso de espelhamento): Melhor largura de banda se você tiver sorte (e leia da mesma maneira que escreveu)e o desempenho de leitura de IOPS de um único disco na maioria dos casos importantes.
Na verdade, você tem 16 unidades de velocidade média e, para cada passagem de gravação, espera que todas as 16 unidades façam check-in com o controlador e digam "concluído" antes do início da próxima gravação. Com 16 discos, você sempre esperará por uma rotação quase completa do disco antes de uma das gravações, para que você seja prejudicado pela física e pela forma como o ZFS confirma os dados.
Tarefas de gravação de processo/thread único não são o melhor caso para o ZFS em geral. A execução de várias tarefas pequenas de leitura/gravação de dados ao mesmo tempo pode mostrar melhores números de IOPS, mas acho que a física do ZFS é o seu principal problema.
Se você estiver disposto a sacrificar o espaço, o espelhamento provavelmente será mais rápido. Você também pode obter um desempenho ligeiramente melhor do ZFS criando 2 vdevs RAIDZ2 de 8 discos no pool em vez de 1 vdev RAIDZ2 de 16 discos. Isso também custará espaço de armazenamento utilizável, mas pode ajudar os commits a acontecerem mais rapidamente.
Infelizmente não tenho boas notícias para você.