Anzitutto installiamo ApacheBench se non lo abbiamo già fatto, eseguendo il comando:
1 |
sudo apt-get install apache2-utils |
Normalmente Apache viene eseguito sulla porta 80 (http) e 443 (https), ma queste porte possono cambiare, come, per esempio, nel caso di una configurazione combinata con nGinx. Per scoprire su quali porte si trova Apache è sufficiente digitare da terminale:
1 |
netstat -anp | grep apache |
Dovremmo vedere un output simile a questo:
In questo caso testiamo apache sulle porte 7080 e 7081.
Per lanciare il test digitiamo:
1 |
ab -n 500000 -c 500 -s 3600 http://localhost:7080/ |
Questo eseguirà 500.000 richieste a pacchetti di 500 richieste per volta (richieste concorrenti). Il parametro -s 3600
imposta il timeout per l’esecuzione su 3600 secondi, mentre il valore predefinito è di 30 secondi.
Otterremo un risultato simile a questo:
Questo significa che per rispondere a 500.000 richieste al tasso di 500 richieste per volta, il server ha impiegato in tutto 25,163 secondi. Il tempo medio per ogni chiamata (500 richieste concorrenti) è di 25,163 millisecondi. Il tempo medio per ogni singola richiesta concorrente è quindi di 0,050 ms, dove 25,163ms / 500 = 0,050326 ms.
Adesso possiamo provare ad aumentare il carico sul server aumentando il numero di richieste concorrenti.
1 |
ab -n 500000 -c 1000 -s 3600 http://localhost:7080/ |
Il risultato sarà simile a questo:
Vediamo come il tempo per singola richiesta concorrente è passato da 0,050 ms a 0,660 ms. Il numero di richieste concorrenti è aumentato di 2 volte, mentre il tempo di risposta è aumentato di 13,2 volte.
Se proviamo ad eseguire invece 5.000 richieste concorrenti digitando:
1 |
ab -n 500000 -c 5000 -s 3600 http://localhost:7080/ |
Otterremo il seguente errore:
socket: Too many open files (24)
Questo significa che abbiamo superato il massimo numero di file aperti contemporaneamente e consentiti dal sistema. Tale configurazione dipende dalle configurazioni di sicurezza del sistema ed è modificabile in /etc/security/limits.conf
Digitiamo:
1 |
sudo nano /etc/security/limits.conf |
Dentro il file possiamo stabilire i singoli servizi quali limiti avranno, per aumentare il limite di tutti i servizi possiamo aggiungere in fondo al file:
1 2 |
* soft nofile 65536 * hard nofile 65536 |
Questo imposterà il limite al massimo valore consentito.
Se volessimo impostare il limite a 5000 file contemporanei dovremmo digitare ovviamente 5000.
Lo stesso risultato si può ottenere con:
1 |
ulimit -n 5000 |
Il comando non renderà la modifica persistente e al prossimo riavvio il valore tornerà a quello predefinito.
A questo punto possiamo ritentare il benchmark con:
1 |
ab -n 500000 -c 4000 -s 3600 http://localhost:7080/ |
Attenzione ad eseguirlo al netto del limite possibile, perché è probabile che si raggiunga la saturazione per via di altri file aperti quando si è prossimi al limite.