PostgreSQL escalando até 64 núcleos?

10

Neste artigo do Computer World , especifica que o PostgreSQL pode escalar até um limite de núcleo de 64. Isso significa para um processador multinúcleo de 64 núcleos? Ou vários processadores com menos núcleos?

A razão pela qual pergunto é porque estou tentando descobrir quantos processadores o PostgreSQL pode escalar, mas é claro que isso pode estar limitado ao tipo de processador. No entanto, tenho encontrado outras estatísticas em outros bancos de dados (por exemplo, o Microsoft SQL Server aqui afirmando que pode escalar até 320 processadores lógicos) e eles não especificam seu número de núcleos. Esta é uma estatística muito vaga?

Qualquer pensamento seria muito apreciado. Obrigado!

O_O
fonte
1
O PostgreSQL não se importa se são 8 CPUs de 8 núcleos, 32 CPUs de 2 núcleos ou o que for. Ele se preocupa apenas com processadores lógicos. Além disso, 64 núcleos são aproximados e dependem do restante do seu hardware; 64 núcleos não farão bem se você tiver apenas 4 GB de RAM para um banco de dados de 1 TB em um disco rígido SATA de 7200 rpm. Não há nenhum limite técnico duro em números principais, é só que recentemente tem sido testada e comprovada para dimensionar bem até 64.
Craig Ringer

Respostas:

7

Não, é uma estatística muito precisa. Um "processador lógico" é um núcleo. E um núcleo é exatamente isso, não importa como eles estão espalhados por processadores físicos.

E se você estiver lidando com uma máquina com mais núcleos do que o número suportado, isso não deve ser um problema no PostgreSQL. Cada conexão é inerentemente de thread único *, portanto, qualquer número de núcleos que você tiver é o que limitará a eficiência e a eficácia das conexões simultâneas.

Escusado será dizer que isso também significa que você deve colocar seu dinheiro em núcleos mais rápidos do que a quantidade de núcleos, a menos que queira agrupar as coisas de um método mais complicado.

* Atualização de 2017: algumas consultas (ou subconsultas) podem ser executadas em paralelo .

Oli
fonte
1
Needless to say this also means you should put your money in faster cores than quantity of cores unless you want to cluster things in a more complicated method.<- Eu só concordo com esta afirmação se o número de núcleos for maior que o número de clientes simultâneos e o número de clientes simultâneos provavelmente não aumentará. É muito importante para o desempenho de ter um núcleo disponível para cada backend Postgres ...
voretaq7
@ voretaq7 Eu concordo principalmente, mas uma CPU com um TPS mais alto pode (obviamente) lidar com mais transações em um determinado momento, portanto, com mais clientes. Haverá um ponto ideal que depende do seu tipo de carga e orçamento.
Oli
1
um processo lógico é a menor unidade de execução lógica, com as tecnologias atuais, não é um núcleo, é um encadeamento.
dyasny
2
@ voretaq7: Não é incomum conectar-se ao postgresql através de algum mecanismo de pool de conexão. Entre outras coisas, isso é feito porque a conexão com o postgresql é relativamente cara. O pool pode reduzir extremamente o número de conexões simultâneas com o banco de dados. Então, eu tendem a preferir CPUs rápidas sobre # de núcleos. Mas, como sempre: depende de muitos fatores ...
m.sr
2
@ m.sr Concordado - os mecanismos de pool de conexão são muito comuns. O "mais inteligente" deles ativará várias conexões com o Postgres e se equilibrará entre elas (um de nossos aplicativos internos faz isso dando a cada processo Apache sua própria conexão com o Postgres - um mapeamento bastante conveniente para nosso caso de uso com um back-end razoável proporção de usuários). IMHO, se o seu pool de conexões está fazendo consultas enfileiradas em vez de gerar backends, não está fazendo nenhum favor a você, mas os prós e contras disso seriam mais interessantes para se aprofundar nos administradores de banco de dados . Então eu perguntei!
voretaq7
12

O Postgres pode escalar até quantos processadores você deseja instalar, e seu sistema operacional pode gerenciar / gerenciar com eficiência. Você pode instalar o Postgres em uma máquina com 128 núcleos (ou mesmo uma máquina com 128 processadores físicos) e funcionará bem. Ele pode até funcionar melhor do que em uma máquina de 64 core se o programador OS pode lidar com que muitos núcleos.

O Postgres mostrou escalar linearmente até 64 núcleos (com ressalvas: estamos falando sobre desempenho de leitura, em uma configuração específica (disco, RAM, SO, etc.) - Robert Haas tem um artigo de blog com um bom gráfico que Eu reproduzi abaixo:

insira a descrição da imagem aqui

O que é importante sobre este gráfico?

O relacionamento é linear (ou quase), desde que o Número de clientes seja menor ou igual ao Número de núcleos e, em seguida, começa o que parece ser aproximadamente uma diminuição log-linear no desempenho, pois você tem mais conexões de clientes do que você faça núcleos para rodar back-end do Postgres porque os back-end começam a lutar pela CPU (a média de carga ultrapassa 1,0, etc ...).

Embora tenha sido demonstrado apenas para até 64 núcleos, você pode generalizar que pode continuar adicionando núcleos (e clientes) e melhorando o desempenho, até o limite de outro subsistema (disco, memória, rede) onde os processos não são mais tendo problemas de contenção de CPU, mas está esperando outra coisa.

(A Haas também tem outro artigo em que eles provaram escalabilidade linear para 32 núcleos, o que tem um ótimo material de referência sobre escalabilidade em geral - leitura em segundo plano altamente recomendada!)

voretaq7
fonte
2
Aliás, o motivo dessa escalabilidade linear foi mencionado na resposta de Oli : O Postgres usa um processo de back-end separado para cada conexão do cliente. Como resultado, se você estiver usando apenas uma conexão, não verá muitos benefícios (se houver) para vários núcleos - você precisará de solicitações paralelas para explorar vários núcleos.
voretaq7
2

Outros esclareceram que um processador lógico geralmente se refere a um núcleo de CPU, mas eu quero comentar sobre a afirmação de que não importa como os núcleos estão espalhados pelas CPUs.

Você pode ter caches na matriz da CPU compartilhados entre núcleos ou dedicados a um ou subgrupos de núcleos. Por exemplo, uma configuração comum é o cache L1 dedicado e o cache L2 compartilhado. Nesse caso, a escalabilidade de uma única CPU dual core pode diferir de duas CPUs single core.

Esses efeitos de escalabilidade continuam na memória principal, com máquinas NUMA exibindo um comportamento diferente do que não é NUMA.

Aponto isso apenas porque o OP está discutindo questões de escalabilidade, cujas respostas geralmente são mais sutis do que "o programa X pode usar os núcleos Y da CPU".

Tim B
fonte
1

Nesse caso, eles significam vários processadores com menos núcleos ... Parte da conversa é preparada para o futuro. Alguns falam em marketing.

ewwhite
fonte