I / O de CPU alta estranha no servidor postgresql

4
Estou realmente lutando com um problema de desempenho atualmente, onde todas as minhas consultas de banco de dados levam até 1000 vezes mais do que normalmente, quando meu servidor de banco de dados está sob carga "pesada".

Eu tenho um servidor que roda o Ubuntu 12.04 e hospeda meu banco de dados postgresql 9.2. O servidor está no Hetzner.de e é um EX6s (xenon de 8 núcleos com 32GB e dois HDDs de 3T em uma configuração RAID1 usando o software ubuntus raid). Quando executo um grande volume de consultas (o que geralmente faço durante a noite), vejo que quase todo o uso da CPU é gasto na espera de E / S da CPU. Eu tenho um novo monitoramento de relíquias instalado, e não consigo encontrar quaisquer outras indicações do que poderia ser a causa raiz dessa espera de CPU I / O, que claramente é um gargalo para o meu desempenho e taxa de transferência.

Então, a questão é: o que esta CPU I / O espera e o que ela está esperando?

Eu adicionei todos os gráficos de visão geral que eu posso obter da nova relíquia abaixo. O que eu estou negligenciando? Deve haver um gargalo óbvio? Onde devo mergulhar?

Uso da CPU do servidor de banco de dados - O maligno que me diz que algo está errado link

Média de carga do servidor de banco de dados link

Memória física do servidor de banco de dados link

Utilização de E / S de disco do servidor de banco de dados - como você pode ver, o disco não parece ser muito utilizado (quase nada) link

E / S da rede do servidor de banco de dados (Mb / s) - a rede é uma rede interna gigabit na qual todas as comunicações são feitas. link

As 5 principais operações de banco de dados por relógio de parede link

Taxa de transferência do banco de dados link

Tempo de resposta do banco de dados link

ATUALIZAÇÃO:

Depois de fazer um sudo iostat -k 1 , estou começando a suspeitar. Eu recebo muitos resultados assim, que não vejo no NR:

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               0.00         0.00         0.00          0          0
sdb               0.00         0.00         0.00          0          0
sdc             546.00      2296.00      6808.00       2296       6808
sdd             593.00      1040.00      7416.00       1040       7416
md1               0.00         0.00         0.00          0          0
md0               0.00         0.00         0.00          0          0
md2            1398.00      3328.00     13064.00       3328      13064
md3               0.00         0.00         0.00          0          0
    
por Niels Kristian 30.11.2012 / 02:54

1 resposta

3

Em suma, você precisa de discos mais rápidos.

Quando os processos estão no iowait, isso significa que eles emitiram uma solicitação de E / S e aguardam os resultados dessa solicitação. Com a RAM adequada, a maior parte do seu conjunto de trabalho será armazenada em cache na RAM e, como tal, as leituras não contribuirão para grande parte dessa contenção de IO, portanto, as gravações normalmente são as culpadas.

Com relação ao gráfico de E / S de disco, suspeito que, por algum motivo, a New Relic não esteja coletando as métricas de E / S corretamente. Eu recomendo possivelmente olhando em um sistema de coleta de dados secundário como Munin. Além disso, você pode assistir ao IO do disco em tempo real, emitindo o seguinte comando:

$ iostat -k 1

Isso produzirá leituras e gravações em disco em tempo real, em kbps. Eu suspeito que você verá um pouco de atividade lá que a New Relic não está vendo.

    
por 30.11.2012 / 03:03