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