O Que é Preciso Saber Sobre SSDs

Muito longo, não vou ler:

SSDs tornaram-se bastante baratos e têm um desempenho muito alto. Por exemplo, um SSD de servidor Samsung PM1733 custa cerca de US$ 200 por TB e promete cerca de 7 GB/s de leitura e 4 GB/s de largura de banda de gravação. Para alcançar esse alto desempenho, é necessário saber como funcionam os SSDs e esta postagem procura descrever os mecanismos subjacentes mais importantes dos SSDs flash.

* * *

Os SSDs, menores e com maior capacidade de armazenamento, permitiram uma geração de dispositivos ‘slim’ – Imagem: iStock

Solid-State Drives (SSDs) baseados em flash têm substituído amplamente os discos magnéticos rígidos como meio de armazenamento padrão. Do ponto de vista de um programador, SSDs e discos rígidos são muito semelhantes: ambos são persistentes, permitem o acesso baseado em página por meio de sistemas de arquivos e chamadas de sistema, e têm grande capacidade.
Há por outro lado diferenças importantes, que se tornam decisivas quando se deseja otimizar o desempenho de um SSD.

Como veremos, os SSDs são mais complicados e seu comportamento no desempenho pode parecer bastante intrigante se pensarmos neles apenas como “discos rápidos”. O objetivo desta postagem é fornecer uma compreensão do por quê os SSDs se comportam dessa maneira – conhecimento que pode ajudar a criar programas mais adequados para explorá-los. (Observe que eu discuto o flash NAND, não uma memória como a Intel Optane, que tem características diferentes.)

Disco não. Unidade é o nome

Os SSDs costumam ser chamados de “discos”. Isso é enganoso, porque eles de fato armazenam dados em semicondutores em vez de em um disco mecânico. Para ler ou gravar em um bloco aleatório, um disco deve mover mecanicamente sua cabeça para o ponto correto, o que leva cerca de 10 ms [milissegundos]. Em contraste, uma leitura aleatória de um SSD leva cerca de 100 us [microssegundos] – 100 vezes mais rápido. Essa baixa latência de leitura é a razão pela qual a inicialização de um SSD é muito mais rápida do que a inicialização de um disco.

As Paralelas

Outra diferença importante entre discos e SSDs é que os discos têm um cabeçote para leitura/escrita e funcionam bem apenas para acessos sequenciais. Os SSDs, em contraste, consistem em dezenas, ou mesmo centenas, de chips flash (“unidades paralelas”), que podem ser acessados ​​simultaneamente.

Os SSDs distribuem os arquivos maiores de forma transparente pelos chips flash na granularidade da página, e um hardware pré-buscador garante que as varreduras sequenciais explorem todos os chips flash disponíveis. No entanto, no nível do flash não há muita diferença entre leituras sequenciais e aleatórias. Na verdade, para a maioria dos SSDs, também é possível usar quase toda a largura de banda disponível com leituras de página aleatórias. Para fazer isso, é necessário agendar simultaneamente centenas de solicitações aleatórias de entrada e saída para manter todos os chips flash ocupados. Isso pode ser feito iniciando muitos threads ou usando interfaces assíncronas de entrada e saída.

Gravando

As coisas ficam ainda mais interessantes com as gravações. Por exemplo, se olharmos com atenção para a latência de gravação, podemos medir resultados tão baixos quanto 10us – 10 vezes mais rápido do que uma leitura. No entanto, a latência só parece baixa porque os SSDs estão armazenando gravações em cache na RAM volátil. A latência real de gravação do flash NAND é de cerca de 1 ms – 10 vezes mais lenta do que uma leitura. Em SSDs de consumidor, isso pode ser medido emitindo um comando sync/flush após a gravação, para garantir que os dados persistam no flash. Na maioria dos SSDs de alta performance [data center/servidor], a latência de gravação não pode ser medida diretamente: a sincronização/liberação será concluída imediatamente porque uma ‘bateria’ garante a persistência do cache de gravação, mesmo em caso de perda de energia.

Para alcançar alta largura de banda de gravação, apesar da latência relativamente alta, os SSDs usam o mesmo truque das leituras: eles acessam vários chips flash simultaneamente. Como o cache de gravação pode gravar páginas de maneira assíncrona, não é necessário agendar muitas gravações simultaneamente para obter um bom desempenho de gravação. No entanto, a latência de gravação nem sempre pode ser completamente oculta: por exemplo, como uma gravação ocupa um chip flash 10 vezes mais do que uma leitura, as gravações causam latências de cauda significativas para leituras no mesmo chip flash.

