Eu estou escrevendo um indexador, usando python, que indexa documentos e os insere no banco de dados, antes de ser um processo único, mas agora eu fiz o multiprocessamento com 4 processos paralelos em execução.
Agora, atingindo o problema de IO, o principal problema de IO não é o meu processo, mas o sistema de jourbond jdb2 do EXT4. Ele está em 99,99% e com a CPU que está aguardando a espera do IO em cada Confirmação do MySQL.
Vi muitos tendo esse problema na internet e sua solução é montar usando barreira = 0. Isso desativaria totalmente o diário? Meus servidores têm UPS e tentadores, devo?
linux
mysql
performance
python
Phyo Arkar Lwin
fonte
fonte
Respostas:
Coloque o banco de dados em um sistema de arquivos sem registro no diário. Pelo menos servidores maiores (oracle, sql server) têm sua própria função de diário (log de transações) e otimizam suas E / S de acordo. Você possui log e banco de dados em sistemas de arquivos e discos separados e confia na funcionalidade interna do banco de dados para lidar com E / S ruins. Normalmente, não há alterações no sistema de arquivos (configuração maior), exceto a data de gravação, porque os arquivos não se expandem - eles seriam gerados com seu tamanho "final" (ok, os administradores podem mudar isso), e as alterações são como eu disse, rastreadas pelo banco de dados log de transações de nível.
Você também pode nos dizer qual é a sua camada de hardware. A maioria das pessoas subestima que o IOPS é o fator limitante para um banco de dados e acha que um pequeno conjunto de discos é um ambiente adequado para um grande banco de dados. Enquanto alguns de nós trabalham em bancos de dados usando um número maior de discos, potencialmente suportam um número maior de IOPS.
fonte
Sempre haverá uma troca entre resiliência e desempenho.
Com o MySQL no ext4, o padrão barreiras = 1 realmente causa uma lentidão, no entanto, a primeira ação não deve ser desativar o registro no diário ou ativar data = write-back.
Primeiro, se a resiliência é de grande importância, um RAID suportado por bateria certamente vale a pena.
As opções de montagem que escolhi, especialmente em RAID sem bateria, são:
Isso intencionalmente não está usando data = write-back, porque não quero arriscar a corrupção do sistema de arquivos, resultando em "dados antigos apareçam nos arquivos após uma falha e recuperação do diário" (a citação é de
man mount
).A configuração ideal no my.cnf para resiliência total em torno das configurações relacionadas à E / S é:
Optei pela seguinte sequência de trade-offs para aumentar o desempenho:
sync_binlog = 0
: esta é a primeira configuração do MySQL que mudo da resiliência total. A razão para isso é que ele fornece uma melhoria significativa no desempenho, especialmente ondebinlog_format=row
(infelizmente é necessário para o Jira). Estou usando réplicas MySQL suficientes no cluster para que, se o binlog fosse corrompido por um cenário de perda de energia, eu fizesse uma cópia binária de outra réplica.innodb_flush_log_at_trx_commit = 2
: Embora seja necessário um valor 1 para conformidade total com ACID, com um valor de 2 ", o buffer de log é gravado no arquivo a cada confirmação, mas a operação de liberação para disco não é executada nele. No entanto, a liberação no o arquivo de log ocorre uma vez por segundo também quando o valor é 2. Observe que a liberação de uma vez por segundo não é 100% garantida para acontecer a cada segundo, devido a problemas de agendamento do processo. " (citação de documentos do MySQL)data=writeback
. Observe que, se esse for o seu sistema de arquivos raiz, você também precisará passar uma opção de linha de comando do kernel. Eu dei alguns passos nisso na coderwall .innodb_flush_method
. É mostrado que O_DIRECT melhora o desempenho em algumas cargas de trabalho, mas não é certo que isso funcione em seu ambiente.innodb_io_capacity
, e ajustar configurações, comoinnodb_adaptive_flushing
,innodb_read_io_threads
,innodb_write_io_threads
,innodb_purge_threads
, e outras configurações possíveis.fonte
É bem provável que o seu back-end de E / S não esteja lidando bem com a carga. Você deve se certificar de que seu sistema de arquivos não esteja registrando dados no diário. Eu sugeriria o uso dos
data=writeback,relatime,nobarrier
parâmetros para montar na partição de dados do banco de dados como a primeira otimização rápida e suja.Além disso, deduzindo dos seus sintomas, você aparentemente não está usando o cache de gravação com seu controlador. Você deve certificar-se de estar usando um cache de gravação com bateria ou com flash em seu controlador e habilitá-lo - isso deve proporcionar um aumento significativo no desempenho sem aumentar muito o risco de perda ou corrupção de dados. Observe que o uso do cache de gravação sem bateria ou backup flash aumenta significativamente o risco de perda ou corrupção de dados - faça isso apenas para fins de teste e / ou se você puder sofrer a perda.
fonte
nobarrier
o mesmo quebarrier=0
?Essa é uma pergunta antiga, mas enfrentamos os mesmos problemas (alta espera de E / S e velocidades terríveis de inserção / atualização) na semana passada em um novo servidor dedicado e esta solução soluciona esse problema diretamente.
Desativar o registro no diário
tune2fs -O "^has_journal" /dev/<drive>
foi a solução mais rápida, pois elimina a espera de E / S por causa do processo JDB2. Mas isso não é recomendado, a menos que você tenha uma unidade com bateria, pois perderá dados em caso de falha. As tabelas do InnoDB são seguras se você tiverdoublewrite
ativado no MySQL. Mas arquivos como .frm, logs etc. não são seguros. Tentamos mover esses arquivos para outra unidade (especialmente os logs de lixeira), mas a espera do jdb2 IO ainda persistia. Portanto, não nos deixou muito confortáveis.data=writeback,relatime,nobarrier
não ajudou a acelerar as gravações / leituras, além de desativar o registro no diário em toda a partição. Mais opções para ext4 estão no documento EXT4 .O verdadeiro culpado no nosso caso foi
sync_binlog
. Nós tínhamos definido é como1
em/etc/mysql/my.cnf
e foi matando desempenho.A Percona valida isso aqui . Definimos como padrão
0
e o desempenho disparou em mais de 500%.fonte
Em qual mecanismo de banco de dados você está usando para inserir esses dados?
Se for o MyISAM: deve bloquear a tabela inteira durante uma gravação, portanto, executar threads de inserção simultâneos matará QUALQUER sistema, por mais poderoso que seja.
Verifique se você está usando o InnoDB para essas tabelas.
fonte
Além disso, não está diretamente relacionado ao mysql, mas alguns HD têm problemas com o ext4 devido ao gerenciamento agressivo de energia ... quando isso acontece, a carga da máquina aumenta sem nenhuma atividade aparente.
Tente desativá-lo. primeiro verifique o valor que você possui (se precisar recuperá-lo sem reiniciar) e depois desative-o.
Verifique o valor atual:
Desativá-lo
(ou qualquer que seja o seu HD) e teste. Provavelmente não ajudará na maioria dos problemas, mas pode ajudar alguns usuários por aí. A reinicialização redefinirá o valor ou substituirá manualmente o 255 pelo valor anterior.
Se ajudar, verifique a
/etc/default/hdparm
ou/etc/hdparm.conf
para uma configuração mais permanente, configurando-a na inicialização.fonte