ZFS: Problemas de memória com dedup, mesmo que zdb -DD pareça bom

6

Eu tenho experimentado com o ZFS em uma máquina com Ubuntu 12.10, 32GB de RAM (não-ECC, o sistema de produção terá ECC) e um RAID1 de 2x2TB gerenciado por Linux (será movido para RAIDZ1 para produção). Acabei de criar o tanque no dispositivo 2TB soft-RAID1, habilitei a compactação e a dedup e armazenei alguns 100 GB de dados.

Eu tenho uma taxa de deduplicação de cerca de 3,5x (realmente faz sentido para os meus dados, é por isso que eu gostaria de usá-los), mas não havia memória livre, o sistema ficou inutilizável. Reiniciando o sistema, tudo parecia bem, então eu escrevi alguns GB de dados, a mesma coisa.

Eu então configurei zfs_arc_max para 12GB (já que aparentemente eu não sou o único que consumiu memória), o que evitou que o sistema parasse de responder, mas escrever alguns GB ultrapassou o limite de memória e gravar no tanque se tornou muito lento, basicamente inutilizável.

Eu sei que dedup leva RAM, mas, tanto quanto eu sei, isso

DDT-sha256-zap-duplicate: 615271 entries, size 463 on disk, 149 in core
DDT-sha256-zap-unique: 846070 entries, size 494 on disk, 159 in core

DDT histogram (aggregated over all DDTs):

bucket              allocated                       referenced          
______   ______________________________   ______________________________
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
     1     826K   83.5G   51.7G   52.9G     826K   83.5G   51.7G   52.9G
     2     363K   34.6G   17.8G   18.5G     869K   81.9G   41.3G   43.0G
     4     138K   14.1G   8.89G   9.11G     654K   66.4G   41.0G   42.1G
     8    49.0K   3.94G   2.25G   2.34G     580K   44.3G   25.3G   26.4G
    16    37.2K   3.96G   3.06G   3.10G     865K   90.1G   69.9G   70.8G
    32    9.81K    854M    471M    488M     464K   40.5G   21.9G   22.7G
    64    1.84K    160M   80.8M   85.1M     148K   11.8G   5.99G   6.33G
   128    1.13K   60.4M   24.7M   27.7M     218K   11.2G   4.70G   5.26G
   256      545   52.9M   30.9M   32.1M     169K   15.5G   9.00G   9.36G
   512      120   7.17M   4.19M   4.51M    84.5K   5.09G   2.96G   3.18G
    1K      368   40.0M   19.0M   19.7M     480K   52.2G   24.8G   25.7G
    2K       16    401K     23K     76K    46.4K   1.31G   73.5M    226M
    4K        8      5K      4K     32K    39.9K   24.6M   20.0M    160M
 Total    1.39M    141G   84.3G   86.6G    5.32M    504G    299G    308G

significa que a tabela deve ter apenas 90MB de memória, então não entendo o que está acontecendo. Eu tenho a mesma configuração em um servidor idêntico sem dedup e esse parece funcionar bem ...

Eu realmente aprecio qualquer ajuda (além de "desabilitar desduplicação", como realmente, realmente faz sentido para os meus dados;))! Mais dados:

