Por que o desempenho de gravação aleatória do cartão SD para o tamanho do registro 8-128 kB cai abaixo do desempenho do tamanho do registro 4 kB?

15

Quando verifico o desempenho dos cartões SD para gravação aleatória, percebo que o desempenho é muito ruim para o tamanho do registro de 4 kB (isso não é surpreendente), mas, em vários cartões, ele cai para tamanhos de registro maiores antes de aumentar. Avaliei o desempenho de gravação aleatória com o iozone v3.430 e testei vários cartões de memória de diferentes fabricantes. Este é o comando iozone, que eu costumava medir com tamanho de arquivo 50 MB:

iozone -RaeI -i 0 -i 1 -i 2 -y 4k -q 1M -s 50m -o -f /tmp/testfile

Estes são os resultados com tamanho de arquivo 50 MB:

Queda de desempenho dos cartões SD para gravação aleatória quando testada com iozone e tamanho de arquivo de 50 MB

Pergunta: Qual o motivo pelo qual o desempenho de gravação aleatória com um tamanho de registro de 8, 16, 32, 64 e 128 kB é mais lento do que com um tamanho de registro de 4 kB?

Peter Brittain sugeriu testar com um tamanho de arquivo maior, então eu tentei também com tamanho de arquivo de 500 MB. Estes são os resultados:

Queda de desempenho de cartões SD para gravação aleatória quando testada com iozone e tamanho de arquivo de 500 MB

O desempenho geral piorou, mas o fenômeno ainda ocorre.

As partições estão alinhadas com os limites de 4 MB. O sistema de arquivos é ext4 com tamanho de bloco de 4 kB. A partição usada para o início dos testes é mmcblk0p2.

$ lsblk 
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
loop0         7:0    0 953.7M  0 loop /mnt/sdb1
mmcblk0     179:0    0  14.9G  0 disk 
├─mmcblk0p1 179:1    0    56M  0 part /boot
├─mmcblk0p2 179:2    0   7.8G  0 part /
└─mmcblk0p3 179:3    0     7G  0 part /mnt/mmcblk0p3

$ cat /etc/fstab | grep mmcblk0p2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1

$ sudo fdisk -l /dev/mmcblk0

Disk /dev/mmcblk0: 15.9 GB, 15931539456 bytes
4 heads, 16 sectors/track, 486192 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000981cb

Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    16506879     8192000   83  Linux
/dev/mmcblk0p3        16506880    31115263     7304192   83  Linux

$ mount | grep ext4 | grep root
/dev/root on / type ext4 (rw,noatime,data=ordered)

# tune2fs -l /dev/mmcblk0p2 | grep Block
Block count:              2048000
Block size:               4096
Blocks per group:         32768

Atualização 1: É claro que o desempenho para gravação aleatória, especialmente para pequenos tamanhos de registro, é significativamente menor em comparação à gravação seqüencial. As células de memória do armazenamento flash NAND são agrupadas em páginas e os chamados blocos de apagamento. Os tamanhos de página típicos são 4, 8 ou 16 kB. Embora seja possível ao controlador gravar páginas únicas, os dados não podem ser substituídos sem serem apagados primeiro e um bloco de apagamento é a menor unidade que um armazenamento flash NAND pode apagar. O tamanho do bloco de apagamento geralmente está entre 128 kB e 2 MB. Nos cartões SD modernos, um pequeno número de blocos de apagamento é combinado em unidades maiores de tamanho igual, chamadas grupos de alocação ou unidades ou segmentos de alocação. O tamanho usual do segmento é de 4 MB.Cada operação de gravação no armazenamento resulta em uma operação de leitura-modificação-gravação para um segmento inteiro. Por exemplo, em um cartão SD com tamanho de segmento de 4 MB, gravar 4 kB de dados em locais aleatórios resulta em um fator de amplificação de gravação de 1024. Os controladores de cartões SD implementam uma camada de conversão. Para qualquer operação de E / S, uma tradução do endereço virtual para o físico é realizada pelo controlador. Se os dados dentro de um segmento devem ser substituídos, a camada de conversão remapeia o endereço virtual do segmento para outro endereço físico apagado. O segmento físico antigo é marcado como sujo e na fila para uma exclusão. Mais tarde, quando é apagado, pode ser reutilizado. Os controladores de cartões SD geralmente armazenam em cache um ou mais segmentos para aumentar o desempenho das operações de gravação aleatória.Se os cartões SD armazenarem um sistema de arquivos raiz, é benéfico se o controlador do cartão puder armazenar em cache o (s) segmento (s) em que as operações de gravação ocorrem, os segmentos que armazenam os metadados para o sistema de arquivos e (se disponível) o diário do sistema de arquivos. Consequentemente, o desempenho de gravação aleatória de um cartão SD depende do tamanho do bloco de apagamento, do tamanho do segmento e do número de segmentos que o controlador armazena em cache. Mas tudo isso não explica por que o desempenho de gravação aleatória com um tamanho de registro de 8, 16, 32, 64 e 128 kB é mais lento do que com um tamanho de registro de 4 kB.

