VOLSIZE representa o tamanho do volume como será visto pelos clientes, não o tamanho do volume armazenado no pool.
Essa diferença pode vir de várias fontes:
- espaço necessário para metadados
- espaço necessário para armazenar várias cópias (os parâmetros "cópias")
- "espaço desperdiçado" devido ao preenchimento ao alinhar blocos de tamanho "volblocksize" à estrutura vdev; por vdev estrutura quero dizer dois parâmetros: número de discos em raidz-N, e tamanho do bloco físico dos dispositivos.
Ao criar um volume, o zfs estimará quanto espaço ele precisaria usar para poder apresentar um volume de "volsize" a seus clientes. Você pode ver essa diferença nos volumes vtest-16 e vtest-3 (em que a atualização é de 102 GB e o volume é de 100 GB). O cálculo pode ser encontrado em libzfs_dataset.c (zvol_volsize_to_reservation (uint64_t volsize, nvlist_t * props))
O que não é levado em consideração por esse cálculo é a terceira fonte. A terceira fonte tem pouco impacto nos vdevs criados com discos que possuem setores de 512 bytes. Dos meus experimentos (testei isso preenchendo um zvol inteiro para verificar isso), isso faz uma grande diferença quando o vdev é criado sobre novos discos do setor 4K.
Outra coisa que eu encontrei em meus experimentos é que ter espelhos não mostra diferenças entre a atualização calculada e o que acaba sendo usado.
Estes são meus resultados ao usar unidades 4K com volumes que têm o tamanho padrão de volblocks (8K). A primeira coluna representa o número de discos em um vdev:
raidz1 raidz2
3 135% 101%
4 148% 148%
5 162% 181%
6 162% 203%
7 171% 203%
8 171% 217%
9 181% 232%
10 181% 232%
11 181% 232%
12 181% 232%
Estes são meus resultados ao usar unidades de setor de 512 bytes e volblocksize padrão de 8K. A primeira coluna representa o número de discos em um vdev:
raidz1 raidz2
3 101% 101%
4 104% 104%
5 101% 113%
6 105% 101%
7 108% 108%
8 110% 114%
9 101% 118%
10 102% 106%
11 103% 108%
12 104% 110%
Minhas conclusões são as seguintes:
- Não use unidades 4K
- Se você realmente precisar usá-los, crie o volume usando volblocksize maior ou igual a 32K; Há um impacto insignificante no desempenho e uma sobrecarga insignificante de uso do espaço (tamanhos maiores de blocos exigem menos preenchimento para alinhar corretamente).
- Prefira faixas de espelhos para seus pools; Esse layout tem benefícios de desempenho e menos surpresas relacionadas ao espaço como essa.
- A estimativa é claramente errada para os casos descritos acima, e isso é um bug no zfs.