Mostrando entradas con la etiqueta benchmark. Mostrar todas las entradas
Mostrando entradas con la etiqueta benchmark. Mostrar todas las entradas

sábado, 3 de mayo de 2014

Benchmark MySQL con mysqlslap

Original post: http://anothermysqldba.blogspot.com/2014/05/mysql-benchmark-with-mysqlslap.html

Así que la evaluación comparativa de diferentes consultas de MySQL en contra de su base de datos es una cosa sabia que hacer. Eso debería ser evidente. Mientras que optimizamos consultas lo mejor que podemos utilizar explicar (y EXTENDIDO) llevándolos tiempo para compararlas deberían resultar útiles. 

Este es un simple ejemplo de ejecución de una sentencia mysqlslap. 

Para este ejemplo he cargado la base de datos de MySQL MUNDO. (http://dev.mysql.com/doc/index-other.html ) 

He creado una consulta que se unió a las tres tablas y lo puso en / tmp / tests.sql. El plan es explicar a continuación. 

root@localhost [world]> EXPLAIN EXTENDED SELECT C.Name as City, Y.Name as Country, L.Language,Y.Population FROM City C INNER JOIN Country Y ON C.CountryCode = Y.Code INNER JOIN CountryLanguage L ON C.CountryCode = L.CountryCode WHERE C.Name LIKE 'D%' AND Y.Continent='Europe' \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: C
type: range
possible_keys: CountryCode,name_key
key: name_key
key_len: 5
ref: NULL
rows: 127
filtered: 100.00
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: Y
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 3
ref: world.C.CountryCode
rows: 1
filtered: 100.00
Extra: Using where
*************************** 3. row ***************************
id: 1
select_type: SIMPLE
table: L
type: ref
possible_keys: PRIMARY,CountryCode
key: CountryCode
key_len: 3
ref: world.C.CountryCode
rows: 2
filtered: 100.00
Extra: Using index
3 rows in set, 1 warning (0.00 sec)

root@localhost [world]> show warnings \G
*************************** 1. row ***************************
Level: Note
Code: 1003
Message: /* select#1 */ select `world`.`C`.`Name` AS `City`,`world`.`Y`.`Name` AS `Country`,`world`.`L`.`Language` AS `Language`,`world`.`Y`.`Population` AS `Population` from `world`.`City` `C` join `world`.`Country` `Y` join `world`.`CountryLanguage` `L` where ((`world`.`Y`.`Code` = `world`.`C`.`CountryCode`) and (`world`.`L`.`CountryCode` = `world`.`C`.`CountryCode`) and (`world`.`Y`.`Continent` = 'Europe') and (`world`.`C`.`Name` like 'D%'))


Ahora la herramienta mysqlslap ha existido desde MySQL 5.1.4 
A continuación se presentan algunos otros enlaces útiles. 
Ahora que tengo mi consulta, me pueden comparar contra la base de datos con el siguiente comando. 

mysqlslap - concurrencia = 150 - iteraciones = 50 - query = / tmp / test.sql - create-schema = mundo 

Una nota: 
La consulta tiene que ser muy limpia, así como la herramienta hace error fácilmente. 
Por ejemplo, la siguiente arrojó el siguiente error: 

SELECT C.Name as City, Y.Name as Country, L.Language,Y.Population
FROM City C
INNER JOIN Country Y ON C.CountryCode = Y.Code
INNER JOIN CountryLanguage L ON C.CountryCode = L.CountryCode
WHERE C.Name LIKE 'D%' AND Y.Continent='Europe' 

Si bien esta consulta funcionaba bien. 

SELECT C.Name as City, Y.Name as Country, L.Language,Y.Population FROM City C INNER JOIN Country Y ON C.CountryCode = Y.Code INNER JOIN CountryLanguage L ON C.CountryCode = L.CountryCode WHERE C.Name LIKE 'D%' AND Y.Continent='Europe' 


La voluntad resultados de referencia de salida de la herramienta para usted 


Benchmark
Average number of seconds to run all queries: 0.104 seconds
Minimum number of seconds to run all queries: 0.096 seconds
Maximum number of seconds to run all queries: 0.141 seconds
Number of clients running queries: 150
Average number of queries per client: 1 


mysqlslap - help le dará muchas opciones para poner a prueba sus consultas con. 

Usted puede hacer todo de forma automática 

# mysqlslap --auto-generate-sql
Benchmark
Average number of seconds to run all queries: 0.243 seconds
Minimum number of seconds to run all queries: 0.243 seconds
Maximum number of seconds to run all queries: 0.243 seconds
Number of clients running queries: 1
Average number of queries per client: 0 


Usted puede probar las inserciones también. Por ejemplo he creado esta tabla: 

CREATE TABLE `foobar_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`time_recorded` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB ; 


Entonces prueba con lo siguiente. 

# mysqlslap --concurrency=1150 --iterations=530 --query="use test;insert into foobar_table (id) values (null)" --delimiter=";"
mysqlslap: Could not create thread 


Errores OK no son muy útiles ... Pero esperamos que pueda notar el error. Es difícil tener 1.150 transacciones concurrentes si sólo tiene 530 iteraciones. 


# mysqlslap --concurrency=150 --iterations=30 --query=/tmp/test1.sql --create-schema=test --verbose
Benchmark
Average number of seconds to run all queries: 0.260 seconds
Minimum number of seconds to run all queries: 0.192 seconds
Maximum number of seconds to run all queries: 0.476 seconds
Number of clients running queries: 150
Average number of queries per client: 1


Por ejemplo, la siguiente funcionaba mucho mejor. 

# mysqlslap --concurrency=200 --iterations=1000 --query=" insert into foobar_table (id) values (null)" --verbose --create-schema=test
Benchmark
Average number of seconds to run all queries: 0.282 seconds
Minimum number of seconds to run all queries: 0.217 seconds
Maximum number of seconds to run all queries: 0.726 seconds
Number of clients running queries: 200
Average number of queries per client: 1 


Sólo para demostrar que estamos haciendo inserciones reales .. 

root@localhost [test]> select count(id) from foobar_table;
+-----------+
| count(id) |
+-----------+
| 206091 |
+-----------+
1 row in set (0.13 sec) 

Ahora También debo decir que esto es sólo una base de datos de prueba que uso para las entradas del blog, por lo que no evalúan sus bases de datos de producción en contra de estos resultados. 

Supongo que el punto después de todo esto ... encontrar una consulta problemática, optimizar lo mejor que puede, y punto de referencia. Es mejor conocer sus límites en lugar de sólo una suposición. 

lunes, 6 de mayo de 2013

Benchmarking :: MySQL, CPU, File I / O, memoria :: Sysbench y Apache Benchmark

Original Post: http://anothermysqldba.blogspot.com/2013/05/benchmarking-mysql-cpu-file-io-memory.html


Decidir qué herramienta que desea utilizar:
Usaré Sysbench para este ejemplo:
Primero descarga sysbench
Instalar:
Manual SysBench
Revise sus opciones:
# Sysbench - test = OLTP ayuda

Compilado en pruebas:
fileio - Prueba de E / S de archivo
CPU - prueba de rendimiento de la CPU
memoria - Funciones de memoria prueba de velocidad
Discusiones - Temas prueba de rendimiento del subsistema
mutex - prueba de rendimiento Mutex
OLTP - test OLTP

Comandos: preparar limpieza versión ayuda run

Algunos ejemplos a continuación:

fileio - Prueba de E / S de archivo
# sysbench --test=fileio help 
fileio options:
--file-num=N number of files to create [128]
--file-block-size=N block size to use in all IO operations [16384]
--file-total-size=SIZE total size of files to create [2G]
--file-test-mode=STRING test mode {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw}
--file-io-mode=STRING file operations mode {sync,async,fastmmap,slowmmap} [sync]
--file-extra-flags=STRING additional flags to use on opening files {sync,dsync,direct} []
--file-fsync-freq=N do fsync() after this number of requests (0 - don't use fsync()) [100]
--file-fsync-all=[on|off] do fsync() after each write operation [off]
--file-fsync-end=[on|off] do fsync() at the end of test [on]
--file-fsync-mode=STRING which method to use for synchronization {fsync, fdatasync} [fsync]
--file-merged-requests=N merge at most this number of IO requests if possible (0 - don't merge) [0]
--file-rw-ratio=N reads/writes ratio for combined test [1.5] 

  • # Sysbench - test = fileio prepare
  • # Sysbench - test = fileio - test-mode file = rndwr plazo


CPU - prueba de rendimiento de la CPU
# Sysbench - test = cpu ayuda
opciones de CPU:
- CPU-max-prime N = límite superior para el generador de números primos [10000] 


  • # Sysbench - test = CPU - num-threads = 25 run


memoria - Funciones de memoria prueba de velocidad
# sysbench --test=memory help 
memory options:
--memory-block-size=SIZE size of memory block for test [1K]
--memory-total-size=SIZE total size of data to transfer [100G]
--memory-scope=STRING memory access scope {global,local} [global]
--memory-hugetlb=[on|off] allocate memory from HugeTLB pool [off]
--memory-oper=STRING type of memory operations {read, write, none} [write]
--memory-access-mode=STRING memory access mode {seq,rnd} [seq] 

  • # Sysbench - test = memoria <MEMORIA opciones> plazo

Discusiones - Temas prueba de rendimiento del subsistema
# sysbench --test=threads help   
threads options:
--thread-yields=N number of yields to do per request [1000]
--thread-locks=N number of locks per thread [8] 

  • # # Sysbench - test = Discusiones - num-threads = 64 - = prueba hilos - hilo-rendimiento = 100 - hilo-locks = 6 run


mutex - prueba de rendimiento Mutex
# sysbench --test=mutex help   
mutex options:
--mutex-num=N total size of mutex array [4096]
--mutex-locks=N number of mutex locks to do per thread [50000]
--mutex-loops=N number of empty loops to do inside mutex lock [10000] 
  • # Sysbench - test = mutex - num-threads = 64 run




OLTP - test OLTP
# sysbench --test=oltp help
oltp options:
--oltp-test-mode=STRING test type to use {simple,complex,nontrx,sp} [complex]
--oltp-reconnect-mode=STRING reconnect mode {session,transaction,query,random} [session]
--oltp-sp-name=STRING name of store procedure to call in SP test mode []
--oltp-read-only=[on|off] generate only 'read' queries (do not modify database) [off]
--oltp-skip-trx=[on|off] skip BEGIN/COMMIT statements [off]
--oltp-range-size=N range size for range queries [100]
--oltp-point-selects=N number of point selects [10]
--oltp-simple-ranges=N number of simple ranges [1]
--oltp-sum-ranges=N number of sum ranges [1]
--oltp-order-ranges=N number of ordered ranges [1]
--oltp-distinct-ranges=N number of distinct ranges [1]
--oltp-index-updates=N number of index update [1]
--oltp-non-index-updates=N number of non-index updates [1]
--oltp-nontrx-mode=STRING mode for non-transactional test {select, update_key, update_nokey, insert, delete} [select]
--oltp-auto-inc=[on|off] whether AUTO_INCREMENT (or equivalent) should be used on id column [on]
--oltp-connect-delay=N time in microseconds to sleep after connection to database [10000]
--oltp-user-delay-min=N minimum time in microseconds to sleep after each request [0]
--oltp-user-delay-max=N maximum time in microseconds to sleep after each request [0]
--oltp-table-name=STRING name of test table [sbtest]
--oltp-table-size=N number of records in test table [10000]
--oltp-dist-type=STRING random numbers distribution {uniform,gaussian,special} [special]
--oltp-dist-iter=N number of iterations used for numbers generation [12]
--oltp-dist-pct=N percentage of values to be treated as 'special' (for special distribution) [1]
--oltp-dist-res=N percentage of 'special' values to use (for special distribution) [75]

General database options:

--db-driver=STRING specifies database driver to use ('help' to get list of available drivers)
--db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto]


Compiled-in database drivers:
mysql - MySQL driver

mysql options:
--mysql-host=[LIST,...] MySQL server host [localhost]
--mysql-port=N MySQL server port [3306]
--mysql-socket=STRING MySQL socket
--mysql-user=STRING MySQL user [sbtest]
--mysql-password=STRING MySQL password []
--mysql-db=STRING MySQL database name [sbtest]
--mysql-table-engine=STRING storage engine to use for the test table {myisam,innodb,bdb,heap,ndbcluster,federated} [innodb]
--mysql-engine-trx=STRING whether storage engine used is transactional or not {yes,no,auto} [auto]
--mysql-ssl=[on|off] use SSL connections, if available in the client library [off]
--myisam-max-rows=N max-rows parameter for MyISAM tables [1000000]
--mysql-create-options=STRING additional options passed to CREATE TABLE [] 

sysbench espera encontrar la base de datos sbtest así que asegúrate y crear la primera base de datos o definir lo que usted prefiera.
  • sysbench - test = OLTP ayuda | grep sbtest
    - OLTP-table-name = nombre de la cadena de la tabla de prueba [sbtest]
    - Mysql-user = STRING usuario MySQL [sbtest]
    - Mysql-db = cadena de nombre de base de datos MySQL [sbtest]

# Sysbench - test = OLTP - mysql-host = localhost - mysql-user = root - mysql-password = <La here> - mysql-tabla-ENGINE = InnoDB prepare

# Sysbench - test = OLTP - mysql-host = localhost - mysql-user = root - mysql-password = <La here> - mysql-tabla-ENGINE = InnoDB - num-threads = 25 run

A continuación, mantener un ojo en sus resultados, así como la base de datos como las pruebas se ejecutan.



Apache Benchmark y | |
WWW :: Mecanizar :: Firefox

La clave para llevar este caso es utilizar estas herramientas para comparar su proceso de solicitud y no sólo un factor de la arquitectura.

Por ejemplo, si usted espera tener 20.000 usuarios a la hora de llenar su formulario web, entonces usted debe comparar su aplicación para manejar eso. Puede utilizar las herramientas arriba para imitar los mensajes, por sólo un ejemplo al pasar tokens, y luego probar el código que se encuentra en el lugar de su aplicación. Una prueba como esta a continuación, pondrá a prueba la base de código y con el registro adecuado en el lugar (que también se puede activar mediante un token) que puede poner a prueba qué tan bien los desarrolladores, dba y el sistema está construido.

Muy sencillo ejemplo del concepto:

Si puede abrir la url con elinks que puedas benchmark.

elinks http://www.google.com/search?ie=ISO-8859-1\&hl=en\&source=hp\&q=mysql

# ab -n 10 -c 2 http://www.google.com/search?ie=ISO-8859-1\&hl=en\&source=hp\&q=mysql 

Por supuesto, usted desea ejecutar esto en contra de su sistema en un nivel mucho más alto para probar cómo responde su solicitud.