Recursos do desempenho do InnoDB INSERT

11

Oi, Estou executando a versão mais recente do Percona Server.

Versão do servidor: 5.5.24-55 Percona Server (GPL), versão 26.0

Eu tenho uma caixa de 10 cpu dessas características.

processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 16
model           : 9
model name      : AMD Opteron(tm) Processor 6128
stepping        : 1
microcode       : 0x10000d9
cpu MHz         : 800.000
cache size      : 512 KB

Possui SSD e 64 GB de RAM. O Innodb tem aproximadamente 10 GB, então innodb_buffer_pool_size definido como 10 GB.

Eu tenho uma tabela que é a seguinte:

create table TODAY
( symbol_id       integer not null
, openp           decimal(10,4)
, high            decimal(10,4)
, low             decimal(10,4)
, last            decimal(10,4) not null
, volume          int
, last_updated      datetime        -- the time of the last quote update
, prev        decimal(10,4) null
, PRIMARY KEY ( symbol_id )
)

Se eu começar com uma tabela vazia e inserir 23.000 linhas, leva cerca de 10 segundos. Se eu fizer uma atualização subsequente em que todas as colunas de todas as linhas sejam atualizadas (exceto symbol_id, é claro), isso levará mais ou menos 11 a 12 segundos.

Esse é genericamente o desempenho de gravação que devo esperar do Innodb? Existe alguma sugestão para melhorar esse desempenho? atualizar 23.000 linhas é um caso extremo, pois normalmente durante um dia de negociação eu preciso atualizar aproximadamente 1000 linhas a cada 5 segundos (essa é a restrição mais realista com a qual estou lidando).

Outras configurações relevantes do mysql.cnf foram alteradas:

innodb_buffer_pool_size = 10G
innodb_log_file_size    = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

BTW, se em vez de Innodb eu criar a tabela com ENGINE = MEMORY, leva cerca de 4 segundos para fazer a inserção, 6 segundos para fazer a atualização.

Muitos TIA, se alguém puder me ajudar a descobrir qual é a referência para esse tipo de consulta, ou me ajudar a melhorar o tempo.

Don

Configurações completas do PS Innodb.

mysql> mostra variáveis ​​globais como 'innodb%';
+ ------------------------------------------- + ----- ------------------- +
| Nome da variável | Valor
+ ------------------------------------------- + ----- ------------------- +
| innodb_adaptive_flushing | ON |
| innodb_adaptive_flushing_method | estimativa |
| innodb_adaptive_hash_index | ON |
| innodb_adaptive_hash_index_partitions | 1 |
| innodb_additional_mem_pool_size | 8388608
| innodb_autoextend_increment | 8
| innodb_autoinc_lock_mode | 1 |
| innodb_blocking_buffer_pool_restore | OFF |
| innodb_buffer_pool_instances | 1 |
| innodb_buffer_pool_restore_at_startup | 0
| innodb_buffer_pool_shm_checksum | ON |
| innodb_buffer_pool_shm_key | 0
| innodb_buffer_pool_size | 10737418240 |
| innodb_change_buffering | tudo |
| innodb_checkpoint_age_target | 0
| innodb_checksums | ON |
| innodb_commit_concurrency | 0
| innodb_concurrency_tickets | 500
| innodb_corrupt_table_action | afirmar |
| innodb_data_file_path | ibdata1: 10M: autoextend |
| innodb_data_home_dir | |
| innodb_dict_size_limit | 0
| innodb_doublewrite | ON |
| innodb_doublewrite_file | |
| innodb_fake_changes | OFF |
| innodb_fast_checksum | OFF |
| innodb_fast_shutdown | 1 |
| innodb_file_format | Antílope |
| innodb_file_format_check | ON |
| innodb_file_format_max | Antílope |
| innodb_file_per_table | OFF |
| innodb_flush_log_at_trx_commit | 2
| innodb_flush_method | O_DIRECT
| innodb_flush_neighbor_pages | área |
| innodb_force_load_corrupted | OFF |
| innodb_force_recovery | 0
| innodb_ibuf_accel_rate | 100
| innodb_ibuf_active_contract | 1 |
| innodb_ibuf_max_size | 5368692736 |
| innodb_import_table_from_xtrabackup | 0
| innodb_io_capacity | 200
| innodb_kill_idle_transaction | 0
| innodb_large_prefix | OFF |
| innodb_lazy_drop_table | 0
| innodb_lock_wait_timeout | 50
| innodb_locks_unsafe_for_binlog | OFF |
| innodb_log_block_size | 512
| innodb_log_buffer_size | 8388608
| innodb_log_file_size | 67108864 |
| innodb_log_files_in_group | 2
| innodb_log_group_home_dir | ./
| innodb_max_dirty_pages_pct | 75
| innodb_max_purge_lag | 0
| innodb_mirrored_log_groups | 1 |
| innodb_old_blocks_pct | 37
| innodb_old_blocks_time | 0
| innodb_open_files | 300
| innodb_page_size | 16384
| innodb_purge_batch_size | 20
| innodb_purge_threads | 1 |
| innodb_random_read_ahead | OFF |
| innodb_read_ahead | linear |
| innodb_read_ahead_threshold | 56
| innodb_read_io_threads | 4
| innodb_recovery_stats | OFF |
| innodb_recovery_update_relay_log | OFF |
| innodb_replication_delay | 0
| innodb_rollback_on_timeout | OFF |
| innodb_rollback_segments | 128
| innodb_show_locks_held | 10
| innodb_show_verbose_locks | 0
| innodb_spin_wait_delay | 6
| innodb_stats_auto_update | 1 |
| innodb_stats_method | nulls_equal |
| innodb_stats_on_metadata | ON |
| innodb_stats_sample_pages | 8
| innodb_stats_update_need_lock | 1 |
| innodb_strict_mode | OFF |
| innodb_support_xa | ON |
| innodb_sync_spin_loops | 30
| innodb_table_locks | ON |
| innodb_thread_concurrency | 0
| innodb_thread_concurrency_timer_based | OFF |
| innodb_thread_sleep_delay | 10000
| innodb_use_global_flush_log_at_trx_commit | ON |
| innodb_use_native_aio | ON |
| innodb_use_sys_malloc | ON |
| innodb_use_sys_stats_table | OFF |
| innodb_version | 1.1.8-rel26.0 |
| innodb_write_io_threads | 4
+ ------------------------------------------- + ----- ------------------- +
90 linhas em conjunto (0,00 s)

