AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 49984
Accepted
Niels Kristian
Niels Kristian
Asked: 2013-09-17 07:49:55 +0800 CST2013-09-17 07:49:55 +0800 CST 2013-09-17 07:49:55 +0800 CST

Como otimizar o banco de dados para I/O pesado de atualizações (software e hardware)

  • 772

A situação Eu tenho um banco de dados postgresql 9.2 que é bastante atualizado o tempo todo. O sistema está, portanto, vinculado à E/S, e atualmente estou pensando em fazer outra atualização, só preciso de algumas orientações sobre onde começar a melhorar.

Aqui está uma imagem de como a situação ficou nos últimos 3 meses:

insira a descrição da imagem aqui

Como você pode ver, as operações de atualização são responsáveis ​​pela maior parte da utilização do disco. Aqui está outra imagem de como a situação fica em uma janela de 3 horas mais detalhada:

insira a descrição da imagem aqui

Como você pode ver, a taxa de gravação de pico é de cerca de 20 MB/s

Software O servidor está executando o Ubuntu 12.04 e o postgresql 9.2. O tipo de atualizações são pequenas atualizações normalmente em linhas individuais identificadas por ID. Por exemplo UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id. Eu removi e otimizei os índices tanto quanto eu acho que é possível, e a configuração dos servidores (tanto o kernel linux quanto o postgres conf) também está bastante otimizada.

Hardware O hardware é um servidor dedicado com 32 GB de RAM ECC, 4 discos SAS de 600 GB e 15.000 rpm em um array RAID 10, controlado por um controlador RAID LSI com BBU e um processador Intel Xeon E3-1245 Quadcore.

Perguntas

  • O desempenho visto pelos gráficos é razoável para um sistema deste calibre (leitura/gravação)?
  • Portanto, devo me concentrar em fazer uma atualização de hardware ou investigar mais profundamente o software (ajustes do kernel, confs, consultas etc.)?
  • Se estiver fazendo uma atualização de hardware, o número de discos é fundamental para o desempenho?

------------------------------ATUALIZAR------------------- ----------------

Agora atualizei meu servidor de banco de dados com quatro SSDs Intel 520 em vez dos antigos discos SAS de 15k. Estou usando o mesmo controlador de raid. As coisas melhoraram bastante, como você pode ver a seguir, o desempenho de E/S de pico melhorou cerca de 6 a 10 vezes - e isso é ótimo!. insira a descrição da imagem aqui No entanto, eu esperava algo mais como uma melhoria de 20 a 50 vezes de acordo com as respostas e os recursos de E/S dos novos SSDs. Então aqui vai outra pergunta.

Nova pergunta Há algo na minha configuração atual que está limitando o desempenho de E/S do meu sistema (onde está o gargalo)?

Minhas configurações:

/etc/postgresql/9.2/main/postgresql.conf

data_directory = '/var/lib/postgresql/9.2/main'
hba_file = '/etc/postgresql/9.2/main/pg_hba.conf'
ident_file = '/etc/postgresql/9.2/main/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.2-main.pid'
listen_addresses = '192.168.0.4, localhost'
port = 5432
unix_socket_directory = '/var/run/postgresql'
wal_level = hot_standby
synchronous_commit = on
checkpoint_timeout = 10min
archive_mode = on
archive_command = 'rsync -a %p [email protected]:/var/lib/postgresql/9.2/wals/%f </dev/null'
max_wal_senders = 1
wal_keep_segments = 32
hot_standby = on
log_line_prefix = '%t '
datestyle = 'iso, mdy'
lc_messages = 'en_US.UTF-8'
lc_monetary = 'en_US.UTF-8'
lc_numeric = 'en_US.UTF-8'
lc_time = 'en_US.UTF-8'
default_text_search_config = 'pg_catalog.english'
default_statistics_target = 100
maintenance_work_mem = 1920MB
checkpoint_completion_target = 0.7
effective_cache_size = 22GB
work_mem = 160MB
wal_buffers = 16MB
checkpoint_segments = 32
shared_buffers = 7680MB
max_connections = 400 

/etc/sysctl.conf

# sysctl config
#net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
# ipv6 settings (no autoconfiguration)
net.ipv6.conf.default.autoconf=0
net.ipv6.conf.default.accept_dad=0
net.ipv6.conf.default.accept_ra=0
net.ipv6.conf.default.accept_ra_defrtr=0
net.ipv6.conf.default.accept_ra_rtr_pref=0
net.ipv6.conf.default.accept_ra_pinfo=0
net.ipv6.conf.default.accept_source_route=0
net.ipv6.conf.default.accept_redirects=0
net.ipv6.conf.default.forwarding=0
net.ipv6.conf.all.autoconf=0
net.ipv6.conf.all.accept_dad=0
net.ipv6.conf.all.accept_ra=0
net.ipv6.conf.all.accept_ra_defrtr=0
net.ipv6.conf.all.accept_ra_rtr_pref=0
net.ipv6.conf.all.accept_ra_pinfo=0
net.ipv6.conf.all.accept_source_route=0
net.ipv6.conf.all.accept_redirects=0
net.ipv6.conf.all.forwarding=0
# Updated according to postgresql tuning
vm.dirty_ratio = 10
vm.dirty_background_ratio = 1
vm.swappiness = 0
vm.overcommit_memory = 2
kernel.sched_autogroup_enabled = 0
kernel.sched_migration_cost = 50000000

