sync-binlog
Quando você comentou sync-binlog = 1
, o que aconteceu?
Você fez com que o sync_binlog padrão fosse 0. O que acontece depois ? A documentação do MySQL diz:
The default value of sync_binlog is 0, which does no synchronizing to disk—in this case, the server relies on the operating system to flush the binary log's contents from time to time as for any other file.
Isso significa que o mysqld está à mercê do sistema operacional para liberar as alterações do disco para os logs binários. Isso indica que deve haver muitos arquivos abertos ( run lsof
) que o sistema operacional precisa liberar para o disco. O log binário atual para o MySQL tem que estar no meio daquele atolamento de log de arquivos abertos que precisam de liberação periódica para o disco, especialmente se muitos desses arquivos abertos estão sendo gravados regularmente.
A documentação do MySQL diz ainda:
A value of 1 is the safest choice because in the event of a crash you lose at most one commit group from the binary log. However, it is also the slowest choice (unless the disk has a battery-backed cache, which makes synchronization very fast).
Isso significa simplesmente que a descarga para o disco realizada por sync-binlog=1
deu alguma estabilidade ao servidor, já que as alterações de disco estavam sendo liberadas para o disco e liberavam o sistema operacional, o desempenho era um pouco melhor. Sem isso, o mysqld tinha a mesma prioridade que qualquer outro processo (aplicativo ou sistema operacional) que tivesse arquivos abertos.
InnoDB
Aqui está uma representação pictórica do InnoDB (do CTO Vadim Tkachenko de Percona)
VocêpodequererforçaroInnoDBaliberarodiscodeformamaisagressivaeaindaassimterumbomdesempenho.
- Defina
innodb_flush_method para que O_DIRECT
faça o InnoDB gerenciar seu próprio liberação de alterações no disco. Dada a imagem, o InnoDB explicitamente liberará para o Buffer de Gravação Dupla no Espaço de Tabela do Sistema (ibdata1), bem como os arquivos.ibd
das tabelas do Buffer Pool. Em um sistema com um controlador RAID de hardware e um cache de gravação com suporte de bateria, o O_DIRECT pode ajudar a evitar o buffer duplo entre o buffer pool do InnoDB e o cache do sistema de arquivos do sistema operacional. - Defina innodb_write_io_threads a 8 (ou 16)
- Defina innodb_log_buffer_size como 128M para reduzir a E / S de disco
- Defina innodb_log_file_size como 1G
Portanto, adicione essas configurações ao my.cnf (é necessário reiniciar)
[mysqld]
innodb_flush_method = O_DIRECT
innodb_write_io_threads = 8
innodb_log_buffer_size = 128M
innodb_log_file_size = 1G
Epílogo
Se você quiser desabilitar o log binário, ajuste o InnoDB para liberar melhor com compensar