Postgres é executado muito lento

4

Olá e obrigado pela leitura.

Estou trabalhando em um sistema distribuído e tenho 8 clusters, cada um com uma instância do Postgres. No entanto, uma das instâncias do Postgres grava dados extremamente lentos em comparação com os outros. Todos os computadores executam a mesma versão do Ubuntu, possuem as mesmas especificações e a mesma versão do Postgres instalada.

Aqui está o que eu faço:

  • Execute algum código Java e grave os dados criados no banco de dados por meio de uma conexão JDBC. Tudo acontece em uma instância Java. Os dados exatos variam, mas são da mesma escala.

Para o cluster lento, tenho os seguintes tempos de execução (em segundos):

Create Data with Java    WriteData
92                       11055

Para outros clusters, tenho mais algo parecido com isto:

Create Data with Java    WriteData
95                       266

Já verifiquei se o espaço de tabela tem espaço em disco suficiente e também reinstalei completamente a instância Postgres, mas não tenho mais ideia do problema.

Obrigado por qualquer sugestão em que eu possa procurar possíveis problemas!

ATUALIZAÇÃO:

Alguns parâmetros de desempenho:

diskSlow: sudo hdparm -t /dev/sda6 
/dev/sda6: Timing buffered disk reads: 76 MB in 3.05 seconds = 24.92 MB/sec

diskOther: sudo hdparm -t /dev/sda6 
/dev/sda6: Timing buffered disk reads: 314 MB in 3.00 seconds = 104.62 MB/sec 

As leituras de tempo em cache são comparáveis.

UPDATE2: Ok, descobri que o cluster lento foi reinstalado recentemente e tem uma versão mais recente do Ubuntu.

SlowCluster                       OtherClusters: 
Release:    Ubuntu 10.10          Release:    9.10
Codename:   maverick              Codename:   karmic

saída do lspci:

Cluster lento:

00:00.0 Host bridge: Intel Corporation 4 Series Chipset DRAM Controller (rev 03)
00:02.0 VGA compatible controller: Intel Corporation 4 Series Chipset Integrated Graphics Controller (rev 03)
00:02.1 Display controller: Intel Corporation 4 Series Chipset Integrated Graphics Controller (rev 03)
00:1a.0 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #4
00:1a.1 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #5
00:1a.2 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #6
00:1a.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2
00:1b.0 Audio device: Intel Corporation 82801JI (ICH10 Family) HD Audio Controller
00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 1
00:1c.5 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Root Port 6
00:1d.0 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #1
00:1d.1 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #2
00:1d.2 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #3
00:1d.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #1
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 90)
00:1f.0 ISA bridge: Intel Corporation 82801JIB (ICH10) LPC Interface Controller
00:1f.2 IDE interface: Intel Corporation 82801JI (ICH10 Family) 4 port SATA IDE Controller #1
00:1f.3 SMBus: Intel Corporation 82801JI (ICH10 Family) SMBus Controller
00:1f.5 IDE interface: Intel Corporation 82801JI (ICH10 Family) 2 port SATA IDE Controller #2
01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)

Agrupar outros:

00:00.0 Host bridge: Intel Corporation 4 Series Chipset DRAM Controller (rev 03)
00:01.0 PCI bridge: Intel Corporation 4 Series Chipset PCI Express Root Port (rev 03)
00:1a.0 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #4
00:1a.1 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #5
00:1a.2 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #6
00:1a.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2
00:1b.0 Audio device: Intel Corporation 82801JI (ICH10 Family) HD Audio Controller
00:1c.0 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Port 1
00:1c.5 PCI bridge: Intel Corporation 82801JI (ICH10 Family) PCI Express Port 6
00:1d.0 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #1
00:1d.1 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #2
00:1d.2 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB UHCI Controller #3
00:1d.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #1
00:1e.0 PCI bridge: Intel Corporation 82801 PCI Bridge (rev 90)
00:1f.0 ISA bridge: Intel Corporation 82801JIB (ICH10) LPC Interface Controller
00:1f.2 IDE interface: Intel Corporation 82801JI (ICH10 Family) 4 port SATA IDE Controller
00:1f.3 SMBus: Intel Corporation 82801JI (ICH10 Family) SMBus Controller
00:1f.5 IDE interface: Intel Corporation 82801JI (ICH10 Family) 2 port SATA IDE Controller
01:00.0 VGA compatible controller: nVidia Corporation GT200 [GeForce GT 220] (rev a2)
01:00.1 Audio device: nVidia Corporation Device 0be2 (rev a1)
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
03:00.0 Network controller: RaLink RT2860

Principal diferença entre os dois:

03:00.0 Network controller: RaLink RT2860
01:00.1 Audio device: nVidia Corporation Device 0be2 (rev a1)
00:01.0 PCI bridge: Intel Corporation 4 Series Chipset PCI Express Root Port (rev 03)

De lshw:

Cluster lento

