lotes de gravações do PostgreSQL

2

Estou usando o postgreSQL para uma aplicação científica (cluster não supervisionado). O programa python é multi-threaded para que cada thread gere o seu próprio processo postmaster (um por core). Por isso, é muita concorrência.

Cada loop do processo de thread é infinito através de duas consultas SQL. O primeiro é para ler, o segundo é para escrever. A operação de leitura considera 500 a quantidade de linhas que a operação de gravação considera.

Aqui está a saída do dstat:

----total-cpu-usage---- ------memory-usage----- -dsk/total- --paging-- --io/total-
usr sys idl wai hiq siq| used  buff  cach  free| read  writ| in   out | read writ
  4   0  32  64   0   0|3599M   63M   57G 1893M|1524k   16M|  0    0 |  98  2046 
  1   0  35  64   0   0|3599M   63M   57G 1892M|1204k   17M|  0    0 |  68  2062 
  2   0  32  66   0   0|3599M   63M   57G 1890M|1132k   17M|  0    0 |  62  2033 
  2   1  32  65   0   0|3599M   63M   57G 1904M|1236k   18M|  0    0 |  80  1994 
  2   0  31  67   0   0|3599M   63M   57G 1903M|1312k   16M|  0    0 |  70  1900 
  2   0  37  60   0   0|3599M   63M   57G 1899M|1116k   15M|  0    0 |  71  1594 
  2   1  37  60   0   0|3599M   63M   57G 1898M| 448k   17M|  0    0 |  39  2001 
  2   0  25  72   0   0|3599M   63M   57G 1896M|1192k   17M|  0    0 |  78  1946 
  1   0  40  58   0   0|3599M   63M   57G 1895M| 432k   15M|  0    0 |  38  1937 

Tenho certeza que eu poderia escrever mais do que isso por ter visto escrever de 110-140M no dstat. Como posso otimizar esse processo?

    
por user84590 25.03.2010 / 03:02

3 respostas

4

Eu sou o autor do dstat e um engenheiro de sistemas. Eu notei um tempo de espera de 60% em média. Dada a sua saída, eu diria que seus discos estão bastante ocupados. Você pode tentar a nova opção de plugin --disk-util em versões recentes do dstat.

Isso mostrará a taxa de utilização do (s) seu (s) disco (s), e eu esperaria que ele estivesse próximo de 100% para o (s) disco (s) que você está usando. Assim, considerando seu padrão específico de E / S, seu disco está suficientemente ocupado lidando com solicitações de leitura ou gravação.

Por que isso está abaixo dos números de referência? Porque muitas vezes quando você benchmark disco throughput, você está estressando seu disco em um determinado padrão que é ideal para seus discos / caches (como, por exemplo, linear lê ou escreve com grandes blocos com um único segmento) enquanto na sua carga de trabalho atual os padrões específicos podem ser menos ideal (leituras ou gravações aleatórias com blocos pequenos ou variados com vários segmentos pedindo recursos).

Essa diferença no padrão pode fazer uma enorme diferença no rendimento. E obter um throughput melhor durante uma carga de trabalho real significa que você terá que fazer benchmarking com uma carga de trabalho que corresponda mais à sua carga de trabalho real, para ver qual é o máximo que você pode alcançar nessas condições. Ou você pode influenciar a carga de trabalho real alterando seu design (por exemplo, alinhar blocos em seu aplicativo com o subsistema de sistema de arquivos / disco) ou melhorar o armazenamento em cache e / ou leitura antecipada.

Não há uma maneira simples de corrigir isso sem analisar a aparência da sua carga de trabalho.

    
por 29.03.2010 / 01:27
0

Eu diria que depende muito do código do programa, é possível que um thread de trabalho seja ressincronizado antes de iniciar a próxima operação.

A operação de leitura envolve os mesmos dados que estão sendo gravados, em caso afirmativo, você pode obter condições de simultaneidade / corrida se a impedir de esperar que os outros threads sejam atualizados.

Provavelmente, é melhor mover isso para o estouro de pilha.

    
por 25.03.2010 / 08:50
0

Na verdade, pode ser o nível de código Python. O Python usa um Global Interpreter Lock para lidar com threads e você pode estar batendo contra o bloqueio. Há uma postagem no StackOverflow sobre o GIL e sistemas multi-core.

Eu procuraria usar um processo por postmaster e um "master master" se necessário para gerenciar esse processo, ou possivelmente Twisted para contornar o GIL.

    
por 30.03.2010 / 23:30