{"id":83582,"date":"2020-06-01T19:42:21","date_gmt":"2020-06-01T17:42:21","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/osnovy-zfs-sistema-hraneniya-i-proizvoditelnost"},"modified":"2020-06-01T19:42:21","modified_gmt":"2020-06-01T17:42:21","slug":"osnovy-zfs-sistema-hraneniya-i-proizvoditelnost","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/osnovy-zfs-sistema-hraneniya-i-proizvoditelnost","title":{"rendered":"Fundamentos do ZFS: sistema de armazenamento e desempenho","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/70d75786f36a92a0407107fb79bee721.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNesta primavera, j\u00e1 discutimos alguns t\u00f3picos de introdu\u00e7\u00e3o, como <noindex><a rel=\"nofollow\" href=\"https:\/\/arstechnica.com\/gadgets\/2020\/02\/how-fast-are-your-disks-find-out-the-open-source-way-with-fio\/\">como verificar a velocidade dos seus discos<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/arstechnica.com\/information-technology\/2020\/04\/understanding-raid-how-performance-scales-from-one-disk-to-eight\/\">o que \u00e9 RAID<\/a><\/noindex>. No segundo, at\u00e9 prometemos continuar a explorar o desempenho de v\u00e1rias topologias de m\u00faltiplos discos no ZFS. Esta \u00e9 uma sistema de arquivos de pr\u00f3xima gera\u00e7\u00e3o que est\u00e1 sendo implementado em todos os lugares, desde <noindex><a rel=\"nofollow\" href=\"https:\/\/arstechnica.com\/gadgets\/2016\/06\/a-zfs-developers-analysis-of-the-good-and-bad-in-apples-new-apfs-file-system\/\">Apple<\/a><\/noindex> at\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/arstechnica.com\/information-technology\/2020\/05\/ubuntu-20-04-welcome-to-the-future-linux-lts-disciples\/\">Ubuntu<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nBem, hoje \u00e9 o dia mais apropriado para conhecer o ZFS, leitores curiosos. Apenas saibam que, segundo a estimativa modesta do desenvolvedor do OpenZFS, Matt Arenson, \"isso \u00e9 realmente complicado\".<\/p>\n<p>Mas antes de chegarmos aos n\u00fameros \u2014 e eles vir\u00e3o, prometo \u2014 sobre todas as op\u00e7\u00f5es de configura\u00e7\u00e3o de oito discos do ZFS, precisamos falar sobre <i>como<\/i> o ZFS armazena dados no disco.<\/p>\n<h1>Zpool, vdev e device<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/d881cb44e935480a6f2c30795d6afaf1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Este diagrama de pool completo inclui tr\u00eas vdevs auxiliares, um de cada classe, e quatro para RAIDz2<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/fa52fcf700cc72105a90e4ddc4724d9a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Normalmente, n\u00e3o h\u00e1 raz\u00e3o para criar um pool de tipos e tamanhos de vdev incompat\u00edveis \u2014 mas se voc\u00ea quiser, nada impede que voc\u00ea fa\u00e7a isso<\/i><\/p>\n<p>Para realmente entender o sistema de arquivos ZFS, \u00e9 necess\u00e1rio examinar cuidadosamente sua estrutura real. Em primeiro lugar, o ZFS combina os n\u00edveis tradicionais de gerenciamento de volumes e sistemas de arquivos. Em segundo lugar, utiliza um mecanismo transacional de c\u00f3pia na grava\u00e7\u00e3o. Essas caracter\u00edsticas significam que o sistema \u00e9 estruturalmente muito diferente dos sistemas de arquivos e matrizes RAID comuns. O primeiro conjunto de blocos de constru\u00e7\u00e3o fundamentais para entender: \u00e9 o pool de armazenamento (zpool), dispositivo virtual (vdev) e dispositivo real (device).<\/p>\n<h3>zpool<\/h3>\n<p>\nO pool de armazenamento zpool \u00e9 a estrutura mais alta do ZFS. Cada pool cont\u00e9m um ou mais dispositivos virtuais. Por sua vez, cada um deles cont\u00e9m um ou mais dispositivos reais (device). Os pools virtuais s\u00e3o blocos aut\u00f4nomos. Um computador f\u00edsico pode conter dois ou mais pools separados, mas cada um \u00e9 completamente independente dos outros. Os pools n\u00e3o podem compartilhar dispositivos virtuais.<\/p>\n<p>A redund\u00e2ncia do ZFS est\u00e1 no n\u00edvel dos dispositivos virtuais, e n\u00e3o no n\u00edvel dos pools. No n\u00edvel dos pools, n\u00e3o h\u00e1 absolutamente nenhuma redund\u00e2ncia \u2014 se algum armazenamento vdev ou vdev especial for perdido, todo o pool ser\u00e1 perdido junto.<\/p>\n<p>Os modernos pools de armazenamento podem sobreviver \u00e0 perda do cache ou do log do dispositivo virtual \u2013 embora possam perder uma pequena quantidade de dados sujos se o log do vdev for perdido durante uma queda de energia ou falha do sistema.<\/p>\n<p>H\u00e1 um equ\u00edvoco comum de que as \u00abfaixas de dados\u00bb (stripes) do ZFS s\u00e3o gravadas por todo o pool. Isso \u00e9 incorreto. Zpool n\u00e3o \u00e9 um RAID0 divertido, \u00e9 mais um divertido <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Non-RAID_drive_architectures#JBOD\">JBOD<\/a><\/noindex> com um complexo mecanismo vari\u00e1vel de distribui\u00e7\u00e3o.<\/p>\n<p>Em sua maior parte, as grava\u00e7\u00f5es s\u00e3o distribu\u00eddas entre os dispositivos virtuais dispon\u00edveis de acordo com o espa\u00e7o livre dispon\u00edvel, de modo que, teoricamente, todos eles ser\u00e3o preenchidos simultaneamente. Nas vers\u00f5es mais recentes do ZFS, o uso atual (utiliza\u00e7\u00e3o) do vdev \u00e9 considerado \u2013 se um dispositivo virtual estiver significativamente mais carregado que outro (por exemplo, devido \u00e0 carga de leitura), ele ser\u00e1 temporariamente ignorado para grava\u00e7\u00e3o, apesar de ter a maior taxa de espa\u00e7o livre.<\/p>\n<p>O mecanismo de determina\u00e7\u00e3o de utiliza\u00e7\u00e3o, embutido nos modernos m\u00e9todos de distribui\u00e7\u00e3o de gravuras do ZFS, pode reduzir a lat\u00eancia e aumentar a largura de banda durante per\u00edodos de carga incomumente alta \u2013 mas isso n\u00e3o <i>d\u00e1 liberdade total<\/i> para o involunt\u00e1rio agrupamento de HDDs lentos e SSDs r\u00e1pidos em um \u00fanico pool. Um pool desigual ainda funcionar\u00e1 na velocidade do dispositivo mais lento, ou seja, como se fosse composto inteiramente por esses dispositivos.<\/p>\n<h3>vdev<\/h3>\n<p>\nCada pool de armazenamento consiste em um ou mais dispositivos virtuais (virtual device, vdev). Por sua vez, cada vdev inclui um ou mais dispositivos reais. A maioria dos dispositivos virtuais \u00e9 usada para armazenamento simples de dados, mas existem v\u00e1rias classes auxiliares de vdev, incluindo CACHE, LOG e SPECIAL. Cada um desses tipos de vdev pode ter uma das cinco topologias: dispositivo \u00fanico (single-device), RAIDz1, RAIDz2, RAIDz3 ou espelho (mirror).<\/p>\n<p>RAIDz1, RAIDz2 e RAIDz3 s\u00e3o tipos especiais do que os antigos chamariam de RAID de paridade dupla (diagonal). O 1, 2 e 3 referem-se ao n\u00famero de blocos de paridade alocados para cada stripe de dados. Em vez de discos separados para fornecer paridade, os dispositivos RAIDz distribuem essa paridade de maneira semi-uniforme entre os discos. Um conjunto RAIDz pode perder tantos discos quantos forem seus blocos de paridade; se perder mais um, ele falhar\u00e1 e levar\u00e1 consigo o pool de armazenamento.<\/p>\n<p>Em dispositivos virtuais espelhados (mirror vdev), cada bloco \u00e9 armazenado em cada dispositivo no vdev. Embora os espelhos duplos (two-wide) sejam os mais comuns, um espelho pode ter qualquer n\u00famero arbitr\u00e1rio de dispositivos \u2014 em grandes instala\u00e7\u00f5es, para melhorar o desempenho de leitura e a resist\u00eancia a falhas, frequentemente utilizam-se espelhos triplos. Um espelho vdev pode sobreviver a qualquer falha, desde que pelo menos um dispositivo no vdev continue funcionando.<\/p>\n<p>Os vdevs \u00fanicos s\u00e3o inerentemente perigosos. Um dispositivo virtual desse tipo n\u00e3o sobreviver\u00e1 a nenhuma falha \u2014 e se usado como armazenamento ou vdev especial, sua falha resultar\u00e1 na destrui\u00e7\u00e3o de todo o pool. Tenha muito, muito cuidado aqui.<\/p>\n<p>Os dispositivos virtuais CACHE, LOG e SPECIAL podem ser criados em qualquer uma das topologias acima mencionadas \u2014 mas lembre-se que a perda de um dispositivo virtual SPECIAL significa a perda do pool, portanto, uma topologia redundante \u00e9 altamente recomendada.<\/p>\n<h3>dispositivo<\/h3>\n<p>\nTalvez este seja o termo mais f\u00e1cil de entender em ZFS \u2014 \u00e9 literalmente um dispositivo de bloco de acesso aleat\u00f3rio. Lembre-se de que os dispositivos virtuais s\u00e3o compostos de dispositivos separados e o pool \u00e9 feito de dispositivos virtuais.<\/p>\n<p>Discos \u2014 magn\u00e9ticos ou s\u00f3lidos \u2014 s\u00e3o os dispositivos de bloco mais comuns usados como blocos de constru\u00e7\u00e3o de vdev. No entanto, qualquer dispositivo com um descriptor em \/dev servir\u00e1 \u2014 assim, conjuntos RAID de hardware inteiros podem ser usados como dispositivos separados.<\/p>\n<p>Um arquivo raw simples \u00e9 um dos dispositivos de bloco alternativos mais importantes que podem ser usados para construir um vdev. Pools de teste de <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Sparse_file\">arquivos esparsos<\/a><\/noindex>\u00a0\u2014 s\u00e3o uma maneira muito pr\u00e1tica de testar comandos de pool e ver quanto espa\u00e7o est\u00e1 dispon\u00edvel em um pool ou dispositivo virtual daquela topologia.<\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/d9bea0e4a6842742a7dbac2f9b1ba394.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Voc\u00ea pode criar um pool de teste com arquivos esparsos em apenas alguns segundos \u2014 mas n\u00e3o se esque\u00e7a de remover todo o pool e seus componentes depois.<\/i> <\/p>\n<p>Vamos supor que voc\u00ea deseja montar um servidor com oito discos e planeja usar discos de 10 TB (~9300 GiB) \u2014 mas n\u00e3o tem certeza de qual topologia atende melhor \u00e0s suas necessidades. No exemplo acima, estamos construindo um pool de teste com arquivos esparsos em quest\u00e3o de segundos \u2014 e agora sabemos que um vdev RAIDz2 de oito discos de 10 TB fornece 50 TiB de capacidade \u00fatil.<\/p>\n<p>Outro tipo especial de dispositivos \u00e9 o SPARE (sobressalente). Dispositivos hot-swappable, ao contr\u00e1rio dos dispositivos normais, pertencem a todo o pool e n\u00e3o a um \u00fanico dispositivo virtual. Se algum vdev no pool falhar, e o dispositivo sobressalente estiver conectado ao pool e dispon\u00edvel, ele ser\u00e1 automaticamente alocado ao vdev afetado.<\/p>\n<p>Ap\u00f3s a aloca\u00e7\u00e3o ao vdev afetado, o dispositivo sobressalente come\u00e7a a receber c\u00f3pias ou reconstru\u00e7\u00f5es dos dados que deveriam estar no dispositivo ausente. Em RAID tradicional, isso \u00e9 chamado de reconstru\u00e7\u00e3o, enquanto no ZFS isso \u00e9 denominado \"restaura\u00e7\u00e3o de redund\u00e2ncia\" (resilvering).<\/p>\n<p>\u00c9 importante notar que dispositivos sobressalentes n\u00e3o substituem permanentemente dispositivos com falha. Esta \u00e9 apenas uma substitui\u00e7\u00e3o tempor\u00e1ria para reduzir o tempo durante o qual o vdev apresenta degrada\u00e7\u00e3o. Assim que o administrador substituir o dispositivo com falha do vdev, ocorre a restaura\u00e7\u00e3o de redund\u00e2ncia para este dispositivo permanente, enquanto o SPARE se desconecta do vdev e volta a ser um dispositivo sobressalente para todo o pool.<\/p>\n<h1>Conjuntos de dados, blocos e setores<\/h1>\n<p>\nO pr\u00f3ximo conjunto de blocos de constru\u00e7\u00e3o que precisamos entender em nossa jornada pelo ZFS refere-se n\u00e3o tanto ao hardware, mas a como os pr\u00f3prios dados s\u00e3o organizados e armazenados. Aqui, estamos pulando alguns n\u00edveis \u2014 como o metaslab \u2014 para n\u00e3o sobrecarregar os detalhes, mantendo a compreens\u00e3o da estrutura geral.<\/p>\n<h3>Conjunto de dados (dataset)<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/6a4dc218bd1c57989739d5072f13804c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Quando criamos um conjunto de dados pela primeira vez, ele mostra todo o espa\u00e7o dispon\u00edvel do pool. Em seguida, estabelecemos uma cota \u2014 e mudamos o ponto de montagem. \u00c9 m\u00e1gica!<\/i> <\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/aeb6763d6e78e3cc7ee8b1d39ee98b46.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Zvol \u00e9 em grande parte apenas um conjunto de dados livre de sua camada de sistema de arquivos, que substitu\u00edmos aqui por um sistema de arquivos ext4 totalmente normal.<\/i> <\/p>\n<p>O conjunto de dados ZFS \u00e9 aproximadamente an\u00e1logo a um sistema de arquivos montado padr\u00e3o. Assim como um sistema de arquivos comum, \u00e0 primeira vista, ele pode parecer \"apenas mais uma pasta\". Mas, assim como nos sistemas de arquivos comuns, cada conjunto de dados ZFS possui seu pr\u00f3prio conjunto de propriedades b\u00e1sicas.<\/p>\n<p>Em primeiro lugar, um conjunto de dados pode ter uma cota atribu\u00edda. Se voc\u00ea definir <code>zfs set quota=100G poolname\/datasetname<\/code>, voc\u00ea n\u00e3o conseguir\u00e1 gravar na pasta montada <code>\/poolname\/datasetname<\/code> mais do que 100 GiB.<\/p>\n<p>Notou a presen\u00e7a \u2014 e a aus\u00eancia \u2014 de barras no in\u00edcio de cada linha? Cada conjunto de dados tem seu lugar tanto na hierarquia ZFS quanto na hierarquia de montagem do sistema. Na hierarquia ZFS n\u00e3o h\u00e1 uma barra inicial \u2014 voc\u00ea come\u00e7a com o nome do pool e, em seguida, o caminho de um conjunto de dados para outro. Por exemplo, <code>pool\/parent\/child<\/code> para um conjunto de dados chamado <code>child<\/code> sob o conjunto de dados pai <code>parent<\/code> em um pool com o nome criativo <code>pool<\/code>.<\/p>\n<p>Por padr\u00e3o, o ponto de montagem do conjunto de dados ser\u00e1 equivalente ao seu nome na hierarquia ZFS, com uma barra no in\u00edcio \u2014 o pool com o nome <code>pool<\/code> ser\u00e1 montado como <code>\/pool<\/code>, o conjunto de dados <code>parent<\/code> ser\u00e1 montado em <code>\/pool\/parent<\/code>, e o conjunto de dados filho <code>child<\/code> ser\u00e1 montado em <code>\/pool\/parent\/child<\/code>. No entanto, o ponto de montagem do sistema para o conjunto de dados pode ser alterado.<\/p>\n<p>Se especificarmos <code>zfs set mountpoint=\/lol pool\/parent\/child<\/code>, ent\u00e3o o conjunto de dados <code>pool\/parent\/child<\/code> ser\u00e1 montado no sistema como <code>\/lol<\/code>.<\/p>\n<p>Al\u00e9m dos conjuntos de dados, devemos mencionar os volumes (zvols). O volume \u00e9 aproximadamente an\u00e1logo a um conjunto de dados, exceto que ele n\u00e3o possui um sistema de arquivos real \u2014 \u00e9 apenas um dispositivo de bloco. Voc\u00ea pode, por exemplo, criar <code>zvol<\/code> com o nome <code>mypool\/myzvol<\/code>, ent\u00e3o format\u00e1-lo com um sistema de arquivos ext4 e, em seguida, montar esse sistema de arquivos \u2014 agora voc\u00ea tem um sistema de arquivos ext4, mas com suporte a todos os recursos de seguran\u00e7a do ZFS! Isso pode parecer estranho em um \u00fanico computador, mas faz muito mais sentido como backend ao exportar um dispositivo iSCSI.<\/p>\n<h3>Blocos<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/ce96416cd2fa08ff615f13ccec72e838.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Um arquivo \u00e9 representado por um ou mais blocos. Cada bloco \u00e9 armazenado em um \u00fanico dispositivo virtual. O tamanho do bloco geralmente \u00e9 igual ao par\u00e2metro <b>recordsize<\/b>, mas pode ser reduzido para <b>2^ashift<\/b>, se contiver metadados ou um arquivo pequeno.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/f31c25e34af12a9a96b60a46c2924053.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00f3s realmente, <b>realmente<\/b> n\u00e3o estamos brincando sobre o enorme impacto no desempenho, se definir um ashift muito pequeno.<\/i><\/p>\n<p>No pool ZFS, todos os dados, incluindo metadados, s\u00e3o armazenados em blocos. O tamanho m\u00e1ximo do bloco para cada conjunto de dados \u00e9 determinado pela propriedade <code>recordsize<\/code> (tamanho do registro). O tamanho do registro pode variar, mas isso n\u00e3o alterar\u00e1 o tamanho ou a localiza\u00e7\u00e3o de quaisquer blocos que j\u00e1 tenham sido gravados no conjunto de dados - ele se aplica apenas a novos blocos \u00e0 medida que s\u00e3o gravados.<\/p>\n<p>Se n\u00e3o for especificado de outra forma, o tamanho do registro atual padr\u00e3o \u00e9 de 128 KiB. \u00c9 uma esp\u00e9cie de compromisso razo\u00e1vel, onde o desempenho n\u00e3o ser\u00e1 ideal, mas tamb\u00e9m n\u00e3o ser\u00e1 horr\u00edvel na maioria dos casos. <code>Tamanho do registro<\/code> pode ser ajustado para qualquer valor de 4K a 1M (com configura\u00e7\u00f5es adicionais <code>recordsize<\/code> pode ser definido ainda maior, mas isso raramente \u00e9 uma boa ideia).<\/p>\n<p>Qualquer bloco se refere a dados de um \u00fanico arquivo - voc\u00ea n\u00e3o pode colocar dois arquivos diferentes em um bloco. Cada arquivo consiste de um ou mais blocos, dependendo do tamanho. Se o tamanho do arquivo for menor que o tamanho do registro, ele ser\u00e1 armazenado em um bloco menor - por exemplo, um bloco com um arquivo de 2 KiB ocupar\u00e1 apenas um setor de 4 KiB no disco.<\/p>\n<p>Se o arquivo for grande o suficiente e exigir v\u00e1rios blocos, todas as grava\u00e7\u00f5es com esse arquivo ter\u00e3o um tamanho <code>recordsize<\/code>\u00a0\u2014 incluindo a \u00faltima grava\u00e7\u00e3o, cuja maior parte pode ser <noindex><a rel=\"nofollow\" href=\"https:\/\/whatis.techtarget.com\/definition\/slack-space-file-slack-space\">espa\u00e7o n\u00e3o utilizado<\/a><\/noindex>.<\/p>\n<p>Os volumes zvol n\u00e3o t\u00eam a propriedade <code>recordsize<\/code>\u00a0\u2014 em vez disso, eles t\u00eam uma propriedade equivalente <code>volblocksize<\/code>.<\/p>\n<h3>Setores<\/h3>\n<p>\nO \u00faltimo e mais b\u00e1sico bloco de constru\u00e7\u00e3o \u00e9 o setor. Esta \u00e9 a menor unidade f\u00edsica que pode ser gravada ou lida do dispositivo base. Durante v\u00e1rias d\u00e9cadas, a maioria dos discos usou setores de 512 bytes. Recentemente, a maioria dos discos est\u00e1 configurada para setores de 4 KiB, e alguns - especialmente SSDs - t\u00eam setores de 8 KiB ou at\u00e9 mais.<\/p>\n<p>No sistema ZFS, h\u00e1 uma propriedade que permite definir manualmente o tamanho do setor. Esta propriedade <code>ashift<\/code>. \u00c9 um pouco confuso que ashift seja uma pot\u00eancia de dois. Por exemplo, <code>ashift=9<\/code> significa um tamanho de setor de 2^9, ou 512 bytes.<\/p>\n<p>O ZFS solicita ao sistema operacional informa\u00e7\u00f5es detalhadas sobre cada dispositivo de bloco quando \u00e9 adicionado a um novo vdev e teoricamente ajusta automaticamente o ashift corretamente com base nessas informa\u00e7\u00f5es. Infelizmente, muitos discos mentem sobre o tamanho de seu setor para manter a compatibilidade com o Windows XP (que era incapaz de entender discos com tamanhos de setor diferentes).<\/p>\n<p>Isso significa que \u00e9 fortemente recomendado que o administrador do ZFS conhe\u00e7a o tamanho real do setor de seus dispositivos e configure manualmente <code>ashift<\/code>. Se um ashift muito pequeno for configurado, o n\u00famero de opera\u00e7\u00f5es de leitura\/grava\u00e7\u00e3o aumenta astronomicamente. Por exemplo, gravar \"setores\" de 512 bytes em um setor real de 4 KiB significa que \u00e9 necess\u00e1rio gravar o primeiro \"setor\", depois ler o setor de 4 KiB, modific\u00e1-lo com o segundo \"setor\" de 512 bytes, grav\u00e1-lo de volta em um novo setor de 4 KiB e assim por diante para cada grava\u00e7\u00e3o.<\/p>\n<p>No mundo real, essa penaliza\u00e7\u00e3o atinge os SSDs Samsung EVO, para os quais deve ser aplicada <code>ashift=13<\/code>, mas esses SSDs mentem sobre seu tamanho de setor e, portanto, por padr\u00e3o \u00e9 definido <code>ashift=9<\/code>. Se um administrador de sistema experiente n\u00e3o alterar essa configura\u00e7\u00e3o, esse SSD funcionar\u00e1 <i>mais devagar<\/i> do que um HDD magn\u00e9tico comum.<\/p>\n<p>Em compara\u00e7\u00e3o, para um tamanho muito grande <code>ashift<\/code> praticamente n\u00e3o h\u00e1 penaliza\u00e7\u00e3o. N\u00e3o h\u00e1 redu\u00e7\u00e3o real de desempenho, e o aumento do espa\u00e7o n\u00e3o utilizado \u00e9 infinitesimal (ou igual a zero com a compress\u00e3o ativada). Portanto, recomendamos fortemente que at\u00e9 mesmo os discos que realmente utilizam setores de 512 bytes configurem <code>ashift=12<\/code> ou at\u00e9 mesmo <code>ashift=13<\/code>, para ter uma vis\u00e3o segura do futuro.<\/p>\n<p>A propriedade <code>ashift<\/code> \u00e9 configurado para cada dispositivo virtual vdev, e <i>n\u00e3o para o pool<\/i>, como muitos pensam erroneamente \u2014 e n\u00e3o \u00e9 alterado ap\u00f3s a configura\u00e7\u00e3o. Se voc\u00ea acidentalmente desviar <code>ashift<\/code> ao adicionar um novo vdev ao pool, voc\u00ea contaminou irreversivelmente esse pool com um dispositivo de baixo desempenho e, em geral, n\u00e3o h\u00e1 outra sa\u00edda a n\u00e3o ser destruir o pool e come\u00e7ar tudo de novo. Mesmo a remo\u00e7\u00e3o do vdev n\u00e3o salvar\u00e1 a configura\u00e7\u00e3o desvirtuada. <code>ashift<\/code>!<\/p>\n<h3>O mecanismo de c\u00f3pia ao escrever<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/eb222dbcc3de428ff2b1c2c72b145db0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Se um sistema de arquivos normal precisar reescrever dados \u2014 ele altera cada bloco onde est\u00e1 localizado.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/ba2474808b32667902966e4c9e69081a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>O sistema de arquivos com c\u00f3pia sob demanda grava uma nova vers\u00e3o do bloco e, em seguida, desbloqueia a vers\u00e3o antiga.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/3b00dad44eb588ed793d2d5df7852892.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>De maneira abstrata, se ignorarmos a localiza\u00e7\u00e3o f\u00edsica real dos blocos, nossa \"cometa de dados\" se simplifica para um \"verme de dados\" que se move da esquerda para a direita no mapa do espa\u00e7o dispon\u00edvel.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/8c2c38dbc8a5e633c466d5c7f230951f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Agora podemos ter uma boa compreens\u00e3o de como funcionam os snapshots de c\u00f3pia sob demanda \u2014 cada bloco pode pertencer a v\u00e1rios snapshots e ser\u00e1 mantido at\u00e9 que todos os snapshots associados sejam destru\u00eddos.<\/i><\/p>\n<p>O mecanismo de c\u00f3pia sob demanda (Copy on Write, CoW) \u00e9 a base fundamental do que torna o ZFS um sistema t\u00e3o impressionante. O conceito principal \u00e9 simples \u2014 se voc\u00ea pedir a um sistema de arquivos tradicional para alterar um arquivo, ele far\u00e1 exatamente o que voc\u00ea pediu. Se voc\u00ea pedir a um sistema de arquivos com c\u00f3pia sob demanda para fazer o mesmo, ele dir\u00e1 \"ok\" \u2014 mas te enganar\u00e1.<\/p>\n<p>Em vez disso, o sistema de arquivos com c\u00f3pia sob demanda grava uma nova vers\u00e3o do bloco alterado e, em seguida, atualiza os metadados do arquivo para quebrar a conex\u00e3o com o bloco antigo e vincul\u00e1-lo ao novo bloco que voc\u00ea acabou de gravar.<\/p>\n<p>Desvincular o bloco antigo e vincular o novo \u00e9 feito em uma \u00fanica opera\u00e7\u00e3o, portanto, n\u00e3o pode ser interrompido \u2014 se voc\u00ea cortar a energia ap\u00f3s isso ocorrer, voc\u00ea ter\u00e1 uma nova vers\u00e3o do arquivo, e se voc\u00ea cortar a energia antes, ter\u00e1 a vers\u00e3o antiga. Em qualquer dos casos, n\u00e3o haver\u00e1 conflitos no sistema de arquivos.<\/p>\n<p>A c\u00f3pia sob demanda no ZFS ocorre n\u00e3o apenas no n\u00edvel do sistema de arquivos, mas tamb\u00e9m no n\u00edvel de gerenciamento de discos. Isso significa que o ZFS n\u00e3o est\u00e1 sujeito ao problema de grava\u00e7\u00e3o (<noindex><a rel=\"nofollow\" href=\"http:\/\/www.raid-recovery-guide.com\/raid5-write-hole.aspx\">buraco no RAID<\/a><\/noindex>) \u2014 um fen\u00f4meno onde a faixa foi apenas parcialmente gravada antes da falha do sistema, resultando em corrup\u00e7\u00e3o do array ap\u00f3s a reinicializa\u00e7\u00e3o. Aqui, a faixa \u00e9 gravada de forma at\u00f4mica, o vdev \u00e9 sempre consistente, e <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Bob%27s_your_uncle\">Bob \u00e9 seu tio<\/a><\/noindex>.<\/p>\n<h3>ZIL: log de inten\u00e7\u00f5es do ZFS<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/8d08b7bce60a1e3698fd0ec02494e6fe.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>O sistema ZFS trata grava\u00e7\u00f5es s\u00edncronas de maneira especial \u2014 ele as armazena temporariamente, mas imediatamente, no ZIL, antes de grav\u00e1-las de forma permanente juntamente com as grava\u00e7\u00f5es ass\u00edncronas.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/2119ef409a7d8c9599ee63292452d80d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Normalmente, os dados gravados no ZIL nunca mais s\u00e3o lidos. Mas isso \u00e9 poss\u00edvel ap\u00f3s uma falha do sistema.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/88a62163b0fb9f14a41102821dfabb5f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>SLOG, ou dispositivo LOG secund\u00e1rio, \u00e9 simplesmente um vdev especial - e, preferencialmente, muito r\u00e1pido - onde o ZIL pode ser armazenado separadamente do armazenamento principal.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/819f7c21714adafe226028e95990f1df.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Ap\u00f3s uma falha, todos os dados sujos no ZIL s\u00e3o reproduzidos - neste caso, o ZIL est\u00e1 no SLOG, ent\u00e3o eles s\u00e3o reproduzidos precisamente de l\u00e1.<\/i><\/p>\n<p>Existem duas categorias principais de opera\u00e7\u00f5es de grava\u00e7\u00e3o - s\u00edncronas (sync) e ass\u00edncronas (async). Para a maioria das cargas de trabalho, a grande maioria das opera\u00e7\u00f5es de grava\u00e7\u00e3o \u00e9 ass\u00edncrona - o sistema de arquivos permite agreg\u00e1-las e emit\u00ed-las em pacotes, reduzindo a fragmenta\u00e7\u00e3o e aumentando significativamente a largura de banda.<\/p>\n<p>As grava\u00e7\u00f5es s\u00edncronas s\u00e3o uma hist\u00f3ria completamente diferente. Quando um aplicativo solicita uma grava\u00e7\u00e3o s\u00edncrona, ele diz ao sistema de arquivos: \"Voc\u00ea precisa fixar isso na mem\u00f3ria n\u00e3o vol\u00e1til. <i>neste momento.<\/i>, e at\u00e9 l\u00e1 n\u00e3o posso fazer mais nada.\" Por isso, as grava\u00e7\u00f5es s\u00edncronas devem ser imediatamente fixadas no disco - e se isso aumentar a fragmenta\u00e7\u00e3o ou reduzir a largura de banda, que assim seja.<\/p>\n<p>O ZFS lida com grava\u00e7\u00f5es s\u00edncronas de maneira diferente das sistemas de arquivos tradicionais - em vez de empurr\u00e1-las imediatamente para o armazenamento normal, o ZFS as fixa em uma \u00e1rea de armazenamento especial chamada ZFS Intent Log, ou ZIL. A sacada \u00e9 que essas grava\u00e7\u00f5es <i>tamb\u00e9m<\/i> permanecem na mem\u00f3ria, sendo agregadas juntamente com as solicita\u00e7\u00f5es de grava\u00e7\u00e3o ass\u00edncronas normais, para serem posteriormente descartadas no armazenamento como TXG (grupos de transa\u00e7\u00f5es, Transaction Groups) completamente normais.<\/p>\n<p>No modo de opera\u00e7\u00e3o normal, o ZIL \u00e9 gravado e nunca mais lido. Quando, ap\u00f3s alguns momentos, as grava\u00e7\u00f5es do ZIL s\u00e3o fixadas no armazenamento principal nos TXGs normais da mem\u00f3ria, elas s\u00e3o desanexadas do ZIL. A \u00fanica vez que algo \u00e9 lido do ZIL \u00e9 durante a importa\u00e7\u00e3o do pool.<\/p>\n<p>Se ocorrer uma falha no ZFS - falha do sistema operacional ou desligamento de energia - quando h\u00e1 dados no ZIL, esses dados ser\u00e3o lidos durante a pr\u00f3xima importa\u00e7\u00e3o do pool (por exemplo, ao reiniciar um sistema de recupera\u00e7\u00e3o). Tudo que estiver no ZIL ser\u00e1 lido, combinado em grupos TXG, fixado no armazenamento principal e, em seguida, desanexado do ZIL durante o processo de importa\u00e7\u00e3o.<\/p>\n<p>Uma das classes auxiliares do vdev \u00e9 chamada de LOG ou SLOG, que \u00e9 um dispositivo LOG secund\u00e1rio. Sua \u00fanica fun\u00e7\u00e3o \u00e9 fornecer ao pool um dispositivo vdev separado e, de prefer\u00eancia, muito mais r\u00e1pido, com alta resist\u00eancia \u00e0 grava\u00e7\u00e3o, para armazenar o ZIL, em vez de armazenar o ZIL no armazenamento vdev principal. O ZIL em si se comporta da mesma forma, independentemente do local de armazenamento, mas se um vdev com LOG tem um desempenho de grava\u00e7\u00e3o muito alto, as grava\u00e7\u00f5es s\u00edncronas ocorrer\u00e3o mais rapidamente.<\/p>\n<p>Adicionar um vdev com LOG ao pool de nenhuma forma <b>pode<\/b> melhorar o desempenho de grava\u00e7\u00e3o ass\u00edncrona \u2014 mesmo que voc\u00ea force todas as grava\u00e7\u00f5es no ZIL com <code>zfs set sync=always<\/code>, elas ainda estar\u00e3o ligadas ao armazenamento principal no TXG da mesma forma e no mesmo ritmo que sem o log. A \u00fanica melhora direta no desempenho \u00e9 a lat\u00eancia de grava\u00e7\u00e3o s\u00edncrona (j\u00e1 que uma velocidade maior do log acelera a execu\u00e7\u00e3o das opera\u00e7\u00f5es <code>sync<\/code>).<\/p>\n<p>Entretanto, em um ambiente que j\u00e1 requer um grande n\u00famero de grava\u00e7\u00f5es s\u00edncronas, o vdev LOG pode indiretamente acelerar grava\u00e7\u00f5es ass\u00edncronas e leituras n\u00e3o em cache. O descarregamento de grava\u00e7\u00f5es ZIL para um vdev LOG separado significa menos competi\u00e7\u00e3o por IOPS no armazenamento prim\u00e1rio, o que em certa medida melhora o desempenho de todas as opera\u00e7\u00f5es de leitura e grava\u00e7\u00e3o.<\/p>\n<h3>Snapshots<\/h3>\n<p>\nO mecanismo de c\u00f3pia em grava\u00e7\u00e3o tamb\u00e9m \u00e9 uma base necess\u00e1ria para instant\u00e2neas at\u00f4micas do ZFS e replica\u00e7\u00e3o ass\u00edncrona incremental. Em um sistema de arquivos ativo, existe uma \u00e1rvore de ponteiros que marca todas as grava\u00e7\u00f5es com os dados atuais \u2014 quando voc\u00ea cria um snapshot, est\u00e1 apenas fazendo uma c\u00f3pia dessa \u00e1rvore de ponteiros.<\/p>\n<p>Quando uma grava\u00e7\u00e3o \u00e9 reescrita em um sistema de arquivos ativo, o ZFS primeiro grava uma nova vers\u00e3o do bloco em um espa\u00e7o n\u00e3o utilizado. Ent\u00e3o, ele desvincula a vers\u00e3o antiga do bloco do sistema de arquivos atual. Mas se algum snapshot fizer refer\u00eancia ao bloco antigo, ele permanece inalterado. O bloco antigo, de fato, n\u00e3o ser\u00e1 recuperado como espa\u00e7o livre at\u00e9 que todos os snapshots que referenciam esse bloco sejam destru\u00eddos!<\/p>\n<h3>Replica\u00e7\u00e3o<\/h3>\n<p>\n<img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/647fe6cc348861b653b004640244cf88.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Minha biblioteca Steam em 2015 ocupava 158 GiB e inclu\u00eda 126.927 arquivos. Isso \u00e9 bastante pr\u00f3ximo da situa\u00e7\u00e3o ideal para rsync \u2014 a replica\u00e7\u00e3o do ZFS pela rede foi \"apenas\" 750% mais r\u00e1pida.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/2849be8d2dc5c9f30f23c3bbc20e9022.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Na mesma rede, a replica\u00e7\u00e3o de um arquivo de imagem de m\u00e1quina virtual Windows 7 de 40 gibibytes \u00e9 uma hist\u00f3ria completamente diferente. A replica\u00e7\u00e3o ZFS ocorre 289 vezes mais r\u00e1pida do que o rsync \u2014 ou 'apenas' 161 vezes mais r\u00e1pida, se voc\u00ea souber usar o rsync com a op\u00e7\u00e3o \u2014inplace.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Fundamentos do ZFS: sistema de armazenamento e desempenho\" src=\"\/wp-content\/uploads\/2020\/06\/9a57e4faa0eaf0f687ae24b965a1bf81.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Quando a imagem da m\u00e1quina virtual \u00e9 escalada, os problemas do rsync tamb\u00e9m escalonam. Um tamanho de 1,9 TiB n\u00e3o \u00e9 t\u00e3o grande para uma imagem de m\u00e1quina virtual moderna \u2014 mas \u00e9 grande o suficiente para que a replica\u00e7\u00e3o ZFS seja 1148 vezes mais r\u00e1pida que o rsync, mesmo com o argumento rsync \u2014inplace.<\/i><\/p>\n<p>Assim que voc\u00ea entender como funcionam os snapshots, n\u00e3o ser\u00e1 dif\u00edcil captar a ess\u00eancia da replica\u00e7\u00e3o. Como um snapshot \u00e9 apenas uma \u00e1rvore de ponteiros para os registros, isso implica que, ao fazermos <code>zfs send<\/code> de um snapshot, enviamos tanto essa \u00e1rvore quanto todos os registros associados a ela. Quando transferimos isso para <code>zfs send<\/code> em <code>zfs receive<\/code> no objeto de destino, ele grava tanto o conte\u00fado real do bloco quanto a \u00e1rvore de ponteiros que se referem aos blocos no conjunto de dados de destino.<\/p>\n<p>As coisas ficam ainda mais interessantes na segunda <code>zfs send<\/code>. Agora temos dois sistemas, cada um contendo <code>poolname\/datasetname@1<\/code>, e voc\u00ea tira um novo snapshot <code>poolname\/datasetname@2<\/code>. Portanto, no pool de origem, voc\u00ea tem <code>datasetname@1<\/code> e <code>datasetname@2<\/code>, e no pool de destino, apenas o primeiro snapshot por enquanto. <code>datasetname@1<\/code>.<\/p>\n<p>Como temos um snapshot compartilhado entre a fonte e o destino <code>datasetname@1<\/code>, podemos fazer <i>incremental<\/i> <code>zfs send<\/code> sobre ele. Quando dizemos ao sistema <code>zfs send -i poolname\/datasetname@1 poolname\/datasetname@2<\/code>, ele compara as duas \u00e1rvores de ponteiros. Qualquer ponteiro que exista apenas em <code>@2<\/code>, obviamente, aponta para novos blocos \u2014 ent\u00e3o precisaremos do conte\u00fado desses blocos.<\/p>\n<p>No sistema remoto, o processamento incremental <code>send<\/code> \u00e9 igualmente simples. Primeiro, gravamos todos os novos registros inclu\u00eddos no fluxo <code>send<\/code>, e ent\u00e3o adicionamos ponteiros para esses blocos. Voil\u00e0, temos <code>@2<\/code> no novo sistema!<\/p>\n<p>A replica\u00e7\u00e3o incremental ass\u00edncrona do ZFS \u00e9 uma grande melhoria em rela\u00e7\u00e3o aos m\u00e9todos anteriores que n\u00e3o s\u00e3o baseados em snapshots, como o rsync. Em ambos os casos, apenas os dados alterados s\u00e3o transferidos \u2014 mas o rsync deve primeiro <i>ler<\/i> ler todos os dados de ambos os lados do disco para verificar a soma e compar\u00e1-la. Em contraste, a replica\u00e7\u00e3o ZFS n\u00e3o l\u00ea nada al\u00e9m das \u00e1rvores de ponteiros \u2014 e quaisquer blocos que n\u00e3o estejam representados no snapshot compartilhado.<\/p>\n<h3>Compress\u00e3o embutida<\/h3>\n<p>\nO mecanismo de c\u00f3pia na grava\u00e7\u00e3o tamb\u00e9m simplifica o sistema de compress\u00e3o embutida. Em sistemas de arquivos tradicionais, a compress\u00e3o \u00e9 problem\u00e1tica \u2014 tanto a vers\u00e3o antiga quanto a nova dos dados alterados ocupam o mesmo espa\u00e7o.<\/p>\n<p>Se analisarmos um fragmento de dados no meio de um arquivo, que come\u00e7a sua vida como um megabyte de zeros a partir de 0x00000000 e assim por diante \u2014 ele pode ser facilmente compactado para um \u00fanico setor no disco. Mas o que acontece se substitu\u00edmos esse megabyte de zeros por um megabyte de dados n\u00e3o compact\u00e1veis, como JPEG ou ru\u00eddo pseudoaleat\u00f3rio? De repente, esse megabyte de dados exigir\u00e1 n\u00e3o um, mas 256 setores de 4 KiB, e nesse local no disco est\u00e1 reservado apenas um setor.<\/p>\n<p>O ZFS n\u00e3o tem esse problema, uma vez que as grava\u00e7\u00f5es alteradas s\u00e3o sempre escritas em espa\u00e7o n\u00e3o utilizado \u2014 o bloco original ocupa apenas um setor de 4 KiB, e a nova grava\u00e7\u00e3o ocupar\u00e1 256, mas isso n\u00e3o \u00e9 um problema \u2014 o fragmento recentemente modificado do \"meio\" do arquivo seria gravado em espa\u00e7o n\u00e3o utilizado, independentemente de ter mudado de tamanho ou n\u00e3o, portanto, para o ZFS isso \u00e9 uma situa\u00e7\u00e3o bastante comum.<\/p>\n<p>A compress\u00e3o embutida do ZFS est\u00e1 desativada por padr\u00e3o, e o sistema oferece algoritmos plug\u00e1veis \u2014 atualmente, entre eles est\u00e3o o LZ4, gzip (1-9), LZJB e ZLE.<\/p>\n<ul>\n<li><b>LZ4<\/b> \u2014 \u00e9 um algoritmo de streaming que oferece compress\u00e3o e descompress\u00e3o extremamente r\u00e1pidas, al\u00e9m de ganhos de desempenho para a maioria dos casos de uso \u2014 mesmo em CPUs relativamente lentas.\n<\/li>\n<li><b>GZIP<\/b> \u2014 um algoritmo respeit\u00e1vel que \u00e9 conhecido e amado por todos os usu\u00e1rios de sistemas Unix. Ele pode ser implementado com n\u00edveis de compress\u00e3o de 1-9, com um aumento no grau de compress\u00e3o e uso da CPU conforme se aproxima do n\u00edvel 9. O algoritmo \u00e9 bem adequado para todos os casos de uso textuais (ou outros altamente compress\u00edveis), mas, caso contr\u00e1rio, frequentemente causa problemas com a CPU \u2014 use-o com cautela, especialmente em n\u00edveis mais altos.\n<\/li>\n<li><b>LZJB<\/b> \u2014 o algoritmo original do ZFS. Ele est\u00e1 obsoleto e n\u00e3o deve mais ser utilizado, o LZ4 o supera em todos os aspectos.\n<\/li>\n<li><b>ZLE<\/b> \u2014 codifica\u00e7\u00e3o de n\u00edvel zero, Zero Level Encoding. Ela, de fato, n\u00e3o afeta os dados normais, mas comprime grandes sequ\u00eancias de zeros. \u00c9 \u00fatil para conjuntos de dados totalmente incomprim\u00edveis (por exemplo, JPEG, MP4 ou outros formatos j\u00e1 comprimidos), pois ignora dados incomprim\u00edveis, mas comprime o espa\u00e7o n\u00e3o utilizado nas grava\u00e7\u00f5es finais.<\/li>\n<\/ul>\n<p>\nRecomendamos a compress\u00e3o LZ4 para praticamente todas as aplica\u00e7\u00f5es; a penaliza\u00e7\u00e3o de desempenho ao encontrar dados incomprim\u00edveis \u00e9 muito baixa, e <i>aumento<\/i> de desempenho para dados t\u00edpicos \u00e9 significativo. Copiar a imagem de uma m\u00e1quina virtual para uma nova instala\u00e7\u00e3o do sistema operacional Windows (sistema operacional rec\u00e9m-instalado, sem dados contidos ainda) com <code>compression=lz4<\/code> ocorreu 27% mais r\u00e1pido do que com <code>compression=none<\/code>, neste teste de 2015 <noindex><a rel=\"nofollow\" href=\"https:\/\/jrs-s.net\/2015\/02\/24\/zfs-compression-yes-you-want-this\/\">ARC \u2014 cache adaptativo de substitui\u00e7\u00e3o<\/a><\/noindex>.<\/p>\n<h1>ZFS \u00e9 o \u00fanico sistema de arquivos moderno que conhecemos que utiliza seu pr\u00f3prio mecanismo de cache de leitura, ao inv\u00e9s de depender do cache de p\u00e1ginas do sistema operacional para armazenar c\u00f3pias de blocos lidos recentemente na mem\u00f3ria RAM.<\/h1>\n<p>\nEmbora o cache pr\u00f3prio n\u00e3o esteja isento de problemas \u2014 o ZFS n\u00e3o pode responder a novas solicita\u00e7\u00f5es de aloca\u00e7\u00e3o de mem\u00f3ria t\u00e3o rapidamente quanto o n\u00facleo, portanto, uma nova chamada<\/p>\n<p>malloc() <code>para aloca\u00e7\u00e3o de mem\u00f3ria pode falhar se precisar da mem\u00f3ria RAM atualmente ocupada pelo ARC. Mas h\u00e1 boas raz\u00f5es para usar o cache pr\u00f3prio, pelo menos agora.<\/code> Todos os sistemas operacionais modernos conhecidos, incluindo MacOS, Windows, Linux e BSD, utilizam o algoritmo LRU (Least Recently Used) para implementar o cache de p\u00e1ginas. Este \u00e9 um algoritmo primitivo que promove o bloco em cache \"para cima na fila\" ap\u00f3s cada leitura e expulsa blocos \u201cpara baixo na fila\u201d conforme necess\u00e1rio para adicionar novos misses de cache (blocos que deveriam ter sido lidos do disco, e n\u00e3o do cache) para cima.<\/p>\n<p>Geralmente, o algoritmo funciona bem, mas em sistemas com grandes conjuntos de dados, o LRU facilmente leva \u00e0 thrashing \u2014 expulsando blocos frequentemente necess\u00e1rios para liberar espa\u00e7o para blocos que nunca mais ser\u00e3o lidos do cache.<\/p>\n<p>ARC<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Adaptive_replacement_cache\">ARC<\/a><\/noindex>\u00a0\u2014 um algoritmo muito menos ing\u00eanuo, que pode ser considerado como um cache \"ponderado\". Ap\u00f3s cada leitura de um bloco em cache, ele se torna um pouco mais \"pesado\" e \u00e9 mais dif\u00edcil de ser desalojado \u2014 e mesmo ap\u00f3s ser desalojado, o bloco <i>\u00e9 rastreado<\/i> durante um determinado per\u00edodo de tempo. Um bloco que foi desalojado, mas que depois deve ser lido de volta para o cache, tamb\u00e9m se tornar\u00e1 \"mais pesado\".<\/p>\n<p>O resultado final de tudo isso \u00e9 um cache com uma taxa de acerto (hit ratio) muito maior \u2014 a rela\u00e7\u00e3o entre acertos no cache (leituras realizadas a partir do cache) e faltas (leituras do disco). Esta \u00e9 uma estat\u00edstica extremamente importante \u2014 n\u00e3o apenas os acertos do cache s\u00e3o atendidos muito mais rapidamente, mas as faltas do cache tamb\u00e9m podem ser atendidas mais rapidamente, pois quanto mais acertos no cache, menos solicita\u00e7\u00f5es paralelas ao disco e menor a lat\u00eancia para aquelas faltas restantes que precisam ser atendidas do disco.<\/p>\n<h1>Conclus\u00e3o<\/h1>\n<p>\nDepois de estudar a sem\u00e2ntica b\u00e1sica do ZFS \u2014 como funciona a c\u00f3pia em grava\u00e7\u00e3o, bem como as rela\u00e7\u00f5es entre pools de armazenamento, dispositivos virtuais, blocos, setores e arquivos \u2014 estamos prontos para discutir o desempenho real com n\u00fameros reais.<\/p>\n<p>Na pr\u00f3xima parte, vamos analisar o desempenho real de pools com vdevs espelhados e RAIDz, um em compara\u00e7\u00e3o ao outro, bem como em compara\u00e7\u00e3o com as topologias RAID tradicionais do kernel Linux que investigamos <noindex><a rel=\"nofollow\" href=\"https:\/\/arstechnica.com\/information-technology\/2020\/04\/understanding-raid-how-performance-scales-from-one-disk-to-eight\/\">anteriormente<\/a><\/noindex>.<\/p>\n<p>Inicialmente, quer\u00edamos considerar apenas os fundamentos \u2014 as pr\u00f3prias topologias do ZFS \u2014 mas ap\u00f3s <i>isso<\/i> estaremos prontos para discutir configura\u00e7\u00f5es e ajustes mais avan\u00e7ados do ZFS, incluindo o uso de tipos auxiliares de vdev, como L2ARC, SLOG e Aloca\u00e7\u00e3o Especial.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/504692\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0432\u043e\u0434\u043d\u044b\u0435 \u0442\u0435\u043c\u044b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u0430\u0448\u0438\u0445 \u0434\u0438\u0441\u043a\u043e\u0432 \u0438 \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 RAID. \u0412\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043c\u044b \u0434\u0430\u0436\u0435 \u043f\u043e\u043e\u0431\u0435\u0449\u0430\u043b\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043c\u043d\u043e\u0433\u043e\u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0439 \u0432 ZFS. \u042d\u0442\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u043d\u0435\u0434\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u044e\u0434\u0443: \u043e\u0442 Apple \u0434\u043e Ubuntu. \u041d\u0443 \u0447\u0442\u043e \u0436, \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0434\u0435\u043d\u044c \u0434\u043b\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":83583,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-83582","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/osnovy-zfs-sistema-hraneniya-i-proizvoditelnost\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0441\u043d\u043e\u0432\u044b ZFS: \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/osnovy-zfs-sistema-hraneniya-i-proizvoditelnost\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-06-01T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-06-01T17:42:21+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Fundamentos do ZFS: sistema de armazenamento e desempenho | ProHoster","description":"Nesta primavera, j\u00e1 discutimos alguns t\u00f3picos.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/osnovy-zfs-sistema-hraneniya-i-proizvoditelnost","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0441\u043d\u043e\u0432\u044b ZFS: \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c | ProHoster","og:description":"\u042d\u0442\u043e\u0439 \u0432\u0435\u0441\u043d\u043e\u0439 \u043c\u044b \u0443\u0436\u0435 \u043e\u0431\u0441\u0443\u0434\u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/osnovy-zfs-sistema-hraneniya-i-proizvoditelnost","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-06-01T17:42:21+00:00","article:modified_time":"2020-06-01T17:42:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"83582","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 15:14:37","updated":"2022-09-28 10:00:57","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/83582","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=83582"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/83582\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/83583"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=83582"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=83582"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=83582"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}