Corri numctl --hardware e aqui está a saída que obtive. Os comentários do meu administrador são anotados abaixo (como para interpretação).

raiz @ prog: / data / mysql # numactl --hardware
disponível: 4 nós (0-3)
nó 0 cpus: 0 1 2 3
tamanho do nó 0: 32766 MB
nó 0 grátis: 21480 MB
nó 1 cpus: 4 5 6 7
tamanho do nó 1: 32768 MB
nó 1 grátis: 25285 MB
nó 2 cpus: 12 13 14 15
tamanho do nó 2: 32768 MB
nó 2 livre: 20376 MB
nó 3 cpus: 8 9 10 11
tamanho do nó 3: 32768 MB
nó 3 grátis: 24898 MB
distâncias dos nós:
nó 0 1 2 3
  0: 10 16 16 16
  1: 16 10 16 16
  2: 16 16 10 16
  3: 16 16 16 10

Don Wool
fonte

Respostas:

9

Você precisa ajustar as configurações do InnoDB nas seguintes áreas:

Aqui estão minhas postagens anteriores sobre o ajuste do mecanismo de armazenamento InnoDB

RolandoMySQLDBA
fonte
Obrigado por esta resposta incrivelmente útil !! Eu te saúdo. Em relação ao tamanho do log, preciso me preocupar em torná-lo muito grande? minha preocupação é algo que Tkachenko escreveu sobre mysqlperformanceblog.com/2011/09/18/disaster-mysql-5-5-flushing . Sei que estou em Percona, então talvez isso não seja uma preocupação .. mas quero ter certeza de que não encontro um cenário de estol. Estou cavando para o resto da sua resposta ...
Don Lã
No que diz respeito innodb_buffer_pool_instances, tenho uma caixa de 16 cpu (pensei que fosse 10). Em relação a numactl, meu administrador diz "Você tem 16 CPUs no total e quatro blocos de RAM, 32G cada. Cada bloco de RAM é tratado como memória local por quatro CPUs".
11114 Don
Por favor, execute numactl --hardwaree publique a saída na pergunta. Estou tentando descobrir CPUs físicas e quero ter certeza de que o administrador não está dizendo CPUs quando ele quer dizer núcleos.
RolandoMySQLDBA
Ok, eu postei a saída de 'numactl' na pergunta.
Don Lã
Para mim, a saída parece um quad-quad core (16 núcleos) usando 4 CPUs. Portanto, defina innodb_buffer_pool_instances=4. Mais uma solicitação: verifique novamente, o servidor de banco de dados possui 64 GB ou 128 GB ???
RolandoMySQLDBA