/etc/sysctl.d/30-postgresql-shm.conf

# Shared memory settings for PostgreSQL
# Note that if another program uses shared memory as well, you will have to
# coordinate the size settings between the two.
# Maximum size of shared memory segment in bytes
#kernel.shmmax = 33554432
# Maximum total size of shared memory in pages (normally 4096 bytes)
#kernel.shmall = 2097152
kernel.shmmax = 8589934592
kernel.shmall = 17179869184
# Updated according to postgresql tuning

Saída deMegaCli64 -LDInfo -LAll -aAll

Adapter 0 -- Virtual Drive Information:
Virtual Drive: 0 (Target Id: 0)
Name                :
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
Size                : 446.125 GB
Sector Size         : 512
Is VD emulated      : No
Mirror Data         : 446.125 GB
State               : Optimal
Strip Size          : 64 KB
Number Of Drives per span:2
Span Depth          : 2
Default Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Current Cache Policy: WriteBack, ReadAhead, Direct, Write Cache OK if Bad BBU
Default Access Policy: Read/Write
Current Access Policy: Read/Write
Disk Cache Policy   : Disk's Default
Encryption Type     : None
Is VD Cached: No
postgresql performance
  • 3 3 respostas
  • 32422 Views

3 respostas

  • Voted
  1. Best Answer
    TomTom
    2013-09-17T08:02:28+08:002013-09-17T08:02:28+08:00

    Se estiver fazendo uma atualização de hardware, o número de discos é fundamental para o desempenho?

    Sim, como um disco rígido - mesmo SAS - tem uma cabeça que leva tempo para se mover.

    Quer uma atualização HUGH?

    Mate os discos SAS, vá para SATA. Conecte o SSD SATA - nível empresarial, como o Samsung 843T.

    Resultado? Você pode fazer cerca de 60.000 (ou seja, 60 mil) IOPS por unidade.

    Esta é a razão pela qual os SSDs são assassinos no espaço do banco de dados e muito mais baratos do que qualquer unidade SAS. O disco giratório Phyiscal simplesmente não consegue acompanhar os recursos de IOPS dos discos.

    Seus discos SAS foram uma escolha medíocre para começar (grandes demais para obter muito IOPS) Para um banco de dados de uso mais alto (mais discos menores significariam muito mais IOPS), mas no final o SSD é o divisor de águas aqui.

    Em relação ao software / kernel. Qualquer banco de dados decente fará muitos IOPS e liberará os buffers. O arquivo de log precisa ser ESCRITO para que as condições básicas de ACID sejam garantidas. Os únicos ajustes de kernel que você poderia fazer invalidariam sua integridade transacional - parcialmente você PODE se safar disso. O controlador Raid no modo write back fará isso - confirmará a gravação como liberada, mesmo que não seja - mas pode fazê-lo porque a BBU é considerada segura no dia em que a energia falhar. Qualquer coisa que você faça mais acima no kernel - saiba que você pode viver com os efeitos colaterais negativos.

    No final, os bancos de dados precisam de IOPS, e você pode se surpreender ao ver o quão pequena sua configuração é comparada a algumas outras aqui. Já vi bancos de dados com mais de 100 discos apenas para obter o IOPS de que precisavam. Mas, na verdade, hoje, você compra SSD e escolhe o tamanho deles - eles são tão superiores em recursos de IOPS que não faz sentido lutar contra esse jogo com drives SAS.

    E sim, seus números de IOPS não parecem ruins para o hardware. Dentro do que eu esperaria.

    • 12
  2. kgrittn
    2013-09-17T13:03:35+08:002013-09-17T13:03:35+08:00

    Se você puder pagar, coloque pg_xlog em um par separado de unidades RAID 1 em seu próprio controlador com RAM com bateria configurada para write-back. Isso é verdade mesmo se você precisar usar ferrugem giratória para pg_xlog enquanto todo o resto estiver no SSD.

    Se você usa SSD, certifique-se de que ele tenha um supercapacitor ou outro meio para manter todos os dados em cache em caso de falha de energia.

    Em geral, mais fusos significam mais largura de banda de E/S.

    • 6
  3. Paul Miles
    2014-05-21T00:56:09+08:002014-05-21T00:56:09+08:00

    Supondo que você esteja executando no Linux, certifique-se de definir o agendador de E/S de disco.

    Da experiência passada, mudar para noop lhe dará uma velocidade bastante substancial (especialmente para SSD).

    A alteração do agendador de E/S pode ser feita em tempo real, sem tempo de inatividade.

    ou seja. echo noop > /sys/block//queue/scheduler

    Veja: http://www.cyberciti.biz/faq/linux-change-io-scheduler-for-harddisk/ para mais informações.

    • 1

relate perguntas

  • Sequências Biológicas do UniProt no PostgreSQL

  • Como determinar se um Índice é necessário ou necessário

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve