melhora a velocidade do servidor mysql para um aplicativo hospedado no VPS

1

Estou executando vários aplicativos no meu VPS. Esses aplicativos são criados com PHP e usados em uma rede social. Atualmente, tenho alguns problemas com a velocidade do servidor. Meu VPS tem as seguintes características:

CPU 2x2000GHz
Memory: 3Gb
SAS 15K 100 Gb
CentOS 5.5

my.cnf (mecanismo MyIsam):

max_connections=80
key_buffer = 16K
max_allowed_packet = 1M
table_cache = 128
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 64K
query_cache_type=1
query_cache_size=20M
server-id       = 1
[mysqldump]
quick
max_allowed_packet = 10M
default-character-set = cp1251
[mysql]
no-auto-rehash
default-character-set = cp1251
[isamchk]
key_buffer = 8M
sort_buffer_size = 8M
[myisamchk]
key_buffer = 8M
sort_buffer_size = 8M

Também instalamos o memcached:

PORT="11211"
USER="nobody"
MAXCONN="1024"
CACHESIZE="500"
OPTIONS="-l 127.0.0.1"

parte muito pequena da lista de processos do servidor mysql:

UPDATE 1

| 314041 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Sending data     | SELECT 'uid' FROM 'obschaga_users' WHERE 'uid'>0                                   | 
| 314045 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Locked           | UPDATE 'obschaga_users' SET 'online'=1306785866 WHERE 'uid'=46217997 LIMIT 1       | 
| 314046 | obwaga2_ob1       | localhost       | obwaga2_ob1 | Query   |    0 | Locked           | UPDATE 'obschaga_users' SET 'online'=1306785866 WHERE 'uid'=21704816 LIMIT 1 

O problema consiste na carga de 60-80% quando há 200-280 + conectada ao servidor web Apache. Você poderia por favor corrigir minhas configurações do servidor mysql / memcached para acelerar o servidor? Se você precisar de mais informações sobre a configuração do servidor, é só me avisar.

Obrigado antecipadamente.

UPDATE 2

Periodicamente, estou enfrentando o seguinte problema:

-bash-3.2# uptime
-bash: fork: Cannot allocate memory
O comando

show status like 'Threads_connected'; mostra 93 encadeamentos. Eu suponho que quando o servidor não responde aos comandos, há muito mais threads.

Às vezes, também tenho o seguinte erro:

ERROR 1040 (00000): Too many connections

Os processos do Mysql são os seguintes:

  | 1630030 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT 'sex' FROM 'obschaga_users' WHERE 'uid'<>134663653 and 'club'=1 and 'online'>=1306849507      | 
    | 1630031 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT 'level','clan','silver','win','lost','val','otkaz','wgift' FROM 'obschaga_users' WHERE 'uid'= | 
    | 1630032 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT 'uid','online' FROM 'obschaga_users' WHERE 'uid' IN (96113249, 88303183, 123525384, 37125913, | 
    | 1630033 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT 'obsch','online' FROM 'obschaga_users' WHERE 'uid'=114941284 LIMIT 1                          | 
obschaga_users' WHERE 'uid'= | 
    | 1630036 | obwaga2_obwaga | localhost | obwaga2_obwaga | Query   |    0 | Opening tables | SELECT 'uid1' FROM 'obschaga_wait_friend' WHERE 'uid0'=39448276 and 'state'=10 LIMIT 1     

O momento engraçado é que há muita memória free -mto shows:

             total       used       free     shared    buffers     cached
Mem:          3000       1111       1888          0          0          0
Swap:            0          0          0
Total:        3000       1111       1888

Devo mostrar cat /proc/user_beancounters ou ulimit -a ?

    
por Andrew 30.05.2011 / 21:11

3 respostas

2

Provavelmente sua configuração está OK. É muito mais provável que haja melhorias algorítmicas no seu código. Você não mencionou se a carga foi gerada pelo Apache, MySQL ou outra coisa. Esta é a primeira coisa a verificar. Se for o Apache, comece por fazer o perfil do seu código PHP. O xhprof é excelente para isso.

Se o MySQL é provavelmente o culpado, procure no log de consultas lentas . Além disso, passe tempo usando a declaração EXPLAIN .

Esta consulta SQL também é suspeita:

SELECT 'uid' FROM 'obschaga_users' WHERE 'uid'>0

Isso parece que vai retornar todos os uid em uma tabela inteira (duvido que muitos uids sejam negativos). Se essa consulta for executada em seu aplicativo, provavelmente será um problema enorme de desempenho. No mínimo, certifique-se de que haja um índice na coluna uid. No entanto, esse tipo de consulta nunca deve ser usado. Tem de haver uma maneira de ter algum tipo de condições extras de pesquisa para reduzir a quantidade de dados retornados.

    
por 30.05.2011 / 22:32
2

Mudando meu comentário para uma resposta

  1. Verifique se você não está esgotando suas conexões máximas de 60. Execute show status like 'Threads_connected'; nos horários de pico para ver se atinge o máximo.

  2. Seus tamanhos de buffer para o MySQL são muito modestos. Desde que o Apache não esteja usando toda a sua memória, aumente-os para algo como:

    bulk_insert_buffer_size=32M 
    join_buffer_size=4M 
    key_buffer_size=128M 
    max_allowed_packet=32M 
    query_cache_limit=4M 
    read_buffer_size=1M 
    read_rnd_buffer_size=2M 
    sort_buffer_size=8M 
    table_cache=128 
    tmp_table_size=32M
    
por 30.05.2011 / 22:41
1

Você só mostra 3 processos em sua lista, 2 dos quais são gravações e 1 leitura. MyISAM faz bloqueios de tabela para gravações.

Você pode mexer em tudo o que quiser, mas provavelmente deve procurar outro VPS e colocar o MySQL sozinho nele. Por exemplo, tenha uma camada da Web / aplicativo e uma camada do banco de dados. Você provavelmente também deve olhar seriamente para migrar para o InnoDB, que tem maior bloqueio simultâneo / em nível de linha.

Felicidades

    
por 30.05.2011 / 23:40