tank  type                  filesystem             -
tank  creation              Thu Jan 16 13:17 2014  -
tank  used                  342G                   -
tank  available             1.67T                  -
tank  referenced            341G                   -
tank  compressratio         1.64x                  -
tank  mounted               yes                    -
tank  quota                 none                   default
tank  reservation           none                   default
tank  recordsize            128K                   default
tank  mountpoint            /    tank                  default
tank  sharenfs              off                    default
tank  checksum              on                     default
tank  compression           lzjb                   local
tank  atime                 off                    local
tank  devices               on                     default
tank  exec                  on                     default
tank  setuid                on                     default
tank  readonly              off                    default
tank  zoned                 off                    default
tank  snapdir               hidden                 default
tank  aclinherit            restricted             default
tank  canmount              on                     default
tank  xattr                 sa                     local
tank  copies                1                      default
tank  version               5                      -
tank  utf8only              off                    -
tank  normalization         none                   -
tank  casesensitivity       sensitive              -
tank  vscan                 off                    default
tank  nbmand                off                    default
tank  sharesmb              off                    default
tank  refquota              none                   default
tank  refreservation        none                   default
tank  primarycache          all                    default
tank  secondarycache        all                    default
tank  usedbysnapshots       36.9M                  -
tank  usedbydataset         341G                   -
tank  usedbychildren        702M                   -
tank  usedbyrefreservation  0                      -
tank  logbias               latency                default
tank  dedup                 on                     local
tank  mlslabel              none                   default
tank  sync                  standard               default
tank  refcompressratio      1.64x                  -
tank  written               308K                   -
tank  snapdev               hidden                 default

ATUALIZADO com mais dados.

OK, então executei outro teste - reiniciei o servidor, montei o volume, etc.:

             total       used       free     shared    buffers     cached
Mem:         32138        457      31680          0         19         66
-/+ buffers/cache:        372      31766
Swap:         7812          0       7812

e arcstats

4 1 0x01 84 4032 7898070146 560489175172
name                            type data
hits                            4    1059
misses                          4    185
demand_data_hits                4    0
demand_data_misses              4    0
demand_metadata_hits            4    971
demand_metadata_misses          4    49
prefetch_data_hits              4    0
prefetch_data_misses            4    7
prefetch_metadata_hits          4    88
prefetch_metadata_misses        4    129
mru_hits                        4    476
mru_ghost_hits                  4    0
mfu_hits                        4    495
mfu_ghost_hits                  4    0
deleted                         4    9
recycle_miss                    4    0
mutex_miss                      4    0
evict_skip                      4    0
evict_l2_cached                 4    0
evict_l2_eligible               4    0
evict_l2_ineligible             4    2048
hash_elements                   4    176
hash_elements_max               4    176
hash_collisions                 4    0
hash_chains                     4    0
hash_chain_max                  4    0
p                               4    6442450944
c                               4    12884901888
c_min                           4    1610612736
c_max                           4    12884901888
size                            4    1704536
hdr_size                        4    101424
data_size                       4    1448960
other_size                      4    154152
anon_size                       4    16384
anon_evict_data                 4    0
anon_evict_metadata             4    0
mru_size                        4    1231872
mru_evict_data                  4    206336
mru_evict_metadata              4    849408
mru_ghost_size                  4    0
mru_ghost_evict_data            4    0
mru_ghost_evict_metadata        4    0
mfu_size                        4    200704
mfu_evict_data                  4    0
mfu_evict_metadata              4    4096
mfu_ghost_size                  4    16384
mfu_ghost_evict_data            4    0
mfu_ghost_evict_metadata        4    16384
l2_hits                         4    0
l2_misses                       4    0
l2_feeds                        4    0
l2_rw_clash                     4    0
l2_read_bytes                   4    0
l2_write_bytes                  4    0
l2_writes_sent                  4    0
l2_writes_done                  4    0
l2_writes_error                 4    0
l2_writes_hdr_miss              4    0
l2_evict_lock_retry             4    0
l2_evict_reading                4    0
l2_free_on_write                4    0
l2_abort_lowmem                 4    0
l2_cksum_bad                    4    0
l2_io_error                     4    0
l2_size                         4    0
l2_asize                        4    0
l2_hdr_size                     4    0
l2_compress_successes           4    0
l2_compress_zeros               4    0
l2_compress_failures            4    0
memory_throttle_count           4    0
duplicate_buffers               4    0
duplicate_buffers_size          4    0
duplicate_reads                 4    0
memory_direct_count             4    0
memory_indirect_count           4    0
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_meta_used                   4    1498200
arc_meta_limit                  4    3221225472
arc_meta_max                    4    1449144

