Benchmarking Apache

1

Estou testando o Apache / 2.2.3 (prefork) usando ab e siege com o seguinte comando:

ab -kc 200 -t 120 http://www.mywebsite.com/test.php
siege -c200 -t2M http://www.mywebsite.com/test.php

test.php é um arquivo muito simples que apenas cria uma conexão mysql e então fecha

<?php
$link = mysql_connect("localhost", "username", "password");
mysql_select_db("dbname");
if(!$link) {
    die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);
?>

Os resultados que recebo têm muitas solicitações com falha . Estou tentando descobrir como reduzir o número de solicitações com falha , já que este é um script bastante simples, a carga do servidor é muito baixa, eu não deveria ter um problema em um servidor Quad- Máquina Core Xeon 3Ghz com 8G de RAM.

Saída de siege

Transactions:               9438 hits
Availability:              98.33 %
Elapsed time:             119.39 secs
Data transferred:           0.38 MB
Response time:             1.31 secs
Transaction rate:          79.05 trans/sec
Throughput:               0.00 MB/sec
Concurrency:                  103.37
Successful transactions      9438
Failed transactions:          160
Longest transaction:        21.24
Shortest transaction         0.21

Saída de ab :

Benchmarking www.mywebsite.com (be patient)

Server Software:        Apache/2.2.3
Server Hostname:        www.mywebsite.com
Server Port:            80  

Document Path:          /test.php
Document Length:        22 bytes

Concurrency Level:      200 
Time taken for tests:   35.851520 seconds
Complete requests:      50000
Failed requests:        618
   (Connect: 0, Length: 618, Exceptions: 0)
Write errors:           0   
Keep-Alive requests:    49600
Total transferred:      12932098 bytes
HTML transferred:       1149345 bytes
Requests per second:    1394.64 [#/sec] (mean)
Time per request:       143.406 [ms] (mean)
Time per request:       0.717 [ms] (mean, across all concurrent requests)
Transfer rate:          352.26 [Kbytes/sec] received

Um rápido destaque da minha configuração do Apache

Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15

<IfModule prefork.c>
StartServers 20
MinSpareServers 20
MaxSpareServers 50
ServerLimit 500
#default 200
MaxClients 500
MaxRequestsPerChild  4000
</IfModule>

Eu executei o mesmo teste com o mesmo script em outro servidor mais fraco, e ele não teve nenhum pedido com falha e terminou os testes mais rapidamente. Então, eu me pergunto o que há de errado com isso.

Configuração do MySQL atualizada:

Variáveis

mysql> show variables LIKE '%connect%';
+--------------------------+-------------------+
| Variable_name            | Value             |
+--------------------------+-------------------+
| character_set_connection | latin1            | 
| collation_connection     | latin1_swedish_ci | 
| connect_timeout          | 10                | 
| init_connect             |                   | 
| max_connect_errors       | 10                | 
| max_connections          | 100               | 
| max_user_connections     | 0                 | 
+--------------------------+-------------------+

Status global

mysql> SHOW GLOBAL STATUS LIKE '%connect%';
+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| Aborted_connects         | 343     | 
| Connections              | 1463797 | 
| Max_used_connections     | 101     | 
| Ssl_client_connects      | 0       | 
| Ssl_connect_renegotiates | 0       | 
| Ssl_finished_connects    | 0       | 
| Threads_connected        | 3       | 
+--------------------------+---------+
    
por Rushi 01.08.2010 / 12:39

3 respostas

1

Seu limite de simultaneidade está definitivamente no lado do MySQL, embora eu não tenha certeza de que isso seja necessariamente uma coisa ruim para o desempenho no mundo real. Você tem o MySQL para aceitar 100 conexões simultâneas, então, no máximo, você pode ter apenas 100 instâncias do Apache conversando de uma só vez. Como o seu script de teste é tão simples, ele passa a maior parte do tempo em que está ativo conectado ou, pelo menos, se conectando ao MySQL. Adicione um pouco mais para os processos do Apache que estão em outros estados, e você obterá sua simultaneidade no cerco de 100. Eu não sei exatamente por que ab obtém um nível de simultaneidade maior de 200, mas talvez conte as coisas de maneira diferente.

Se você quiser aumentar seus números de referência, apenas configure seus limites de conexão para o MySQL. O limite de conexões do MySQL provavelmente deve ser pelo menos igual ao número de processos do Apache para algo que passa a maior parte do tempo conversando com o banco de dados.

    
por 02.08.2010 / 03:43
0

Infelizmente, com ab você está comparando o desempenho do seu cliente realmente. Você precisa de uma ferramenta de melhor desempenho como o httperf, que não está matando o host do cliente. Se você gostaria de executar testes reais, você deve usar mais de um host para isso ou, em alguns casos, também uma boa ferramenta. Basta verificar o que o ab está fazendo, de fato, pode ter problemas com limites de arquivos abertos. Também é bom verificar sua configuração do servidor.

link

    
por 01.08.2010 / 13:10
0

Talvez haja algo estranho acontecendo ao lado do MySQL. Uma coisa que pode facilmente acontecer durante esse tipo de teste rápido de "criar uma conexão de banco de dados - fechar" é que mysql_max_connection_errors é preenchido, por padrão é apenas 10.

E outra coisa: você já verificou que os limites máximos de conexão são iguais entre o seu servidor mais fraco (mas funcionando) e mais rápido (e não funciona)? Talvez o valor padrão de 100 conexões MySQL simultâneas seja preenchido.

    
por 01.08.2010 / 14:47