Número de Jobs ao recuperar um banco no Postgres

Posted . Visible to the public.

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
Bruno Vieira
Last edit
Posted by Bruno Vieira to ZeroGlosa (2012-10-09 17:56)