Está en la página 1de 14

APACHE BENCHMARK

INSTALAR EN UBUNTU
sudo apt-get install apache2-utils

LANZAR TEST
Los parámetros más habituales a la hora de lanzar un test con Apache Benchmark son: el número
de peticiones y la concurrencia de las peticiones. En el siguiente ejemplo, se puede ver que se
realizarán un total de 1000 peticiones en bloques de 50 en 50 a la web https://www.meneame.net.
Al ser una web con HTTPs, debemos poner el parámetro -f ALL. Recordad también poner la / al
final de la URL.
ab -n 1000 -c 50 -f ALL https://www.meneame.net/ (para https)

ab -n 1000 -c 50 https://www.meneame.net/ (para http)

http://50.116.42.40/aulavirtual/login/index.php

valores a leer
1. Datos del servidor que estamos probando, así como la URL en cuestión.
Server Software:        nginx
Server Hostname:        gutl.jovenclub.cu
Server Port:            80

Document Path:          /

2.Cantidad de peticiones por segundo.


Requests per second:    993.24 [#/sec] (mean)

3. Cuantos milisegundos demoró el servidor en atender la petición que más demoró, o sea, la que
más tardó en ser atendida.
Percentage of the requests served within a certain time (ms)
50%      5
66%      6
75%     22
80%     41
90%     62
95%     80
98%     87
99%     87
100%     87 (longest request)

GUARDAR REPORTE EN UN HTML


ab -n 1000 -c 50 -f ALL -w https://www.meneame.net/ > resultados.html

GRAFICAR LOS DATOS


Primero instalamos gnuplot
sudo apt-get install gnuplot

https://www.raulprietofernandez.net/blog/gnu-linux/como-medir-el-rendimiento-de-
un-servidor-web-con-apache-benchmark
OTROS PARA CPU Y APACHE

# ps aux

USER PID %CPU%MEM VSZ RSS TTY STAT START TIME COMMAND
apache 4416 0.0 0.4 232392 8920 ? S Apr11 0:01 /usr/sbin/httpd
apache 5938 0.2 2.5 387628 52980 ? S Apr13 3:46 /usr/sbin/httpd
apache 8553 0.2 2.5 388860 53208 ? S Apr13 3:43 /usr/sbin/httpd

Como puedes observar, la columna %CPU te va a indicar que procesos son los que están
consumiendo cpu.

Si lo que quieres saber es el consumo de apache (y por extensión de moodle), el comando sería

# ps aux | grep http

Por otra parte, y en relación a la respuesta de Xavier, las peticiones php consumen casi 40 MB de
RAM (Es el valor que se observa en la columna VSZ)

INSTALAR ACELERADO PHP – OPCACHE (RENDIMIENTO DE RAM)


extraido de https://docs.moodle.org/all/es/OPcache

yum install yum-utils

yum install php-opcache

- buscar
find / -name '10-opcache.ini'

- editar o configurar opcache


nano /etc/php.d/10-opcache.ini

- cambiamos lo valores
opcache.enable = 1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

; Requerido para Moodle


opcache.use_cwd = 1
opcache.validate_timestamps = 1
opcache.save_comments = 1
opcache.enable_file_override = 0

Teniendo esto en cuenta, establezca opcache.memory_consumption en un valor lo


suficientemente alto como para evitar llenarlo (siempre que su uso de RAM lo
permita), y luego monitoree el OPCache para ajustar ese valor a su tamaño
óptimo. Como el tamaño total de los archivos PHP en un Moodle 3.6 estándar es de
casi 90 MB, puede ser una buena idea establecer este valor más alto que eso.
Tenga en cuenta que los archivos PHP de los complementos y los de la carpeta
MoodleData (archivos de paquete de idioma ...) también cuentan, por lo que estos
valores pueden ser diferentes en cada instalación. Si tiene varias instancias de
Moodle, debe multiplicar ese valor por el número de instancias.
Para buscar cuantos archivos php tiene moodle:

find /var/www/html/aulavirtual/ -type f -iname '*.php' | wc -l

Ya que Moodle 3.6 contiene casi 10.000 archivos PHP, arriba se recomienda que
opcache.max_accelerated_files debería de ajustarse a 10000 ´para acomodar esto
(16229 de hecho se usará para la explicación de arriba). Si Usted tiene varias
instancias de Modlle Usted debrá multiplicar ese valor por el número de
instancias.

Para buscar cuantos archivos php tiene moodle:

find /var/www/html/aulavirtual/ -type f -iname '*.php' | wc -l

verificar si esta activo

php -i | grep opcache.enable

reiniciamos
systemctl restart nginx

systemctl restart httpd

systemctl restart php74-php-fpm

CONFIGURAR PHP.INI

Extraido de https://docs.moodle.org/all/es/PHP

Buscamos donde esta nuestro archivo


php -i | grep php.ini

Revise estas configuraciones en el archivo php.ini o .htaccess (si está usando Apache). Para las
configuraciones que usan SI/NO (ON/OFF) como sus valores, Usted puede sustituir 1 por ON y 0
por OFF si así lo prefiere. Si Usted cambia php.ini, no se olvide de reiniciar el servidor.
• memory_limit necesita ser al menos 96M (aunque algunas funcionalidades podrían no
funcionar con tan poco). Moodle se rehusará a instalarse si es más baja. Se recomienda
128M. Las instalaciones más grandes podrían necesitar una configuración aun mayor.
• session.save_handler necesita configurarse a FILES.
• file_uploads necesita ser ON.
• session.auto_start necesita ser OFF.
• La carpeta temp debe estar definida y tener permisos de escritura para su usuario webserver
• Compruebe la sección que muestra/registra (en Bitácoras) los errores. Asegurese de que las
configuraciones estén de acuerdo con el servidor utiilizado
• post_max_size y upload_max_filesize limitan el tamaño máximo de archivos que pueden
ser subidos.
• Compruebe [mail function] y la sección de la base de datos elegida, para asegurar que
coincidan con la configuración de su servidor.
• max_input_vars=10000
• max_execution_time = 120

• error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT &


~E_WARNING & ~E_NOTICE

• expose_php = Off, esconder versión en páginas

• output_buffering = Off
– or –
output_buffering = 16384

Extensiones y librerías PHP


Las siguientes extensiones de PHP son requeridas o recomendadas (algunas, p ej. icon, ctype o
tokonizer están ahoras incluidas por defecto en el paquete PHP). Otras deberán ser bien instaladas o
seleccionadas para el correcto funcionamiento de Moodle.
• La extensión iconv es necesaria.
• La extensión mbstring es recomendada.
• La extensión curl es necesaria (necesaria para servicios web y red).
• La extensión openssl extension is recommended (necesaria para servicios web y red).
• La extensión tokenizer extension is recommended.
• La extensión xmlrpc extension is recommended (necesaria para servicios web y red).
• La extensión soap extension is recommended (necesaria para servicios web).
• La extensión ctype es necesaria.
• La extensión zip es necesaria.
• La extensión gd' es recomendada (necesaria para manipular imágenes).
• La extensión simplexml es necesaria.
• La extensión spl es necesaria.
• La extensión pcre es necesaria.
• La extensión dom es necesaria.
• La extensión xml es necesaria.
• La extensión intl es recomendada.
• La extensión json es necesaria.
• La extensión xmlreader es necesaria.
• La extensión correcta para la base de datos, deberá ser igualmente requerida.

• Otras extensiones pueden ser requeridas de manera opcional para el correcto funcionamiento
de todas las utilidades de su Moodle. En particular la Autenticación externa y matriculación
(Inscripción) (ej. LDAP y la extensión de sockets para el servidor de Chat).

INSTALAR MEMCACHED
yum install memcached

yum install php74-php-memcache

systemctl enable memcached

systemctl start memcached

systemctl status memcached

yum install php74-php-memcached

systemctl restart nginx

yum install libmemcached

nano /etc/sysconfig/memcached

- agregar

EJEMPLO: Si quisiera ejecutar Memcached con 4GB de memoria y permitir un máximo


de 2,000 conexiones, cambiaría el archivo de configuración de la siguiente
manera.

PORT="11211"
USER="memcached"
MAXCONN="2000"
CACHESIZE="4096"
OPTIONS="-l 127.0.0.1 -U 0"

- reiniciamos y activamos
systemctl restart memcached
systemctl enable memcached

Una vez iniciado, podemos confirnar que el servicio está funcionando sobre la
interfaz local y escucha solo conexiones

netstat -plunt

También podemos verificar las estadísticas del servidor utilizando la herramienta “memcached-
tool”, como sigue:

memcached-tool 127.0.0.1 stats

-habilitamos el puerto

firewall-cmd --permanent --zone=public --add-port=11211/tcp

firewall-cmd –reload

-instalamos extension para php, perl, python

yum install php-pecl-memcache


yum install perl-Cache-Memcached
yum install python-memcached

-reiniciamos

systemctl restart httpd


CONFIGURAR APACHE

extraido parte de https://www.linode.com/docs/web-servers/apache-tips-and-


tricks/tuning-your-apache-server

otros: https://www.rubenortiz.es/2008/05/13/apache-maxclients-y-mas/

nano /etc/httpd/conf/httpd.conf

Agregar las siguientes linea al final

MaxKeepAliveRequests 500
KeepAliveTimeout 5
KeepAlive On

ejecutar para revisar si contamos con prefork habilitado

sudo apachectl -t -D DUMP_MODULES |grep mpm

tiene que verse el mensaje

mpm_prefork_module (shared)

volvemos a editar

nano /etc/httpd/conf/httpd.conf

<IfModule mpm_prefork_module>

StartServers 4

MinSpareServers 20

MaxSpareServers 40

MaxRequestWorkers 300

MaxConnectionsPerChild 4500

ServerLimit 300

</IfModule>

MaxRequestWorkers = Total de memoria disponible * 80% / Uso máximo de memoria


por los procesos de Apache

Si necesita incrementar el valor de MaxRequestWorkers por encima de 256, también


necesitarás ajustar la directiva ServerLimit.

CONFIGURACIÓN MYSQL

Extraido de https://docs.moodle.org/all/es/Recomendaciones_sobre_desempe%C3%B1o
- buscar archivo mysql para configurar

find / -name 'my.cnf'

- editar

nano /etc/my.cnf

- agregar dentro de [mysqld]

max_connections=400 (número máximo de conexiones totales que puede aceptar el


servidor MySQL al mismo tiempo)

max_allowed_packet=8M (Este parámetro normalmente lo tenemos que aumentar para


importar bases de datos grandes o mover grandes volúmenes de datos en una base
de datos.)

thread_cache_size=8 (suelen configurar entre 32 y 64 para un uso normal.)

key_buffer=1024M (Normalmente se configuran 32 MB por cada 1 GB de memoria


física usable.)

table_cache=4000 (un buen valor es 64, aunque con MySQLTuner podremos ver si
necesitamos más o menos)

sort_buffer_size=2M (recomendable es configurar 1 MB por cada 1 GB de memoria


RAM física disponible)

read_buffer_size=2M (recomendable es configurar 1 MB por cada 1 GB de memoria


RAM física disponible)

read_rnd_buffer_size=8M (1 MB por cada 1 GB de memoria RAM física disponible.)

thread_concurrency=8 (lo recomendable es configurar 2 por cada 1 núcleo de CPU


disponible.)

wait_timeout=15 (Es el tiempo de espera que tarda MySQL en cerrar una conexión.)

query_cache_type=1 (si ponemos 0 desactivamos el cache de consultas de MySQL, si


ponemos 1 activamos el cache de consultas y si ponemos 2 se activará bajo
petición. Lo recomendable es 1.)

query_cache_limit=1M (por defecto es 1 MB)

query_cache_size=100M (se suele poner 64 MB de RAM por cada 1 GB de memoria


física usable que tenga el servidor)

- reiniciar mysql

systemctl restart mariadb


AJUSTAR MYSQL CON MYSQLTUNER

yum -y install https://extras.getpagespeed.com/release-latest.rpm

yum -y install mysqltuner

ejecutar

mysqltuner

USAR SCRIPT PARA OPTIMIZAR MEMORIA

Crear un archivo .sh y añadir


ejecutar
mysql -uroot -pI3P-mysQL -e "show variables; show status" | awk '
{
VAR[$1]=$2
}
END {
MAX_CONN = VAR["max_connections"]
MAX_USED_CONN = VAR["Max_used_connections"]
BASE_MEM=VAR["key_buffer_size"] + VAR["query_cache_size"] +
VAR["innodb_buffer_pool_size"] + VAR["innodb_additional_mem_pool_size"] +
VAR["innodb_log_buffer_size"]
MEM_PER_CONN=VAR["read_buffer_size"] + VAR["read_rnd_buffer_size"] +
VAR["sort_buffer_size"] + VAR["join_buffer_size"] + VAR["binlog_cache_size"] +
VAR["thread_stack"] + VAR["tmp_table_size"]
MEM_TOTAL_MIN=BASE_MEM + MEM_PER_CONN*MAX_USED_CONN
MEM_TOTAL_MAX=BASE_MEM + MEM_PER_CONN*MAX_CONNprintf
"+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "key_buffer_size",
VAR["key_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "query_cache_size",
VAR["query_cache_size"]/1048576
printf "| %40s | %15.3f MB |\n", "innodb_buffer_pool_size",
VAR["innodb_buffer_pool_size"]/1048576
printf "| %40s | %15.3f MB |\n", "innodb_additional_mem_pool_size",
VAR["innodb_additional_mem_pool_size"]/1048576
printf "| %40s | %15.3f MB |\n", "innodb_log_buffer_size",
VAR["innodb_log_buffer_size"]/1048576
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "BASE MEMORY", BASE_MEM/1048576
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "sort_buffer_size",
VAR["sort_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "read_buffer_size",
VAR["read_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "read_rnd_buffer_size",
VAR["read_rnd_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "join_buffer_size",
VAR["join_buffer_size"]/1048576
printf "| %40s | %15.3f MB |\n", "thread_stack", VAR["thread_stack"]/1048576
printf "| %40s | %15.3f MB |\n", "binlog_cache_size",
VAR["binlog_cache_size"]/1048576
printf "| %40s | %15.3f MB |\n", "tmp_table_size", VAR["tmp_table_size"]/1048576
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "MEMORY PER CONNECTION", MEM_PER_CONN/1048576
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %18d |\n", "Max_used_connections", MAX_USED_CONN
printf "| %40s | %18d |\n", "max_connections", MAX_CONN
printf "+------------------------------------------+--------------------+\n"
printf "| %40s | %15.3f MB |\n", "TOTAL (MIN)", MEM_TOTAL_MIN/1048576
printf "| %40s | %15.3f MB |\n", "TOTAL (MAX)", MEM_TOTAL_MAX/1048576
printf "+------------------------------------------+--------------------+\n"
}'

ejecutar
sh archivo.sh
ajustar los sgtes. Valores:
innodbbufferpoolsize
sortbuffersize
readbuffersize
tmptablesize
maxconnections

DESHABILITAR CONEXIONES PERSISTENTES DE PHP A MYSQL

Buscamos donde esta nuestro archivo


php -i | grep php.ini

editamos el php.ini

mysql.allow_persistent = Off

mysql.max_persistent = 15

MONITOREAR CONSULTAS SQL EN MYSQL CON MYTOP

yum install mytop

nano /root/.mytop

Ingresar: (delay es el tiempo en segundos que debe demorar en actualizar la


pantalla y mostrar información)

host=localhost
db=mysql
delay=5
port=3306
socket=
batchmode=0
color=1
idle=1
Luego nos conectamos a todas las base de datos para hacer seguimiento

mytop --prompt

Si quiero ingresar con un usuario especifico

mytop -u usuario --prompt

Si quiero ingresar a una bd especifica

mytop -d databasename --prompt

al ingresar se presentará en pantalla el reporte sgte.

MySQL on localhost (5.5.41-MariaDB) up 0+00:05:52 [01:33:15]

Queries: 148 qps: 0 Slow: 0.0 Se/In/Up/De(%): 09/00/00/00


qps now: 2 Slow qps: 0.0 Threads: 6 ( 5/ 0) 67/00/00/00
Key Efficiency: 2.0% Bps in/out: 14.7/320.7k Now in/out: 192.5/731.8k

Id User Host/IP DB Time Cmd Query or State


-- ---- ------- -- ---- --- ----------
2 root localhost mysql 0 Query show full
processlist
16 root localhost 0 Sleep
17 root localhost testdb 0 Query SELECT * FROM
dept_emp
18 root localhost testdb 0 Query SELECT * FROM
dept_emp
19 root localhost testdb 0 Query SELECT * FROM
dept_emp
20 root localhost testdb 0 Query SELECT * FROM
dept_emp

La primera línea identifica el nombre de host del servidor y la versión de MySQL


que está ejecutando. El lado derecho muestra el tiempo de actividad del proceso
del servidor MySQL en días + horas: minutos: formato de segundos, así como la
hora actual.

La segunda línea muestra el número total de consultas que el servidor ha


procesado (148 en nuestro caso), el número medio de consultas por segundo, el
número de consultas lentas y el porcentaje de consultas Seleccionar, Insertar,
Actualizar y Eliminar.

La tercera línea muestra valores en tiempo real desde la última actualización de


mytop. El tiempo normal de actualización (retraso) para mytop es de 5 segundos,
por lo que si se ejecutaron 100 consultas en los últimos 5 segundos desde la
actualización, entonces el número de qps ahora sería 20. El primer campo es el
número de consultas por segundo (qps ahora : 2). El segundo valor es el número
de consultas lentas por segundo. El segmento Subprocesos: 6 (5/0) indica que hay
un total de 6 subprocesos conectados, 5 están activos (uno está inactivo) y hay
0 subprocesos en la caché de subprocesos.

El último campo de la tercera línea muestra los porcentajes de consulta, como en


la línea anterior, pero desde la última actualización de mytop. La cuarta línea
muestra la eficiencia del búfer de claves (la frecuencia con la que se leen las
claves del búfer en lugar del disco) y el número de bytes que MySQL ha enviado y
recibido, tanto en general como en el último ciclo mytop. Eficiencia de claves:
2.0% muestra que el 2% de las claves se leen desde el búfer, no desde el disco.
Bps de entrada / salida: 14,7 / 320,7k muestra que desde el inicio, MySQL ha
promediado 14,7 kbps de tráfico entrante y 320,7 kbps para el tráfico saliente.
Ahora in / out muestra el tráfico nuevamente, pero desde la última actualización
de mytop.

La segunda parte de la pantalla enumera los subprocesos actuales de MySQL,


ordenados según su tiempo de inactividad (el menos inactivo primero). La id,
username, host desde el que se conecta el usuario, la base de datos a la que
está conectado el usuario, la cantidad de segundos de tiempo de inactividad, el
comando que está ejecutando el hilo (o el estado del hilo) y la primera parte de
la consulta. toda la información se muestra aquí. Si el hilo está en un estado
de Query (es decir, Cmd displays Query), la siguiente columna Query o state
mostrará la primera parte de la consulta que se está ejecutando. Si el estado
del comando es Sleep o Idle, la columna Query o state normalmente estará en
blanco. En el resultado de nuestro ejemplo anterior, el hilo con id 2 es en
realidad mytop ejecutando la consulta show processlist para recopilar
información. El hilo con id 16 está inactivo (no procesa una consulta, pero aún
está conectado). El hilo con id 17 está ejecutando una consulta SELECT en la
base de datos testdb.

Para ver un ID especifico presione F e ingrese el nro. de id

Para regresar a la pantalla anterior presione: t

CONFIGURAR NGINX

- ver cantidad de cpus del server

grep processor /proc/cpuinfo | wc –l

- en mi caso 2cpus entonces seria:

en nano /etc/nginx/nginx.conf

worker_processes 2;

- cuántos clientes pueden ser atendidos simultáneamente por Nginx. suponiendo 1


núcleo para cada proceso de trabajo, establecer worker_connections a 1024
implica que Nginx puede servir 1024 clientes / segundo.

worker_connections 1024

quedando:

worker_processes 2;

events {
worker_connections 2048;
multi_accept on; //agregar
use epoll; //agregar
}

- activar gzip. Para esto pegaremos dentro del bloque http

# reduce the data that needs to be sent over network -- for testing
environment
gzip on;
# gzip_static on;
gzip_min_length 10240;
gzip_comp_level 1;
gzip_vary on;
gzip_disable msie6;
gzip_proxied expired no-cache no-store private auth;
gzip_types
# text/html is always compressed by HttpGzipModule
text/css
text/javascript
text/xml
text/plain
text/x-component
application/javascript
application/x-javascript
application/json
application/xml
application/rss+xml
application/atom+xml
font/truetype
font/opentype
application/vnd.ms-fontobject
image/svg+xml;

- cache para servidor. Copiar en el bloque http

#cache

open_file_cache max=2000 inactive=20s;

open_file_cache_valid 60s;

open_file_cache_min_uses 5;

open_file_cache_errors off;

- dentro tambien del bloque http agregar o cambiar los valores

# allow the server to close connection on non responding client, this will
free up memory

reset_timedout_connection on;

client_max_body_size 100M;

# request timed out -- default 60

client_body_timeout 10;

# if client stop responding, free up memory -- default 60

send_timeout 2;

# server will close connection after this time -- default 75


keepalive_timeout 30;

# number of requests client can make over keep-alive -- for testing


environment

keepalive_requests 100000;

- CACHE para elementos estaticos. Estos se puede agregar en los sitios en


/etc/nginx/conf.d/sitio.conf en el bloque server:

server{

...

#cache de archivos

location ~* \.(jpg|jpeg|png|gif|ico)$ {

access_log off;

log_not_found off;

expires 30d;

location ~* \.(css|js)$ {

access_log off;

log_not_found off;

expires 30d;

- ACCESS_LOG cambiar a:

#access_log /var/log/nginx/access.log main;

access_log off;

otros
https://docs.bluehosting.cl/tutoriales/servidores/como-configurar-nginx-para-obtener-un-
rendimiento-optimo.html
https://gist.github.com/denji/8359866

También podría gustarte