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:
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:
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:
- Inserir cartão no Raspberry Pi Modelo B
- Inicialize o sistema
- Login via SSH
- Iniciar a execução de teste do iozone
- 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.
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
fonte
Respostas:
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)
MLC, célula multinível (2 ou mais bits)
TLC, célula de nível triplo (3 bits)
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
fonte