2016-02-19 21 views
7

Sto eseguendo alcuni test di carico sul mio nuovo server Apache/PHP/Mysql (stack Bitnami LAMP, Php 7.0.3/MySQL 5.7.10). Sto usando AWS con 1 istanza EC2 dietro a loadBalancer. Al momento sto usando loader.io o jmeter per i test. Sto testando una semplice API che eseguire questa query:Mysql mostra non più di 5 connessioni simultanee

select *,sleep(0.5) from debug limit 1 

ho aggiunto il sonno (0,5) perché volevo vedere come si comportano server con più connessioni simultanee e ho trovato un collo di bottiglia: se corro " MOSTRA ELENCO PROCESS "Posso vedere solo 5 processi anche se ho 10 utenti contemporanei. Il test di carico mostra che le connessioni vengono accodate perché il tempo di risposta aumenta durante il test da 500 millisecondi a diversi secondi (a seconda della durata del test e del numero di utenti concorrenti).

ho controllato

select @@max_connections 

ed è 151 (il default). max_user_connections è 0. Quale altro parametro dovrei controllare per aumentare il numero di connessioni simultanee sul mio DB?

Se eseguo il test con 5 utenti simultanei, ognuno riceve una risposta in 500 millisecondi. Se aggiungo più utenti simultanei di quanto il tempo di risposta rallenti.

Se eseguo il test di carico su un'API che non accede al DB, non ci sono problemi anche con 400 utenti simultanei.

EDIT:

Monitoraggio con HTOP vedo:

Compiti: 34, 245 thr; 2 in esecuzione

Potrebbe essere qui il problema?

Grazie mille

+0

Puoi descrivere il tuo server PHP/MySQL in maggior dettaglio? Quale server web stai usando? Modulo Apache, CGI, FCGI? – CodeZombie

+0

Come stai eseguendo i test simultanei? Hai provato a prolungare il tempo di sonno per garantire che la query rimanga abbastanza a lungo? –

+0

Questa query verrà interrotta solo se è presente almeno una riga di dati nella tabella di debug. Controlla anche MAX_USER_CONNECTIONS per l'utente è anche zero in quanto può essere impostato per utente. –

risposta

2

La soluzione è stata in realtà molto semplice:

Lo stack LAMP Bitnami sto usando è configurato con PHP-FPM, quindi la configurazione non è sul lato apache ma in php/etc/common.conf

pm=ondemand 
pm.max_children=5 
pm.start_servers=2 
pm.min_spare_servers=1 
pm.max_spare_servers=3 

inreasing il pm.max_children=5 ha risolto il problema.

+0

Quindi il problema è legato ai server Web come menzionato nella mia risposta. Grazie per aver scritto la causa principale dettagliata del problema. –

+0

BTW puoi ancora accettare la mia risposta e assegnarmi taglie per indicare la soluzione. Non avrai comunque tanta generosità. Vedi [Come funziona l'accettazione di una risposta?] (Http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) –

2

Ci sono due aree per consentire connessioni simultanee:

1. server Web

controllare il numero di connessioni simultanee consentite dal server web.

Vedi

  1. The Secret To 10 Million Concurrent Connections -The Kernel Is The Problem, Not The Solution
  2. How many socket connections can a web server handle?
  3. How do you increase the max number of concurrent connections in Apache?
  4. How to optimize apache web server for maximum concurrent connections or increase max clients in apache

Selezionare il server web con saggezza per gestire più connessioni simultanee.

2. di database e file aperti

Controlla la tua DB MySQL è in grado di gestire connessioni simultanee max provenienti dal web server PHP.

Impostare max_connections su un valore superiore.

set global max_connections := 800; 

Controllare anche open_files_limit per il sistema operativo. Su linux, il tuo processo è limitato a 1024 file, per impostazione predefinita. Questo è molto basso, dato che ogni thread, connessione e, ovviamente, file - creano un handle di file in linux. Quindi imposta open_files_limit su un numero generoso (ad esempio 10000) per chiarire le molte connessioni con il sistema operativo.