Compreendendo os tamanhos dos blocos

11

Minha pergunta é direcionada ao Postgres, mas as respostas podem ser boas o suficiente, provenientes de qualquer plano de fundo do banco de dados.

Minhas suposições estão corretas:

  • Os discos têm um tamanho fixo de bloco?
  • O controlador RAID pode ter um tamanho de bloco diferente? Um bloco RAID é dividido em vários blocos de disco real?
  • O sistema de arquivos também possui um tamanho de bloco independente que novamente é dividido no tamanho do bloco RAID?
  • O Postgres trabalha com blocos fixos de 8k. Como o mapeamento para o tamanho do bloco do sistema de arquivos acontece aqui? Os blocos do Postgres 8k são agrupados em lotes pelo sistema de arquivos?

Ao configurar um sistema, é melhor ter todos os blocos em 8k? Ou as configurações não são realmente importantes? Também estava me perguntando se algumas configurações de tamanho de bloco "erradas" poderiam comprometer a integridade dos dados em caso de falha. Talvez se um bloco do Postgres 8k tiver que ser dividido em vários blocos de disco?

Ou nada é agrupado em lotes e, portanto, perco espaço em disco com cada incompatibilidade entre tamanhos de bloco definidos?

Franz Kafka
fonte

Respostas:

16

Setores de disco

Um disco possui um tamanho de setor fixo, normalmente 512 bytes ou 4096 bytes em alguns discos modernos; esses discos também terão um modo no qual emulam setores de 512 bytes. O disco terá faixas com números variados de setores; as faixas mais próximas à parte externa do disco têm mais setores, pois têm mais espaço para uma dada densidade de bits. Isso permite um uso mais eficiente do espaço em disco; normalmente uma faixa terá algo como 1.000 setores de 512 bytes em um disco moderno.

Algumas estruturas de formatação também podem incluir informações de correção de erros nos segundos, que se manifestam nos discos sendo formatados em baixo nível com setores de 520 ou 528 bytes. Nesse caso, o setor ainda possui 512 bytes de dados do usuário. Nem o Windows nem o Linux suportam isso diretamente, embora o i5OS (IBM iSeries) e vários controladores SAN o façam.

Normalmente, o setor / cabeça / faixa é traduzido em um endereço de bloco lógico; devido a problemas históricos com compatibilidade com versões anteriores, a geometria (cabeças x setores x faixas) vista pelo sistema operacional (particularmente em discos IDE e SATA) normalmente tem pouco a ver com sua estrutura física.

Tamanho da faixa RAID

Um controlador RAID pode ter um tamanho de faixa para uma matriz usando faixas (por exemplo, RAID-5 ou RAID-10). Se a matriz tiver (por exemplo) uma faixa de 128k, cada disco terá 128k de dados contíguos e o próximo conjunto de dados estará no próximo disco. Normalmente, você pode esperar obter aproximadamente uma faixa por rotação do disco, portanto, o tamanho da faixa pode afetar o desempenho de determinadas cargas de trabalho.

Alinhamento de partição

Uma partição de disco pode ou não se alinhar exatamente com uma faixa RAID e pode causar degradação no desempenho devido a leituras divididas, se não estiver alinhada. Alguns sistemas (por exemplo, servidor Windows 2008) configuram automaticamente as partições para se alinharem aos tamanhos das faixas de volume do disco. Alguns (por exemplo, servidor Windows 2003) não, e você precisa usar um utilitário de partição que suporte o alinhamento de faixas para garantir que sim.

Tamanho do bloco do sistema de arquivos

O sistema de arquivos alocará blocos de armazenamento em pedaços de um determinado tamanho. Geralmente isso é configurável - por exemplo, o NTFS suporta unidades de alocação de (IIRC) 4K a 64K. O desalinhamento de partições e blocos do sistema de arquivos para faixas RAID pode fazer com que uma única leitura do bloco do sistema de arquivos gere vários acessos ao disco, onde apenas um seria necessário se o bloco do sistema de arquivos estivesse alinhado corretamente com as faixas RAID.

Tamanho do bloco do banco de dados

O banco de dados alocará espaço em uma tabela ou índice em um determinado tamanho de bloco. No caso do SQL Server, esse é 8K e 8K é o padrão em muitos sistemas. Em alguns sistemas como Oracle, isso é configurável e, no PostgreSQL, é uma opção de tempo de construção. Na maioria dos sistemas, a alocação de espaço para tabelas é normalmente feita em blocos maiores, com blocos alocados dentro desses blocos.

O desalinhamento do sistema de arquivos e dos blocos de alocação de dados pode gerar várias E / Ss para uma única gravação de bloco, o que pode gerar uma penalidade no desempenho.

Chunking de E / S

Normalmente, um DBMS efetua sua E / S em pedaços de mais de um bloco. Por exemplo, no SQL Server, todas as E / S são feitas em blocos de 8 blocos, 64k no total). No Oracle, isso é configurável. A inspeção casual dos documentos do PostgreSQL não revela uma descrição específica se o PostgreSQL faz isso, então não tenho certeza de como ele funciona nesta plataforma.

Quando o bloco de E / S maior que o tamanho do bloco do sistema de arquivos ou está desalinhado com os limites da faixa RAID, uma gravação em disco do banco de dados pode causar várias gravações em disco, o que gera uma penalidade no desempenho.

Uso de espaço em disco

Nenhum espaço em disco é desperdiçado - a E / S do banco de dados utilizará uma ou mais operações de E / S físicas no disco para concluir - mas a E / S ajustada incorretamente pode gerar ineficiências que retardarão o banco de dados. As principais coisas que precisam estar alinhadas são:

  • Faixas e partições RAID - a partição deve começar em um limite de faixa RAID.

  • Alocação de E / S do sistema de arquivos e limites de faixa / partição de ataque - um limite de faixa RAID deve estar alinhado com uma unidade de alocação do sistema de arquivos e deve ser um múltiplo do tamanho da unidade de alocação do sistema de arquivos.

  • Tamanho de gravação em disco e tamanho da unidade de alocação do sistema de arquivos. Deve haver um relacionamento 1: 1 entre operações de E / S do banco de dados e operações de E / S do sistema de arquivos.

O desalinhamento não cria um problema de integridade de dados maior do que estaria presente. O banco de dados e o sistema de arquivos possuem mecanismos para garantir que as operações do sistema de arquivos sejam atômicas. Geralmente, uma falha no disco resultará em perda de dados, mas não em problemas de integridade.

ConcernedOfTunbridgeWells
fonte
Resposta muito boa. Eu me sinto mal apenas ser capaz de dar-lhe um upvote ...
Franz Kafka
apenas mais uma pergunta: o que exatamente você quer dizer quando se fala em alinhar? Isso é um múltiplo do tamanho de bloco menor? Por exemplo, 32k está alinhado com 8k? Ou há outros fatores envolvidos?
Franz Kafka
@FranzKafka - Não, significa quando algo (normalmente uma partição de disco) inicia em um local que não é um múltiplo integral do que ele deve se alinhar. Por exemplo, se eu tiver um tamanho de faixa de 128K RAID e a partição não iniciar em um múltiplo de 128K a partir do 'bloco 0', posso ter leituras lógicas divididas em duas unidades de alocação física, o que exige duas operações de leitura, causando uma penalidade de desempenho.
ConcernedOfTunbridgeWells