Atualização 2 (resposta a myaut): A captura de tela da tabela é meu próprio trabalho. Atualmente, escrevo um artigo / artigo sobre grupos de computadores de placa única, porque são uma opção interessante para fornecer recursos a projetos e pesquisadores de estudantes. Nesse contexto, também investiguei o desempenho da CPU, armazenamento e interface de rede de um único nó. Eu comprei todos os cartões SD testados. Em uma das placas que instalei (copiei via dd) Raspian Wheezy (versão 2014-06-20). Depois de definir as configurações de rede e instalar alguns pacotes adicionais (por exemplo, iozone), copiei o cartão SD inteiro para todos os outros cartões SD.

Atualização 3 (resposta a Gabriel Southern): Os resultados são de execuções únicas. O procedimento foi:

  1. Inserir cartão no Raspberry Pi Modelo B
  2. Inicialize o sistema
  3. Login via SSH
  4. Iniciar a execução de teste do iozone
  5. Pare o sistema e tente com outro cartão SD

Alguns dos cartões que tentei várias vezes para verificar novamente. Havia apenas pouca variação. O fenômeno ocorre o tempo todo, exceto os dois cartões Samsung e um cartão Verbatim.

Atualização 4: No momento, tento encontrar um contato com uma empresa que produz clontrollers flash NAND (Samsung, SanDisk, Toshiba ...) para solicitar uma resposta definitiva. A SanDisk tem um fórum. Eu pedi uma explicação lá. Também enviei uma solicitação ao departamento de suporte técnico da Kingston.

Atualização 5: O tamanho do bloco de apagamento e o tamanho da unidade de alocação (segmento) não são responsáveis ​​pelo fenômeno. Eu testei o tamanho do bloco de apagamento de todos os cartões SD com o pritcsd.py punho ferramenta no leitor de cartão interno de um notebook ThinkPad X240 e, finalmente, com um Raspberry Pi Modelo B. Para todos os cartões a saída é: Erase block size of mmcblk0 is 65536 bytes. Além disso, o tamanho do segmento é igual para todos os cartões SD testados. É 4 MB. Esta informação pode ser encontrada no arquivo /sys/class/mmc_host/mmc0/mmc0*/preferred_erase_size . É extraordinário, na minha opinião, que todos esses cartões tenham o mesmo tamanho de bloco de apagamento e tamanho de segmento. Enquanto isso, coletei os IDs do produto / número de item das embalagens dos cartões testados. Aqui estão eles.

IDs de produto / números de item das embalagens dos cartões testados

Atualização 6: O suporte técnico da Kingston me escreveu que os controladores das placas Kingston testadas (e provavelmente das outras placas) são otimizados para arquivos de tamanho 4 kB. A implementação exata do controlador é confidencial. A resposta de Kingston é a melhor que recebi. A SanDisk nunca respondeu à minha solicitação de suporte e não consegui encontrar um contato da Sony, Samsung ou Verbatim

