Se eu tiver a mesma linha na mesma coluna na mesma tabela na qual escrevo 4 bytes (um inteiro) 100.000 vezes por dia, isso desgastará o SSD? Para um SSD, 400 kb por dia não é nada, mas gravá-lo na mesma célula de memória o faria.
- O sistema de gerenciamento de banco de dados Postgres manipula essas células de alguma forma?
- Ou os chips SSD modernos fazem isso no hardware?
- Ou tudo é gravado na mesma célula de memória e apenas trocamos SSDs mortos com o passar do tempo?
Introdução:
O que deve ser apreciado é que o PostgreSQL não sabe nada sobre os discos subjacentes (se eles estão girando ferrugem ou SSDs, configurados para RAID ou qualquer outra coisa ). O PostgreSQL entrega os dados ao SO e confia no SO para cuidar deles ( às vezes não é uma boa ideia)!
Para SSDs, há dois fatores a serem considerados aqui:
É importante notar que nenhum deles tem nada a ver com aplicativos (ou seja, PostgreSQL, qualquer outro servidor de banco de dados ou qualquer aplicativo) que sejam executados no sistema! O primeiro é estritamente uma propriedade/capacidade do próprio SSD, o último um "método de cooperação" entre o SO e o SSD.
Nivelamento de desgaste:
Mensagem para levar para casa: O SSD distribui as gravações para diferentes blocos uniformemente porque os blocos SSD só podem sofrer um
limited number of erase cycles before becoming unreliable
!Da Wiki :
Assim, o SSD decide onde realmente colocar os dados provenientes do sistema operacional (observação: não há menção de quais aplicativos esses dados podem vir). A ideia simples é que ele espalhe essas gravações ao redor da unidade para equalizar o desgaste em todos os blocos do disco para que alguns blocos não falhem prematuramente!
Isso pode se tornar complicado muito rapidamente - veja o wiki para mais detalhes:
TRIM-ming:
Mensagem para levar para casa: devido à estrutura subjacente dos SSDs, apenas blocos vazios podem ser gravados - se já houver dados em um bloco, esses dados antigos devem ser lidos e regravados no bloco junto com os novos dados - isso contribui para escrever-amplificação .
Se o sistema operacional informar ao disco (pós-exclusão) que os dados no bloco x não são mais necessários, o disco pode realizar a coleta de lixo (pode ser agendada) e o bloco ficará vazio e pronto para gravação sem amplificação de gravação . Não totalmente diferente de desfragmentar um HDD.
(novamente do Wiki - desculpas pela longa citação, mas é necessário):
O futuro do armazenamento:
Há muita pesquisa interessante em andamento re. armazenamento e, por motivos óbvios, armazenamento em bancos de dados. Embora isso esteja ficando acima do meu nível de especialização, se você pesquisar termos como "disco endereçável por byte", encontrará sites como aqui , que abriga um kit de ferramentas de memória persistente (endereçável por byte) ( Intel Optane pode suportar seu aparentemente), então os dias de leitura e escrita de dados pelo bloco podem estar contados?
Para uma explicação de por que temos blocos em primeiro lugar, veja este tópico sobre engenharia de software e veja aqui uma discussão interessante sobre o acesso direto ao hardware no modo de usuário, "ignorando" o sistema operacional... todas coisas fascinantes! io_uring (e eBPF) parecem ser os novos garotos no bloco Linux, mas você pode ler isso à vontade.
Respondendo as perguntas:
Minha opinião sobre o que foi dito acima é que o SSD espalharia as gravações por muitos blocos - levando a muito trabalho. Como exatamente isso seria feito dependeria dos algoritmos de nivelamento de desgaste do SSD.
Absolutamente não ! O PostgreSQL apenas entrega os dados ao sistema de arquivos e permite que o FS & OS cuidem do armazenamento (embora veja aqui onde esse processo falhou devido a uma falha no Linux). Isto é como deveria ser – separação de interesses .
Minhas leituras nesta área me levam a acreditar que é o firmware SSD que cuida do nivelamento de desgaste e do TRIM-ming.
Normalmente, há uma pequena área de alta tolerância ao desgaste no SSD onde os dados de gravação do bloco são mantidos e alguns deles podem ter áreas de reserva para quando os blocos começam a falhar - obviamente, quanto mais sofisticado seu SSD, mais você pagará isto.
Para reiterar: o PostgreSQL não tem conhecimento ou controle sobre o que acontece com os dados quando os entrega ao sistema operacional - eles são armazenados em buffer, direto para o disco, perdidos com todas as mãos?
Isso dependerá dos algoritmos de agendamento do próprio sistema operacional e da carga sob a qual ele está - outra área inteira da ciência da computação! :-) ps +1 para uma pergunta interessante que me fez aprender sobre isso (estava na lista de tarefas!).
O Postgres não grava o arquivo de dados para cada alteração. Como a maioria dos RDBMSs, ele usa Write-Ahead Logging e apenas ocasionalmente atualiza os arquivos de dados.
Portanto, mesmo sem o nivelamento de desgaste do SSD, você não verá um grande número de gravações no mesmo local em um arquivo porque os logs são gravados sequencialmente e os arquivos de dados são atualizados apenas durante um CHECKPOINT agendado ou outro processo em segundo plano.