O estranho e extremamente lento padrão de E / S que estou vendo é este (saída de iostat -dxk 1 /dev/xvdb1
):
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb1 0.00 0.00 0.99 0.99 7.92 3.96 12.00 1.96 2206.00 502.00 99.41
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 100.40
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 100.40
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb1 0.00 0.00 0.99 0.00 3.96 0.00 8.00 0.99 2220.00 1004.00 99.41
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 100.40
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb1 0.00 0.99 0.99 0.00 7.92 0.00 16.00 1.14 2148.00 1004.00 99.41
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2.01 0.00 0.00 100.40
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util
xvdb1 0.00 0.00 1.00 1.00 4.00 8.00 12.00 2.01 1874.00 502.00 100.40
Não sei por que a utilização e a espera do disco são tão altas e as taxas de leitura / gravação são tão baixas. Qual poderia ser o motivo disso?
A tabela que está sendo consultada simplesmente possui várias colunas varchar, uma das quais é last_name, que é indexada (na verdade, lower(last_name)
é indexada). A consulta em si é simples:
SELECT * FROM consumer_m WHERE lower(last_name) = 'hoque';
Aqui está a saída de explicação:
QUERY PLAN
-------------------------------------------------------------------------------------------------
Bitmap Heap Scan on consumer_m (cost=2243.90..274163.41 rows=113152 width=164)
Recheck Cond: (lower((last_name)::text) = 'hoque'::text)
-> Bitmap Index Scan on consumer_m_last_name_index (cost=0.00..2215.61 rows=113152 width=0)
Index Cond: (lower((last_name)::text) = 'hoque'::text)
Observe também que o banco de dados está em auto_vacuum, portanto, nenhuma análise / vácuo explícito foi executada.
performance
postgresql
hard-drive
iostat
ehsanul
fonte
fonte
Respostas:
O fato de o seu dispositivo estar
/dev/xvdb1
implica que você está executando o Xen. Como o seu armazenamento está configurado? Existe disputa para o dispositivo subjacente, e como oiostat
olhar no que ?A menos que você possa eliminar isso como provável, é aí que eu vou apontar o girador giratório da culpa pelo mau desempenho.
Basicamente, a abordagem geral para desvendar um problema de desempenho como esse é pensar em todas as camadas em que um gargalo poderia ocorrer e, em seguida, criar testes para eliminar cada uma delas até você isolar o problema.
fonte
iostat
no disco a partir do dom0 apenas para ver se a imagem é semelhante? Você pode fazer outros benchmarks básicos de disco de ambos os níveis? Isso pelo menos ajudará a diminuir para onde procurar a seguir.iostat
origem? Isso deveria importar? Na verdade, não tenho acesso direto ao dom0 agora, embora eu possa obtê-lo.fio
Enquanto isso, tentarei fazer comparações.Aqui estão algumas sugestões, em ordem mais ou menos aleatória:
O Autovacum não está ativado por padrão no CentOS. Você deve definir várias configurações para habilitá-lo. Verifique novamente para que o processo vacum realmente seja executado. É fácil perder uma das configurações necessárias.
Observe que você precisa executar uma segunda etapa de filtro para essa consulta, que pode ser cara dependendo do que você recebe de volta. Eu consideraria um índice como:
CREATE INDEX consumer_m_lower_last ON consumer_m (mais baixo (last_name));
O que corresponderá à sua consulta e removerá a verificação novamente.
Além disso, como aponta o mattdm, você não pode confiar no iostat em ambientes virtualizados.
Você provavelmente deve verificar http://lonesysadmin.net/2008/02/21/elevatornoop/ se tiver problemas de E / S em um ambiente XEN. As configurações do elevador podem ter um impacto, mas não tão grande.
O disco subjacente está usando instantâneos do LVM? Embora isso seja muito útil do ponto de vista de gerenciamento, ele pode prejudicar o desempenho de E / S. Isso ocorre tanto se o dispositivo de bloco que você está usando for um instantâneo quanto se um instantâneo tiver sido obtido do dispositivo de bloco.
fonte
/
está usando instantâneos do LVM, mas não aquele em que o banco de dados está armazenado. Então eu não acho que é isso. Vou analisar suas outras sugestões!Duvido que este seja um problema com o PostgreSQL e, provavelmente, apenas um problema com o Disk IO. Como os comentários de outra resposta mencionam, se for um problema de E / S de disco, você realmente deve medir no Dom0 para obter uma imagem de tudo o que está acontecendo.
Eu tive um problema muito semelhante há um tempo e acabou sendo um problema com o controlador de disco. O acesso muito lento ao disco estava causando gargalos no sistema enquanto aguardava a E / S do disco (que mostrava médias de carga e tempos de espera muito altos, mas também fazia com que os processos que aguardavam o disco consumissem mais CPU do que de outra forma. não estava reconhecendo o controlador corretamente e estava voltando ao controlador IDE da velha escola em vez de um sata rápido.
A correção foi inicializar com
no final da string do kernel em /etc/grub.conf. (Claro, adicione todos os discos que você tem, Ala:
hdc=noprobe, hdc=none, hdd=
...)fonte