Gravações fora-do-local

Nosso entendimento está ignorando um fato importante: as páginas flash NAND não podem ser substituídas. As gravações de página só podem ser executadas sequencialmente nos blocos que foram apagados anteriormente. Esses blocos de apagamento têm um tamanho de vários MB e, portanto, consistem em centenas de páginas. Em um SSD novo, todos os blocos estão apagados e é possível começar a anexar novos dados diretamente.

Atualizar páginas, no entanto, não é tão fácil. Seria muito “overhead” apagar o bloco inteiro apenas para sobrescrever uma única página no local. Portanto, os SSDs executam atualizações de página gravando a nova versão da página em um novo local. Isso significa que os endereços lógico e físico das páginas são separados. Uma tabela de mapeamento, que é armazenada no SSD, converte endereços lógicos (software) em locais físicos (flash). Esse componente também é chamado de Flash Translation Layer (FTL).

Por exemplo, vamos supor que temos um SSD (hipotético) com 3 blocos de apagamento, cada um com 4 páginas. Uma sequência de gravações nas páginas P1, P2, P0, P3, P5, P1 pode resultar no seguinte estado físico do SSD:

Bloco 0 P1 (antigo) P2 P0 P3
Bloco 1 P5 P1 →
Bloco 2

Coleta de lixo

Usando a tabela de mapeamento e gravação fora-de-local, tudo vai bem até que o SSD fique sem blocos livres. A versão antiga das páginas sobrescritas deve, no fim de tudo, ser recuperada. Se continuarmos nosso exemplo acima, escrevendo para as páginas P3, P4, P7, P1, P6, P2, teremos a seguinte situação:

Bloco 0 P1 (antigo) P2 (antigo) P0 P3 (antigo)
Bloco 1 P5 P1 (antigo) P3 P4
Bloco 2 P7 P1 P6 P2

Neste ponto, não temos mais blocos de apagamento livres (embora, lógicamente, ainda deva haver espaço). Antes que alguém possa escrever outra página, o SSD primeiro deve apagar um bloco. No nosso exemplo, pode ser melhor para o coletor de lixo apagar o bloco 0, porque apenas uma de suas páginas ainda está em uso. Depois de apagar o bloco 0, liberamos espaço para 3 gravações e nosso SSD fica assim:

Bloco 0 P0 →
Bloco 1 P5 P1 (antigo) P3 P4
Bloco 2 P7 P1 P6 P2

Amplificação de gravação e excesso de provisionamento

Para o bloco de coleta de lixo 0, tivemos que mover fisicamente a página P0, embora logicamente essa página não tenha sido envolvida em nenhum processo. Em outras palavras, com SSDs flash, o número de gravações físicas (flash) é geralmente maior do que o número de gravações lógicas (software). A proporção entre os dois números é chamada de ‘’amplificação de gravação. Em nosso exemplo, para abrir espaço para 3 novas páginas no bloco 0, tivemos que mover 1 página. Assim, temos 4 gravações físicas para 3 gravações lógicas, ou seja, uma amplificação de gravação de 1,33.

A alta amplificação de gravação diminui o desempenho e reduz a vida útil do flash. O tamanho da amplificação de gravação depende do padrão de acesso e de quão preenchido está o SSD. Grandes gravações sequenciais têm baixa amplificação de gravação, enquanto gravações aleatórias são o pior caso.

Vamos supor que nosso SSD está 50% preenchido e que executamos gravações aleatórias. No estado estacionário, sempre que apagamos um bloco cerca de metade das páginas desse bloco, em média, ainda estão em uso e devem ser copiadas. Assim, a amplificação de gravação para um fator de preenchimento de 50% é 2. Em geral, a amplificação de gravação de pior caso para um fator de preenchimento f é 1/(1-f):

f 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 0,95 0,99
WA 1,11 1,25 1,43 1,67 2,00 2,50 3,33 5 10 20 100

Como a amplificação de gravação torna-se excessivamente alta para fatores de preenchimento próximos a 1, a maioria dos SSDs tem uma capacidade ociosa oculta. Esse super provisionamento é normalmente de 10 a 20% da capacidade total. Obviamente, também é fácil adicionar mais provisionamento em excesso, criando uma partição vazia e nunca gravar nela.

Espero ter sido bem sucedido nesta tentativa de explicação. Tentei também manter este post curto, o que significa que eu tive que simplificar as coisas.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s