Uno de los factores a tener en cuenta cuando disponemos de Aplicaciones o Servicios Web, es la rapidez con la que responden a nuestras peticiones. Para medir la velocidad vamos a usar Apache Benchmark y en caso de ser demasiado lentos, podemos seguir una serie de pasos que detallaré a continuación.
Qué es Apache Benchmark
Apache Benchmark es una herramienta que nos permite medir la velocidad, con la que sirve páginas nuestro servidor Apache. Esto nos sirve para saber cuantas solicitudes puede servir nuestro servidor web.
Para ello primero debemos instalar apache2-utils, que incorpora programas de utilidad para servidores web y entre ellos está Apache Benchmark
.
1 |
$ sudo apt install apache2-utils |
Una vez instalado podemos empezar a utilizar el comando ab
de la siguiente forma; incluyendo el parámetro -n le indicamos que realice 500 solicitudes a nuestra página web y de esta manera poder realizar una estimación de carga entre todas ellas. Recuerda que la URL debe terminar con una barra, para que la considere válida.
1 |
$ ab -n 500 http://blog.artegrafico.net/ |
El resultado es algo extenso y puede que tardemos en comprender a qué corresponde cada dato.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
This is ApacheBench, Version 2.3 <$Revision: 1843412 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking blog.artegrafico.net (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Finished 500 requests Server Software: nginx Server Hostname: blog.artegrafico.net Server Port: 80 Document Path: / Document Length: 162 bytes Concurrency Level: 1 Time taken for tests: 32.904 seconds Complete requests: 500 Failed requests: 0 Non-2xx responses: 500 Total transferred: 177000 bytes HTML transferred: 81000 bytes Requests per second: 15.20 [#/sec] (mean) Time per request: 65.809 [ms] (mean) Time per request: 65.809 [ms] (mean, across all concurrent requests) Transfer rate: 5.25 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 32 33 0.5 33 37 Processing: 32 33 0.8 33 39 Waiting: 32 33 0.8 32 39 Total: 64 66 1.0 66 76 WARNING: The median and mean for the waiting time are not within a normal deviation These results are probably not that reliable. Percentage of the requests served within a certain time (ms) 50% 66 66% 66 75% 66 80% 66 90% 67 95% 67 98% 68 99% 71 100% 76 (longest request) |
Lo primero en lo que tenemos que fijarnos en el Time per request
, que es el tiempo promedio de cada solicitud , que en este test es de 65 milisegundos, que es decente para tratarse de un blog con múltiples consultas hacia una base de datos.
¿Nuestra web, es lenta?
Si nuestra web procesa lentamente las peticiones, necesitamos seguir investigando un poco más a fondo para comprobar que está sucediendo. Para ello tendremos que conectarnos al servidor usando SSH.
Lo primero que vamos a hacer es usar el comando top
. Para este caso en concreto nos fijamos en los parámetros que indican la carga de promedio del sistema load average
. Podemos seguir la siguiente premisa: Si nuestro servidor dispone de 2 cores, lo normal es que no supere este valor, por lo que si lo supera, es que hay algo está ralentizando el sistema.
1 |
top - 16:15:09 up 124 days, 12:32, 1 user, load average: 0.00, 0.02, 0.00 |
El primer valor corresponde a la carga durante el último minuto, el siguiente los últimos 5 minutos y el último se refiere a los últimos 10 minutos. Si nuestro sistema está sobrecargado, comprobamos los procesos que están ocupando la mayor cantidad de CPU en la lista que muestra el comando top.
¿Qué podemos hacer?
Una de las cosas que podemos hacer es cambiar las prioridades de los procesos para que el servidor web tenga la máxima prioridad. Si vamos a hacer esto tenemos que tener en cuenta que cuanto menor sea el número que indiquemos, mayor es la prioridad. Estos valores suelen ir comprendidos entre 0 y 19 pero por defecto comienzan con prioridad 0.
Para poder cambiar estos valores necesitamos usar el comando nice
y renice
. Usamos nice para iniciar un proceso con una prioridad determinada y renice para cambiar la prioridad de un proceso que ya está ejecutándose.
La forma rápida de cambiar la prioridad de un proceso usando la herramienta top, es usar la tecla r, indicar el número de proceso y a continuación introducir su nueva prioridad.
Cuando existen varios procesos hacerlo de uno a uno es algo tedioso y engorroso, por lo que en este caso podemos crear un pequeño Bash Script . En este sencillo script usaremos el comando pidof
, que recibe el nombre del proceso y devuelve todos los identificadores que tienen ese nombre.
1 2 3 4 5 6 |
$ for pid in $(pidof nombreProceso); do renice 19 $pid; done 4176 (process ID) old priority 0, new priority 19 4113 (process ID) old priority 0, new priority 19 4099 (process ID) old priority 0, new priority 19 4058 (process ID) old priority 0, new priority 19 3845 (process ID) old priority 0, new priority 19 |
Otra forma más cómoda de gestionar las prioridades de procesos es usar la herramienta htop
, que es un sistema de monitorización y gestión de procesos. Usaremos F7 y F8 podemos aumentar o reducir las prioridades de los procesos.
Por último, si hemos creado una tarea o script y necesitamos ejecutarla sin que esta ralentice demasiado el sistema, recuerda indicar su prioridad lo menor que sea posible.
1 |
$ nice -+19 tarea_a_ejecutar > /dev/null & |
¿El sistema sigue siendo lento?
Si volvemos a usar el comando ab para comprobar si ha mejorado la media de acceso y el sistema sigue siendo lento, debemos centrarnos en otros aspectos. Podemos comprobar los procesos que está ejecutando el sistema usando ps -aux. Nos aportará algo más de información sobre qué procesos pueden estar haciendo que el sistema vaya lento.
1 |
$ ps aux | less |
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
De esta forma obtenemos más información sobre el comando que ha ejecutado el proceso y todos sus parámetros. También obtenemos la carga de CPU, memoria, etc … Recuerda que si necesitamos localizar un fichero en concreto, usaremos el comando locate <file>.
Por último, si necesitamos eliminar varios procesos que están ejecutándose usaremos el comando killall.
1 |
$ killall -STOP proceso |