width: 64 bits
    capabilities: vsyscall64 vsyscall32
  *-core
       description: Motherboard
       physical id: 0
     *-memory
          description: System memory
          physical id: 0
          size: 7967MiB
     *-cpu
          product: Intel(R) Core(TM)2 Quad CPU    Q8300  @ 2.50GHz
          vendor: Intel Corp.
          physical id: 1
          bus info: cpu@0
          size: 2003MHz
          capacity: 2003MHz
          width: 64 bits
          capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx x86-64 constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm cpufreq
 *-pci
      description: Host bridge
      product: 4 Series Chipset DRAM Controller
      vendor: Intel Corporation
      physical id: 100
      bus info: pci@0000:00:00.0
      version: 03
      width: 32 bits
      clock: 33MHz
      configuration: driver=agpgart-intel
      resources: irq:0

Outros clusters:

    width: 64 bits
    capabilities: vsyscall64 vsyscall32
  *-core
       description: Motherboard
       physical id: 0
     *-memory
          description: System memory
          physical id: 0
          size: 8960MiB
     *-cpu
          product: Intel(R) Core(TM)2 Quad CPU    Q8300  @ 2.50GHz
          vendor: Intel Corp.
          physical id: 1
          bus info: cpu@0
          size: 2003MHz
          capacity: 2003MHz
          width: 64 bits
          capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx x86-64 constant_tsc arch_perfmon pebs bts rep_good pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm cpufreq
 *-pci
      description: Host bridge
      product: 4 Series Chipset DRAM Controller
      vendor: Intel Corporation
      physical id: 100
      bus info: pci@0000:00:00.0
      version: 03
      width: 32 bits
      clock: 33MHz
    *-pci:0
         description: PCI bridge
         product: 4 Series Chipset PCI Express Root Port
         vendor: Intel Corporation
         physical id: 1
         bus info: pci@0000:00:01.0
         version: 03
         width: 32 bits
         clock: 33MHz
         capabilities: pci bus_master cap_list
         configuration: driver=pcieport-driver
         resources: irq:24 ioport:d000(size=4096) memory:fd000000-fe9fffff ioport:de000000(size=301989888)
       *-display UNCLAIMED
            description: VGA compatible controller
            product: GT200 [GeForce GT 220]
            vendor: nVidia Corporation
            physical id: 0
            bus info: pci@0000:01:00.0
            version: a2
            width: 64 bits
            clock: 33MHz
            capabilities: bus_master cap_list
            configuration: latency=0
            resources: memory:fd000000-fdffffff memory:e0000000-efffffff(prefetchable) memory:de000000-dfffffff(prefetchable) ioport:dc00(size=128) memory:fe900000-fe97ffff(prefetchable)

Eu gostaria de receber sugestões. Todos os clusters têm (quase) o mesmo hardware. Pode ser que alguns drivers ou configurações sejam diferentes, mas não estou familiarizado com esses tópicos. Por favor, deixe-me saber o caminho que eu poderia ir.

Obrigado!

    
por evgeni 04.05.2011 / 21:11

1 resposta

5

Novos kernels do Linux, como o incluído no Ubuntu 10.10, usam um método diferente para liberar informações para a sua unidade quando o banco de dados grava. O Linux usa o que chamamos de barreiras de gravação quando o banco de dados faz uma de suas chamadas regulares de fsync, o que acontece sempre que você faz uma transação. Seu cluster único é lento porque o código de barreira de gravação mais recente é mais cuidadoso ao enviar informações dos caches de gravação do disco rígido individuais. Os sistemas Linux mais antigos permitem que ele permaneça no cache da unidade mesmo depois que o banco de dados solicitou que ela seja gravada.

Veja Escritos Confiáveis para mais informações sobre este tópico. O cluster mais recente e lento está, na verdade, fazendo a coisa certa no que diz respeito à gravação confiável do banco de dados. Seus sistemas mais rápidos provavelmente poderiam perder dados no caso de uma falha em sua configuração, enquanto o mais lento não tem esse problema.

Se você se preocupa com a possibilidade de    perda de dados em um acidente, você deve estar    preocupado com os sistemas mais rápidos mais    do que o lento. Existem dois    coisas fáceis que você poderia fazer para acelerar    o sistema lento, independentemente:

  • Edite seu arquivo postgresql.conf, desligue o parâmetro synchronous_commit e recarregue o servidor. Isso desativa o banco de dados pedindo o sistema operacional para liberar dados e, portanto, escrever barreira flush cujo desempenho é tão diferente no único servidor. Isso é seguro contra corrupção de banco de dados questões na nova caixa (as antigas ainda estão em risco), mas você pode perder alguns dados em uma falha.

  • Remontar seu sistema de arquivos com o "nobarrier" opção. Você estará de volta ao possibilidade de corrupção de banco de dados durante um acidente aqui, o mesmo que o seu sistemas mais antigos.

Você pode querer olhar para o seu código e descobrir se é possível se comprometer com o banco de dados com menos frequência também. Às vezes, a gravação de dados funciona muito mais rápido se você fizer isso em grandes blocos de linhas por vez. Do seu problema, eu acho que você pode estar se comprometendo após cada gravação no banco de dados.

    
por 11.05.2011 / 05:02