Terra do Nunca
fonte
11
Esta é uma pergunta interessante. Os resultados relatados são médios em várias execuções ou apenas em uma única execução? Eu ficaria curioso para saber quanta variação há nos resultados.
11
Como resultado do remapeamento lógico e do nível de desgaste, esta afirmação na pergunta "Por exemplo, em um cartão SD com tamanho de segmento de 4 MB, a gravação de 4 kB de dados em locais aleatórios resulta em um fator de amplificação de gravação de 1024". é falso.
Ben Voigt
11
Na minha experiência de teste de desempenho, você obtém todos os tipos de otimizações e caches em testes de menor escala. Em particular, eu poderia acreditar que os fabricantes com flash mais lento precisariam dessas otimizações para lidar com as atualizações do sistema de arquivos com eficiência, mas não podem provar isso devido à falta de documentação pública para todos os controladores. Dito isto, notei que você está usando apenas um arquivo de 50 MB. Você já tentou arquivos muito maiores (conforme "regras de execução" em iozone.org/docs/IOzone_msword_98.pdf ) para tentar combater isso?
11
Partindo do pressuposto de que você não encontra diferença, procurei outros dados sobre esse assunto. Parece que a Linaro org fez uma pesquisa semelhante . Em particular, o cache SLC extra grande pode explicar seus resultados muito rápidos. E as otimizações do FAT32 seriam voltadas especificamente para pequenas gravações.
11
Sim - já vi esse problema na página ... Acho que você pode estar perdendo algo com o FAT32: as placas são otimizadas "para os padrões de acesso observados no FAT32" e não apenas para o FAT32. Um padrão de acesso típico no FAT será escrever um novo arquivo - o que exige que os dados do arquivo sejam transmitidos mais uma atualização do FAT. A atualização do FAT geralmente envolve um pequeno número de blocos. Se eu estivesse escrevendo uma FTL, planejaria otimizar quaisquer gravações menores que o tamanho da minha página para ajudar no desempenho do FAT.

Respostas:

4

Estrutura das células dos cartões SD:

Na eletrônica de estado sólido, uma célula é um elemento de memória capaz de armazenar um ou muitos bits de informações, o número de bits por célula depende da tecnologia usada. (SLC / MLC / TLC)

Os fabricantes usam diferentes tecnologias na memória flash para gerenciar sua estrutura; as estruturas mais usadas são TLC e MLC, devido ao custo mais baixo relacionado a essas tecnologias, especialmente o TLC.

É difícil obter essas informações técnicas para cartões SD e pen drives, decidiram os fabricantes, com relação a outras tecnologias semelhantes ao flash, como SSD, onde essas informações são quase sempre fornecidas.

Isso tem um impacto direto na vida útil do hardware, mas também na velocidade.

SLC, célula de nível único (1 bit)

Generally 100000 write erase cycles
Erase time: 1-2.5ms

MLC, célula multinível (2 ou mais bits)

Anywhere from 3000 to 15000 write erase cycles
Erase time: 2.5-3.5ms

TLC, célula de nível triplo (3 bits)

Anywhere from 1000 to 5000 write/erase cycles
Erase time: 4-5ms

Nota :

Como as células podem conter 1, 2 ou 3 bits, em alguns casos, o chip controlador do cartão sd precisará executar mais ciclos de acesso, dependendo do tamanho do registro e da capacidade da célula.

Suas placas Samsung provavelmente estão usando uma tecnologia SLC ou possuem um chip controlador poderoso.

Nota 2 :

Eu tentei alguns testes como você faz com partições ext4 bloco tamanho 4 kb e 1 kb, mas sem grande diferença

intika
fonte
Os cartões Samsung e Verbatim são produtos de consumo e, nos últimos anos, a memória SLC não era comum nesses dispositivos. Os cartões Samsung são MB-MP16D e MB-MS16D e o cartão literal é o número de artigo 44007 .
Neverland
Talvez as especificações de alguns controladores estejam disponíveis. Posso abrir os cartões SD e verificar quais controladores esses cartões contêm, mas não consigo abrir os cartões microSD. Existe alguma chance de ler o ID / número do produto dos controladores de cartões SD via software?
Neverland