Obtendo mais desempenho do banco de dados - postgresql

3

Existe um django "web application" (do inferno) que estamos hospedando em um servidor dedicado. Após alguns benchmarking, descobri que o "Aplicativo" é incrivelmente ruim nas operações de banco de dados (a refatoração não é uma opção no momento). Ele gera uma quantidade ímpia de atividade de leitura e gravação. No momento, estamos adquirindo outro (segundo) servidor dedicado para aumentar o desempenho e um pouco de redundância de emergência. Ambas as máquinas possuem 24cores (CPU Intel (R) Xeon (R) E5645 @ 2.40GHz) e 48GB de RAM (também há Raid 10, hardrives de 15k 6x150gb).

Eu queria saber como podemos melhorar a configuração.

  1. Use o KVM para virtualização, separe vmachines para nginx + uwsgi, memcached e postgresql. De preferência, faça mais de 1 postgresql - e use o pg-pool para obter mais resultados.
  2. Deixe a virtualização sozinha, instale tudo em cada servidor e, com essa configuração de espelhamento, obtenha o balanceador de carga adequado no nível do datacenter.
  3. Obtenha mais algumas máquinas - menos núcleos, menos memória RAM (mais baratas em geral do que as outras duas "principais") e defina um cluster de db aí?
  4. IF db cluster route - então, qual seria o melhor desempenho para gravações e leituras?

(no momento, estamos reescrevendo o aplicativo de maneira correta, mas obter o atual - péssimo - um funcionando um pouco mais rápido é vital, precisamos mantê-lo com o aumento do tráfego por pelo menos os próximos 3 meses ...)

Você pode oferecer alguns conselhos sobre o reforço da configuração um pouco? Com o ênfase em preparar a estrutura da máquina de banco de dados para o aplicativo ridiculamente ineficiente do inferno.

    
por strzelecki.maciek 01.12.2011 / 19:33

3 respostas

4

Algumas dicas básicas de desempenho do banco de dados no nível do sistema operacional:

  1. Tenha mais memória RAM do que você sabe o que fazer.
    Se você puder ajustar toda a sua consulta na RAM, ou pelo menos manter os dados no banco de dados ou no cache do sistema operacional, seu desempenho será substancialmente melhorado.

  2. Gaste o dinheiro em disco rápido e em um bom controlador RAID.
    O RAID 10, se você puder obtê-lo, e com um backup de bateria no controlador RAID, para aproveitar ao máximo o cache de gravação.

  3. Ajustar as configurações do servidor Postgres
    (Há um link para a página wiki do Postgres sobre o ajuste na resposta de Khaled)

  4. Aproveite os escravos somente leitura
    Se você estiver executando o Postgres 9.x, você pode ter servidores escravos Somente Leitura. Descarregue algum trabalho de leitura intensiva (como relatórios) para os escravos para que o banco de dados principal não esteja ocupado com isso quando você tentar fazer atualizações.

  5. nunca NUNCA NUNCA NUNCA virtualize um servidor de banco de dados de produção
    Bem quase nunca - virtualizar o servidor de banco de dados é um matador de desempenho.

Para dicas específicas do DB, você pode querer fazer o check-in no dba.SE - Grandes ganhos de desempenho podem ser obtidos a partir da indexação e design de consulta.

    
por 01.12.2011 / 21:20
2

Sempre me disseram - apesar de não ter experiência com isso - que, para uma velocidade ideal do banco de dados, você deveria executar o daemon do banco de dados no bare metal (não em uma VM) em um array RAID10. Pelo que entendi um RAID1 + LVM conta como RAID10 neste caso e muita RAM. VMs comerão em sua RAM disponível.

Além disso, não tenho certeza de qual será o bom balanceamento de carga na frente das VMs no mesmo servidor físico (talvez eu esteja completamente errado sobre isso).

    
por 01.12.2011 / 19:56
1

Existem várias coisas que podem ser feitas para melhorar o desempenho do servidor de banco de dados. Aqui estão alguns:

  1. Otimize suas consultas o máximo possível.
    Defina log_min_duration_statement em seu arquivo de configuração do Postgres para o que você considera ser o limite de velocidade aceitável e, em seguida, ataque as consultas lentas com EXPLAIN para descobrir por que eles são lentos.

  2. Ajuste seus parâmetros do servidor postgresql. Você pode encontrar recursos na Web sobre como fazer isso.

  3. Separe os serviços em diferentes máquinas, quando aplicável.
    Isso não é bom apenas para o desempenho, mas também é bom para a segurança.

  4. Crie o (s) índice (s) necessário (s) na (s) tabela (s) do banco de dados para acelerar as consultas.
    Os resultados de EXPLAIN de (1) acima provavelmente ajudarão você

por 01.12.2011 / 20:57