alinhamento do dispositivo de armazenamento - calcula o alinhamento das partições subseqüentes de um 32MiB alinhado ideal

1

resumo

Estou tentando entender como calcular o alinhamento das partições subseqüentes de um% 32MiB alinhado ideal ( 65535 sector) em vez do usual 1MiB ( 2048 sector ).

plano de fundo

Adquiri recentemente um SAMSUNG SSD 850 EVO (M.2 1TB)

# cat /sys/block/sdx/queue/optimal_io_size
> 33553920
# cat /sys/block/sdx/queue/minimum_io_size
> 512
# cat /sys/block/sdx/alignment_offset
> 0
# cat /sys/block/sdx/queue/physical_block_size
> 512
# cat /sys/block/sdx/queue/logical_block_size
> 512
# cat /sys/block/sdx/queue/hw_sector_size
> 512

# fdisk -l
> Disk /dev/sdx: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
> Units: sectors of 1 * 512 = 512 bytes
> Sector size (logical/physical): 512 bytes / 512 bytes
> I/O size (minimum/optimal): 512 bytes / 33553920 bytes
> Disklabel type: gpt

Calcular o primeiro setor não é difícil.

permite que o GNU parted calcule automaticamente o alinhamento

(parted) mkpart primary 0% 100%

O resultado é um alinhamento que começa no setor 65535 ( 32MiB ).

calcule manualmente o alinhamento

(optimal_io_size + alignment_offset) / physical_block_size

Usando os dados de SAMSUNG SSD 850 EVO (M.2 1TB) e aplicando os resultados da fórmula em

(33553920 + 0) / 512 = 65 535

o problema

Normalmente, ao criar uma partição, simplesmente adiciono o offset + length das partições anteriores como o início da próxima partição, por exemplo,

(parted) mkpart primary 1MiB   2MiB
(parted) mkpart primary 2MiB   514MiB
(parted) mkpart primary 514MiB 1538MiB
...

Tentativa de algo semelhante para SAMSUNG SSD 850 EVO (M.2 1TB)

(parted) mkpart primary 65535s 67582s  # OK ~32MiB 33MiB
(parted) mkpart primary 67583s 100%
or
(parted) mkpart primary 33MiB 100%

resulta no seguinte aviso:

Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel?

remédio

O drive é bastante exigente, e minha melhor tentativa tem sido calcular setores exatos. Infelizmente, isso resultou em cálculos complicados, nos quais não consigo explicar por que as partições foram alinhadas de forma ideal ( align-check optimal <partition number> ).

(parted) unit s
(parted) print free
Number  Start        End          Size         File system  Name  Flags
        34s          65534s       65501s       Free Space
 1      65535s       67582s       2048s
        67583s       131069s      63487s       Free Space
 2      131070s      1179645s     1048576s
        1179646s     1245164s     65519s       Free Space
 3      1245165s     9633772s     8388608s
        9633773s     9699179s     65407s       Free Space
 4      9699180s     1953467279s  1943768100s
        1953467280s  1953525134s  57855s       Free Space

Até onde eu posso dizer, cada setor tem que começar com um 65535 interval, que corresponde a ~ 32MiB (ou 65535+1 = 32MiB ). Eu suponho que o deslocamento de bytes é 0 e não 1 . Dado 1MiB = 2048s .

O primeiro tamanho da partição deve ser 1MiB , portanto, a parada é 65535 + 2048 - 1 = 67582 .

(parted) mkpart primary 65535s 67582s

Se a partição anterior estiver abaixo de 32MiB , a próxima partição começará em previous partition offset + 32MiB . Para a partição 2 no exemplo acima dividido, começa em ~64MiB ( 65535s * 2 = 131070s ). O tamanho deve ser 512MiB ( 512 * 2048 = 1048576 ), portanto, a parada é 131070 + 1048576 - 1 = 1179645 .

(parted) mkpart primary 131070s 1179645s

Até aí tudo bem, mas qual seria o começo ideal para a partição 3 ? Qual offset é o primeiro intervalo 32MiB disponível?

1179645 / 65535 ~= 18,000223

Atualmente usando 18 intervalos e transbordando no dia 19; a próxima partição deve, portanto, começar no 19º intervalo?

19 * 65535 = 1245165

O tamanho deve ser 4096MiB ( 4096 * 2048 = 8388608 ), portanto, a parada é 1245165 + 8388608 - 1 = 9633772 .

(parted) mkpart primary 1245165s 9633772

Para a próxima partição, portanto

9633772 / 65535 ~= 147,0019
148 * 65535 = 9699180

E assim por diante e assim por diante.

Eu não encontrei nenhuma discussão sobre isso antes, e parece que estou complicando demais o particionamento.

    
por user212827 02.11.2017 / 15:34

2 respostas

0

Usando o Tutorial do fdisk da GPT gdisk , ele calculou automaticamente o alinhamento das partições subseqüentes quando prefixado com + , por exemplo,

Last sector (8390656-15634398, default = 15634398) or {+-}size{KMGTP}: +2G

cria 2GiB (gibibyte) do último setor fornecido.

As partições estão alinhadas em 2048s . O GNU parted confirma que as partições são align-check minimal , mas não align-check optimal .

O blockdev --getalignoff /dev/sdx retorna 0 .

    
por 02.11.2017 / 17:31
0

Alguns dizem que é importante alinhar os SSDs ao longo do ERASE BLOCK e NAND PAGE SIZES.

evo 840 aparentemente tem parâmetros de bloco e nand incomum: 1536kb e 8k Eu não tenho certeza do 850 (samsung está relutante em liberar esta informação (segredo comercial)) ...

Desenvolvi um valor de alinhamento universal que abrange todos os SSDs conhecidos e seus tamanhos de bloco e de página de exclusão. Eu recomendo usar um deslocamento de 6291456 bytes (setor 12288 (6144kb = 6mb) ou qualquer múltiplo (12mb, 18mb, 24mb, etc.). Esse deslocamento deve funcionar com qualquer ssd conhecido (ou disco rígido para esse assunto). TAMANHO DA PÁGINA com o qual você está lidando Eu recomendaria corresponder o TAMANHO DA UNIDADE DE ALOCAÇÃO ao NAND PAGE SIZE quando possível durante o formato para evitar problemas de READ MODIFY WRITE, no entanto 4k também deve ser um valor aceitável para quase qualquer ssd, se necessário. está superprovisionado internamente Eu ainda deixaria 10% do disco sem formatação para ajudar a evitar problemas de AMPLIFICAÇÃO DE ESCRITA (deixo 17% de OP) .Eu também recomendo, quando você determinou seus parâmetros com certeza, NÃO usando o "FORMATO RÁPIDO "opção, faça o formato normal, não demorará muito para um SSD. Deixe-me saber se isso ajuda você ou não e fique à vontade para adicionar qualquer idéia que você possa ter ....

PS Acho dividido ser combersome para usar e preferir gdisk. No gdisk, você pode definir "definir o valor de alinhamento do setor" usando "l" no menu do xpert. Quando você fizer isso, todas as partições criadas serão automaticamente calculadas para iniciar no múltiplo mais próximo desse valor, resultando em todas as partições sendo alinhadas corretamente, desde que o valor fornecido esteja correto.

    
por 29.09.2018 / 18:59