Interpretou um pouco até o ARC acertar vfs_arc_max (12 GB):

4 1 0x01 84 4032 7898070146 1406380500230
name                            type data
hits                            4    7338384
misses                          4    117090
demand_data_hits                4    4841648
demand_data_misses              4    10072
demand_metadata_hits            4    2423640
demand_metadata_misses          4    35334
prefetch_data_hits              4    37879
prefetch_data_misses            4    65420
prefetch_metadata_hits          4    35217
prefetch_metadata_misses        4    6264
mru_hits                        4    2672085
mru_ghost_hits                  4    301
mfu_hits                        4    4615778
mfu_ghost_hits                  4    1183
deleted                         4    9
recycle_miss                    4    1022
mutex_miss                      4    17
evict_skip                      4    2
evict_l2_cached                 4    0
evict_l2_eligible               4    1977338368
evict_l2_ineligible             4    751589376
hash_elements                   4    166822
hash_elements_max               4    166828
hash_collisions                 4    59458
hash_chains                     4    21504
hash_chain_max                  4    4
p                               4    55022931
c                               4    12652319216
c_min                           4    1610612736
c_max                           4    12884901888
size                            4    12327222416
hdr_size                        4    55933440
data_size                       4    12149027328
other_size                      4    122261648
anon_size                       4    1056256
anon_evict_data                 4    0
anon_evict_metadata             4    0
mru_size                        4    6481734656
mru_evict_data                  4    6220393984
mru_evict_metadata              4    188646912
mru_ghost_size                  4    1902724096
mru_ghost_evict_data            4    1871710720
mru_ghost_evict_metadata        4    31013376
mfu_size                        4    5666236416
mfu_evict_data                  4    5643978240
mfu_evict_metadata              4    16081408
mfu_ghost_size                  4    708022272
mfu_ghost_evict_data            4    680676352
mfu_ghost_evict_metadata        4    27345920
l2_hits                         4    0
l2_misses                       4    0
l2_feeds                        4    0
l2_rw_clash                     4    0
l2_read_bytes                   4    0
l2_write_bytes                  4    0
l2_writes_sent                  4    0
l2_writes_done                  4    0
l2_writes_error                 4    0
l2_writes_hdr_miss              4    0
l2_evict_lock_retry             4    0
l2_evict_reading                4    0
l2_free_on_write                4    0
l2_abort_lowmem                 4    0
l2_cksum_bad                    4    0
l2_io_error                     4    0
l2_size                         4    0
l2_asize                        4    0
l2_hdr_size                     4    0
l2_compress_successes           4    0
l2_compress_zeros               4    0
l2_compress_failures            4    0
memory_throttle_count           4    0
duplicate_buffers               4    0
duplicate_buffers_size          4    0
duplicate_reads                 4    0
memory_direct_count             4    0
memory_indirect_count           4    1947
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_meta_used                   4    462466704
arc_meta_limit                  4    3221225472
arc_meta_max                    4    465357280

e free -m mostraram o que era esperado, buffers / cache e primeira linha concordando sobre o uso / free. Mas, brincar um pouco mais levou o sistema a ficar excessivamente lento (minutos para copiar 1GB) e

             total       used       free     shared    buffers     cached
Mem:         32138      31923        215          0          6      15442
-/+ buffers/cache:      16473      15665
Swap:         7812          0       7812

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  1    308 3774708  27204 9464052    0    0   386   271   72  348  1  2 83 15

Desmontar o volume do ZFS e descarregar o módulo do kernel libera toda a memória ... Então, para mim, realmente parece algum tipo de vazamento de memória: zfs_arc_max está definido, e o arcstats diz que esse limite é observado (veja abaixo), mas o ZFS de alguma forma continua consumindo memória. Ufa ...

    time  read  miss  miss%  dmis  dm%  pmis  pm%  mmis  mm%  arcsz     c  
