Desempenho estranho do ZFS com tamanho de bloco do conjunto de 4K?

3

Estou começando a olhar para o ZFS, fazendo testes com o FreeNAS em um antigo HP MicroServer (N40L). Não obteve RAM extra ainda, por isso só está sendo executado com 2 GB, praticamente sem cache.

Eu criei um pool em um único disco SATA de 1 TB, criei um zvol e o exportei com o iSCSI. Acabei de executar alguns testes com o CrystalDiskMark no Windows 10 e estou obtendo resultados estranhos ao alterar o tamanho do lote da pool.

ZFS 16K e NTFS 4K

-----------------------------------------------------------------------
CrystalDiskMark 5.1.0 x64 (C) 2007-2015 hiyohiyo
                           Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes

   Sequential Read (Q= 32,T= 1) :   105.938 MB/s
  Sequential Write (Q= 32,T= 1) :    98.709 MB/s
  Random Read 4KiB (Q= 32,T= 1) :     8.330 MB/s [  2033.7 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :     6.243 MB/s [  1524.2 IOPS]
         Sequential Read (T= 1) :    93.946 MB/s
        Sequential Write (T= 1) :    72.780 MB/s
   Random Read 4KiB (Q= 1,T= 1) :     8.948 MB/s [  2184.6 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     6.898 MB/s [  1684.1 IOPS]

  Test : 1024 MiB [X: 0.0% (0.2/849.9 GiB)] (x1)  [Interval=5 sec]
  Date : 2016/01/12 18:54:05
    OS : Windows 10 Professional [10.0 Build 10586] (x64)

Tudo é como eu esperaria aqui em comparação com o mesmo disco usado como um disco SATA no PC cliente.
Um pequeno desempenho sequencial é perdido devido à sobrecarga do iSCSI.
- Leituras aleatórias são melhores, algumas são armazenadas em cache.
- As gravações aleatórias são melhores porque o COW faz com que as gravações não sejam realmente aleatórias.

ZFS 4K e NTFS 4K

-----------------------------------------------------------------------
CrystalDiskMark 5.1.0 x64 (C) 2007-2015 hiyohiyo
                           Crystal Dew World : http://crystalmark.info/
-----------------------------------------------------------------------
* MB/s = 1,000,000 bytes/s [SATA/600 = 600,000,000 bytes/s]
* KB = 1000 bytes, KiB = 1024 bytes

   Sequential Read (Q= 32,T= 1) :    24.405 MB/s
  Sequential Write (Q= 32,T= 1) :    81.038 MB/s
  Random Read 4KiB (Q= 32,T= 1) :     3.048 MB/s [   744.1 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :    55.971 MB/s [ 13664.8 IOPS]
         Sequential Read (T= 1) :    42.362 MB/s
        Sequential Write (T= 1) :    45.292 MB/s
   Random Read 4KiB (Q= 1,T= 1) :     0.961 MB/s [   234.6 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     9.576 MB/s [  2337.9 IOPS]

  Test : 1024 MiB [X: 0.0% (0.2/799.9 GiB)] (x1)  [Interval=5 sec]
  Date : 2016/01/12 19:10:22
    OS : Windows 10 Professional [10.0 Build 10586] (x64)

Algumas notas:
- O uso da rede não excede 600 Mb (gerenciador de tarefas no Windows 10), portanto, menos que no primeiro teste, ele foi totalmente usado.
- O uso da CPU é aproximadamente o dobro do primeiro teste, mas ainda pelo menos 20% ocioso (superior no servidor FreeNAS)

Aqui eu não esperava isso!
- O desempenho sequencial é menor. Talvez pacotes menores sejam transmitidos, então a rede não é totalmente utilizada?
- Menos leituras aleatórias. É realmente apenas menos cache, ainda sobre o desempenho do disco. Mas por que menos cache?
- As gravações aleatórias são muito melhores com Q = 32. Eu diria que o ZFS está escrevendo 16K (12K vazios) ao escrever 4K no teste anterior. É realmente esse o caso?

    
por Sacha K 12.01.2016 / 21:18

3 respostas

0

Eu sabia que não tinha RAM suficiente para que nenhum dado fosse armazenado em cache, mas parece que 2 GB nem era suficiente para armazenar os metadados na RAM com um tamanho de bloco de 4K - mais blocos e mais metadados. Se os metadados não estiverem na RAM ao gravar, os metadados terão que ser lidos do disco para encontrar espaço livre e isso prejudicará o desempenho.

Eu tenho 8 GB de RAM ECC e fiz mais testes, ainda disco único. Os resultados agora fazem sentido com o desempenho de gravação aleatória sendo melhor quando os tamanhos de bloco do ZFS e do NTFS são correspondentes e o desempenho de gravação sequencial é o mesmo.

O tamanho do bloco pode ter um efeito nas velocidades sequenciais, mas é limitado pela rede aqui. Farei mais testes se obtiver placas de rede extras para fazer multipath.

ZFS 4K e NTFS 4K

   Sequential Read (Q= 32,T= 1) :   118.472 MB/s
  Sequential Write (Q= 32,T= 1) :   101.721 MB/s
  Random Read 4KiB (Q= 32,T= 1) :   115.943 MB/s [ 28306.4 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :    88.872 MB/s [ 21697.3 IOPS]
         Sequential Read (T= 1) :   102.555 MB/s
        Sequential Write (T= 1) :    80.744 MB/s
   Random Read 4KiB (Q= 1,T= 1) :     9.668 MB/s [  2360.4 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     9.410 MB/s [  2297.4 IOPS]

ZFS 8K e NTFS 4K

   Sequential Read (Q= 32,T= 1) :   118.154 MB/s
  Sequential Write (Q= 32,T= 1) :   102.506 MB/s
  Random Read 4KiB (Q= 32,T= 1) :   113.806 MB/s [ 27784.7 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :    73.798 MB/s [ 18017.1 IOPS]
         Sequential Read (T= 1) :   106.324 MB/s
        Sequential Write (T= 1) :    91.004 MB/s
   Random Read 4KiB (Q= 1,T= 1) :    10.161 MB/s [  2480.7 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     9.628 MB/s [  2350.6 IOPS]

ZFS 8K e NTFS 8K

   Sequential Read (Q= 32,T= 1) :   118.051 MB/s
  Sequential Write (Q= 32,T= 1) :    99.229 MB/s
  Random Read 4KiB (Q= 32,T= 1) :   113.327 MB/s [ 27667.7 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :    75.365 MB/s [ 18399.7 IOPS]
         Sequential Read (T= 1) :   106.110 MB/s
        Sequential Write (T= 1) :    87.242 MB/s
   Random Read 4KiB (Q= 1,T= 1) :     9.880 MB/s [  2412.1 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     9.878 MB/s [  2411.6 IOPS]

ZFS 16K e NTFS 4K

   Sequential Read (Q= 32,T= 1) :   118.040 MB/s
  Sequential Write (Q= 32,T= 1) :   100.274 MB/s
  Random Read 4KiB (Q= 32,T= 1) :   114.780 MB/s [ 28022.5 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :     6.014 MB/s [  1468.3 IOPS]
         Sequential Read (T= 1) :   108.443 MB/s
        Sequential Write (T= 1) :    90.182 MB/s
   Random Read 4KiB (Q= 1,T= 1) :    11.281 MB/s [  2754.2 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     8.229 MB/s [  2009.0 IOPS]

ZFS 16K e NTFS 8K

   Sequential Read (Q= 32,T= 1) :   118.046 MB/s
  Sequential Write (Q= 32,T= 1) :    99.386 MB/s
  Random Read 4KiB (Q= 32,T= 1) :   115.745 MB/s [ 28258.1 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :    51.101 MB/s [ 12475.8 IOPS]
         Sequential Read (T= 1) :   105.913 MB/s
        Sequential Write (T= 1) :    91.225 MB/s
   Random Read 4KiB (Q= 1,T= 1) :    10.244 MB/s [  2501.0 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     9.373 MB/s [  2288.3 IOPS]

ZFS 16K e NTFS 16K

   Sequential Read (Q= 32,T= 1) :   118.046 MB/s
  Sequential Write (Q= 32,T= 1) :   101.422 MB/s
  Random Read 4KiB (Q= 32,T= 1) :   113.856 MB/s [ 27796.9 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :    40.821 MB/s [  9966.1 IOPS]
         Sequential Read (T= 1) :   107.572 MB/s
        Sequential Write (T= 1) :    89.345 MB/s
   Random Read 4KiB (Q= 1,T= 1) :    11.112 MB/s [  2712.9 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     9.691 MB/s [  2366.0 IOPS]

Para informações, o mesmo disco está conectado localmente - NTFS 4K

   Sequential Read (Q= 32,T= 1) :   130.080 MB/s
  Sequential Write (Q= 32,T= 1) :   121.335 MB/s
  Random Read 4KiB (Q= 32,T= 1) :     1.005 MB/s [   245.4 IOPS]
 Random Write 4KiB (Q= 32,T= 1) :     1.290 MB/s [   314.9 IOPS]
         Sequential Read (T= 1) :   129.997 MB/s
        Sequential Write (T= 1) :   128.324 MB/s
   Random Read 4KiB (Q= 1,T= 1) :     0.406 MB/s [    99.1 IOPS]
  Random Write 4KiB (Q= 1,T= 1) :     1.307 MB/s [   319.1 IOPS]
    
por 24.01.2016 / 15:44
1

Respondendo às suas anotações:

    A utilização da rede
  1. não deve ser o culpado, pois os quadros Ethernet padrão têm, no máximo, 1500 bytes (excluindo quadros jumbo). O desempenho de leitura reduzido parece relacionado a algo errado com FS e alinhamento de dispositivos. Você pode verificar isso? De qualquer forma, também pode ser devido a mais fragmentação
  2. blocos menores são menos amigáveis ao cache. No entanto, isso pode ser um efeito colateral de como o Windows armazena em cache discos iSCSI
  3. com maior profundidade de fila, os agendadores de IO do Windows e do FreeNAS têm a chance de reorganizar e unir várias gravações. Mas essa otimização parece funcionar apenas com solicitações IO pequenas (4KB). Talvez solicitações IO maiores (> = 16KB) sejam tratadas de maneira diferente.
por 12.01.2016 / 22:31
0

Se você estiver usando zvols no ZFS, a melhor prática para distribuições não-Solaris é usar um tamanho de bloco grande. No Linux, criamos zvols com tamanho de bloco de 128K.

Você pode tentar fazer o mesmo?

    
por 12.01.2016 / 23:18

Tags