Estou executando um aplicativo do Facebook que atualmente tem de 300 a 600 usuários simultâneos (e em crescimento). Para preparar o hardware para o crescimento, mudei meus i7 / 12gb ram / 2x 80gb intel x25 ssd (debian 5.0 / mysql 5.0 / 64bit) para um bi-xeon / 24gb ram / 2x 120gb intel 320 ssd (ubuntu 10.10 / mysql 5.1 / 64 bits).
agora estou enfrentando o problema de que o desempenho é pior do que na "caixa menor". Nos dois servidores, tenho usado o nginx / php fcgi para veicular o conteúdo.
Estou usando apenas o innodb, tendo Lê / Grava cerca de 65% / 35%. Cerca de 800 - 1000 qps, mas todas as consultas são simples e nunca se juntam a mais de uma tabela adicional. Todos os índices são definidos e nenhuma consulta individual é registrada no log lento (> 2s). No momento, tenho cerca de 400 MB de dados (cerca de 1 GB com índices) esperando dobrar a cada mês.
Eu adoraria todos que pudessem me dar uma dica do que mudar para torná-la mais suave.
A configuração antiga na caixa i7 era assim (myisam / innodb), com um desempenho muito bom para mais de 800 usuários.
old my.cnf
key_buffer = 3000M
max_allowed_packet = 128M
thread_stack = 192K
thread_cache_size = 8
max_connections = 400
table_cache = 8000
thread_concurrency = 16
query_cache_limit = 8M
query_cache_size = 128M
wait_timeout = 10
interactive_timeout = 10
connect_timeout = 600
low_priority_updates = 1
join_buffer_size = 8M
read_buffer_size = 2M
sort_buffer_size = 3M
myisam_sort_buffer_size = 32M
read_rnd_buffer_size = 4M
innodb_buffer_pool_size = 3G
innodb_log_buffer_size = 8M
A nova configuração na caixa bi-xeon é assim (pure innodb), causando alta carga com mais de 300 usuários. Cerca de 30 processos mysql estão no topo da lista de processos.
E / S de disco:
avg-cpu: %user %nice %system %iowait %steal %idle
36.28 0.00 1.60 0.17 0.00 61.95
my.cnf
key_buffer = 64M
max_allowed_packet = 1M
thread_stack = 192K
thread_cache_size = 128
max_connections = 500
table_cache = 512
#thread_concurrency = 10
sort_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_limit = 1M
query_cache_size = 128M
query_cache_type = 1
innodb_file_per_table = 1
innodb_data_file_path = ibdata1:1000M:autoextend
innodb_buffer_pool_size = 16384M
innodb_additional_mem_pool_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_support_xa = 0
innodb_lock_wait_timeout = 50
innodb_flush_method=O_DIRECT
innodb_log_files_in_group = 2
innodb_log_file_size = 128M
innodb_log_buffer_size = 8M
innodb_thread_concurrency = 12
fonte
skip-name-resolve
desativado e pode ser ativado?Respostas:
Escrevi algumas postagens no StackExchnage
Leia-os para obter as orientações necessárias.
Agora, para questões mais urgentes: você mencionou que possui 400 MB de dados, 1 GB com índices. Isso me assusta que seus índices sejam 50% maiores que os dados. No entanto, como todos os seus dados são do InnoDB e você está satisfeito com o desempenho atual da consulta, suas configurações são mais do que adequadas, principalmente os 16384 MB de innodb_buffer_pool_size. São 16GB. Você está tudo pronto lá. Mas espere !!! Seu innodb_log_file_size é de 128 milhões? Muito pequeno, dado o buffer pool de 16 GB. Você deve redimensionar os arquivos ib_logfile (configure o innodb_log_file_size para 2047M).
Você pode estar enfrentando carga por segmento. Tente definir seus buffers de conexão (join_buffer_size, sort_buffer_size, read_buffer_size, read_rnd_buffer_size)
De mim: Por que o MySQL diz que estou com falta de memória?
Do @DTest: Como você calcula a variável mysql max_connections?
De uma chance !!!
fonte
Em caso afirmativo, verifique se há melhorias / degradações sutis no desempenho em http://mysql.rjweb.org/doc.php/myisam2innodb
innodb_flush_log_at_trx_commit = 1
- causa uma gravação no log após cada transação. Considere usar
= 2
.max_connections
-SHOW GLOBAL STATUS LIKE 'max_used_connections'
- isso informará quantos você precisou desde a inicialização.
cache de consulta:
Isso pode estar doendo. Acima, digamos,
50M
o CQ gasta muito tempo em manutenção. Tê-lo tambémON
pode ser um desperdício. FaçaSHOW GLOBAL STATUS LIKE 'Qc%'
para verificar a eficácia.fonte