14:08:08     0     0      0     0    0     0    0     0    0   9.8G   10G 
    
por admr 22.01.2014 / 15:54

4 respostas

4

O Dedupe no ZFS nem sempre vale a pena . Ok, raramente vale a pena ... Eu sei que é atraente, sexy e parece ser um ótimo ponto de venda ... mas a que custo?

  • Previsibilidade.
  • Estabilidade.
  • uso da RAM.
  • Planejamento e design.
  • Desempenho.

Veja também: ZFS - destruir zvol ou conjunto de dados desduplicado bloqueia o servidor. Como se recuperar?

Então, vamos examinar sua tabela de DDT ...
Se você não tiver certeza de como calcular, consulte: Qual é o tamanho da minha tabela de dedupe do ZFS no momento?

DDT-sha256-zap-duplicate: 615271 entries, size 463 on disk, 149 in core

615271 * 149 = 91675379 - > 91675379/1024/1024 == 87,42 megabytes.

Então hmm ... não é necessária muita RAM para o conjunto de dados.

Outros itens a serem observados. Você provavelmente deve estar usando a compactação lz4 , mas isso é tudo o que posso ver daqui. Você pode ver se esta é uma interação entre os subsistemas de memória virtual do Linux e o ZFS? Eu manteria o ARC onde está ... mas verifique as estatísticas da VM do Linux no momento das velocidades lentas. Isso pode depender um pouco do tipo de dados que você está armazenando. Quais tipos de arquivos são esses?

    
por 22.01.2014 / 17:06
3

Uma boa regra é planejar cerca de 5 GB de RAM para cada 1 TB de disco. Portanto, se você tiver 2 TB de dados, isso significará 10 GB apenas para metadados de deduplicação + ARC + ZFS. Não é a resposta que você quer, mas não vale o esforço. Você ainda terá algumas economias com a compactação ativada. Dê uma olhada neste artigo

5 GB é uma regra geral, mas não precisa ser verdadeira. Assumimos que você precisará de 5 GB de RAM por 1 TB, assumindo que você use 64 K blocos. Mas o tamanho do bloco pode ser diferente entre 512b e 128K. A solução pode ser drives L2ARC e SSD, mas será cara.

    
por 22.01.2014 / 16:23
2

Você pode estar se deparando com um problema específico da implementação. No Linux, existe o projeto ZFS no Linux , bem como a implementação do zfs-fuse. O último é consideravelmente mais lento, mas você deve tentar o seu cenário com ambos para descartar problemas de código específicos da versão. Além disso, pode valer a pena testar com uma versão Nexenta / OpenIndiana ou mesmo com uma instalação do Solaris 11.1 ODN.

Lembre-se de que a desduplicação on-line do ZFS tem alguns problemas de arquitetura, grande consumo de memória e alta utilização da CPU ao gravar no pool, sendo os principais. Talvez valha a pena verificar se a desduplicação off-line, como a oferecida pelo Windows Server 2012 para NTFS ou < um href="https://btrfs.wiki.kernel.org/index.php/Deduplication"> BTRFS com patches de bedup seria mais adequado ao seu padrão de uso.

    
por 22.01.2014 / 17:40
2

Respondendo a mim mesmo por enquanto - aparentemente, 0.6.2.1 ainda tem muita sobrecarga de fragmentação de memória, a parte de desduplicação será melhorada em 0.6.3. Eu acho que vou experimentar a versão atual do desenvolvimento ou os patches sugeridos na edição que abri: link . Vamos ver como isso acontece.

Atualização: veja abaixo - eu decidi ir com o 0.6.2 e sem desduplicação por enquanto. Continuarei testando novos lançamentos até que eu me sinta "seguro" com a desduplicação, pois acredito que possa fazer sentido para o meu aplicativo.

Obrigado a todos!

    
por 27.01.2014 / 17:31