A partir da versão 9 do postgres ao recuperar um banco salvo em arquivo (o nomeBanco.backup) é possível escolher o Number Of Jobs para a restauração (através do uso do parâmetro --jobs numero). Com isso surge a dúvida de qual valor deveria ser usado para agilizar o processamento e minimizar o tempo de espera.
O raciocínio lógico de que o número de jobs deveria coincidir com o número de cores do processador as vezes pode entrar em conflito com o fato de que um único core físico pode simular mais cores virtuais, de forma que o raciocínio se perde e surge a dúvida.
Fiz um script para testar o tempo de execução da recuperação de um banco de 506MB do postgres a partir do zero (sempre apagando o banco antes de fazer uma nova restauração) com diferentes quantidades de jobs, utilizando o programa time para me informar o tempo de execução do processamento do pg_restore. O resultado foi um tanto esclarecedor:
Utilizar um único job realmente foi o mais demorado, com 13m43s, e utilizar dois e três jobs apresentaram uma melhora interessante, com 7m13s e 5m35s respectivamente. Entretanto a diferença para o uso de quatro cores foi pequena, com 5m19s e a partir dai (até 22 jobs) a variação é mínima, podendo ser considerado praticamente um empate técnico, com um pequeno desvio para mais.
Para ficar mais claro, realizei os testes em minha máquina com as seguintes configurações de hardware:
Intel® Core™ i5-2300 CPU @ 2.80GHz × 4
Ubuntu 11.10 32-bit
5,8 GB DDR3
Observação: Segundo
esta fonte
Show archive.org snapshot
este processador possui 4 Cores e 4 Threads.
Também acho necessário esclarecer que várias configurações padrões do postgres foram editadas em minha empresa para melhorar o desempenho do banco de dados segundo nossas necessidades, e portanto os resultados obtidos de tempo podem divergir em parte.
De qualquer forma, considero então como conclusão que o valor ótimo para a escolha do número de jobs deva levar em consideração de fato o número de cores físicos do processador, ignorando o número de cores virtuais, para a otimização no processamento de recuperação de um banco.
Segue o resultado obtido:
TESTE TEMPO IMPORTACAO COM 1 JOB(S)
real 13m43.619s
user 2m41.510s
sys 0m1.768s
TESTE TEMPO IMPORTACAO COM 2 JOB(S)
real 7m13.122s
user 2m50.979s
sys 0m3.400s
TESTE TEMPO IMPORTACAO COM 3 JOB(S)
real 5m35.973s
user 2m53.399s
sys 0m3.732s
TESTE TEMPO IMPORTACAO COM 4 JOB(S)
real 5m19.804s
user 2m54.831s
sys 0m3.628s
TESTE TEMPO IMPORTACAO COM 5 JOB(S)
real 5m27.738s
user 2m52.883s
sys 0m3.512s
TESTE TEMPO IMPORTACAO COM 6 JOB(S)
real 5m19.523s
user 2m53.883s
sys 0m3.980s
TESTE TEMPO IMPORTACAO COM 7 JOB(S)
real 5m24.322s
user 2m53.155s
sys 0m3.492s
TESTE TEMPO IMPORTACAO COM 8 JOB(S)
real 5m33.200s
user 2m53.127s
sys 0m3.648s
TESTE TEMPO IMPORTACAO COM 9 JOB(S)
real 5m30.865s
user 2m53.179s
sys 0m3.620s
TESTE TEMPO IMPORTACAO COM 10 JOB(S)
real 5m35.521s
user 2m54.251s
sys 0m3.744s
TESTE TEMPO IMPORTACAO COM 11 JOB(S)
real 5m40.132s
user 2m52.743s
sys 0m3.616s
TESTE TEMPO IMPORTACAO COM 12 JOB(S)
real 5m24.826s
user 2m53.455s
sys 0m3.328s
TESTE TEMPO IMPORTACAO COM 13 JOB(S)
real 5m26.753s
user 2m53.655s
sys 0m3.324s
TESTE TEMPO IMPORTACAO COM 14 JOB(S)
real 5m29.245s
user 2m53.427s
sys 0m3.400s
TESTE TEMPO IMPORTACAO COM 15 JOB(S)
real 5m30.678s
user 2m53.427s
sys 0m3.380s
TESTE TEMPO IMPORTACAO COM 16 JOB(S)
real 5m28.385s
user 2m53.279s
sys 0m3.532s
TESTE TEMPO IMPORTACAO COM 17 JOB(S)
real 5m33.767s
user 2m53.491s
sys 0m3.324s
TESTE TEMPO IMPORTACAO COM 18 JOB(S)
real 5m22.299s
user 2m53.455s
sys 0m3.608s
TESTE TEMPO IMPORTACAO COM 19 JOB(S)
real 5m27.219s
user 2m53.423s
sys 0m3.896s
TESTE TEMPO IMPORTACAO COM 20 JOB(S)
real 5m27.353s
user 2m53.959s
sys 0m3.704s
TESTE TEMPO IMPORTACAO COM 21 JOB(S)
real 5m25.358s
user 2m53.147s
sys 0m3.508s
TESTE TEMPO IMPORTACAO COM 22 JOB(S)
real 5m35.286s
user 2m53.843s
sys 0m3.580s