Dentro de la serie de artículos relacionados con el benchmarcking de sistemas GNU/Linux, hoy vamos a ver cómo comprobar el rendimiento de una base de datos MySQL. Para hacerlo vamos a emplear el comando que introdujimos en el primer post, sysbench. Gracias a él, vamos a simular un número muy elevado de conexiones a MySQL y ejecutar una serie de sentencias, sacando un informe final de rendimiento.
Puesto que cuando evaluamos una base de datos, no siempre es necesario escribir en ella, sysbench lo tiene en cuenta y permite optar por hacer los test en RO o en RW. También, y para no alterar el correcto funcionamiento de las bases de datos que ya tenemos funcionando, sysbench creará la suya propia, con los datos adecuados para realizar los tests e introducirá una sería de tuplas aleatorias en ella.

Preparando datos
Vamos a crear una tabla temporal dentro de la base de datos test, que tenga 1 millón de filas con las que posteriormente operar.
shell> sysbench --test=oltp --oltp-table-size=1000000 \ --mysql-db=test --mysql-user=root --mysql-password=your_passwd \ prepare
Una vez el comando haya finalizado, vamos a ver qué ha creado. Esto no es para nada necesario, pero así también nos hacemos una idea de qué tipo de datos emplear para los test.
mysql> show create table sbtest; +--------+----------------------------------------------------+ | Table | Create Table | +--------+----------------------------------------------------+ | sbtest | CREATE TABLE `sbtest` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `k` int(10) unsigned NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`), KEY `k` (`k`) ) ENGINE=InnoDB AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1 | +--------+----------------------------------------------------+ 1 row in set (0.00 sec) mysql> select * from sbtest limit 3; +----+---+---+----------------------------------------------------+ | id | k | c | pad | +----+---+---+----------------------------------------------------+ | 1 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt | | 2 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt | | 3 | 0 | | qqqqqqqqqqwwwwwwwwwweeeeeeeeeerrrrrrrrrrtttttttttt | +----+---+---+----------------------------------------------------+ 3 rows in set (0.00 sec)
Lo que más destaca aquí es el tipo de columnas que emplear. Un par de ellas de tipo int y una autoincremental y otras dos de tipo char.
Realizando comprobaciones
Antes de entrar en este punto sí es bastante importante echar un vistazo al manual de sysbench, pues las diferentes opciones con las que puede trabajar son importantes. Por defecto el tipo de tabla es InnoDB, que en mi caso es correcto por lo que no lo alteraré.
shell> sysbench --test=oltp --oltp-table-size=1000000 \ --mysql-db=test --mysql-user=root --mysql-password=your_passwd \ --max-time=60 --oltp-read-only=on --num-threads=8 run ... OLTP test statistics: queries performed: read: 261282 write: 0 other: 37326 total: 298608 transactions: 18663 (311.00 per sec.) deadlocks: 0 (0.00 per sec.) read/write requests: 261282 (4353.94 per sec.) other operations: 37326 (621.99 per sec.) ...Otro ejemplo podría ser,
shell> sysbench --num-threads=16 --max-requests=100000 --test=oltp \ --mysql-db=test --mysql-user=root --mysql-password=your_passwd \ --oltp-table-size=1000000 --oltp-read-only=on run ... transactions: 100000 (304.29 per sec.) ...Y otro más,
shell> sysbench --test=oltp \ --mysql-db=test --mysql-user=root --mysql-password=your_passwd \ --max-requests=10000 --num-threads=10 run ... transactions: 10000 (224.58 per sec.) ...
Como podemos observar, según las opciones especificadas en el comando, el rendimiento obtenido es diferente, de ahí la importancia de combinar este comando con una buena configuración. Según el objetivo que tengamos (conseguir más lecturas, más escrituras, un término intermedio, etc. tendremos que ir alterando la configuración de MySQL (/etc/my.cfg) y volver a lanzar el test de estrés.
En mi sistemas, como en los vuestros, vemos que el rendimiento de desploma bastante de ejecutar un único thread a varios thread's simultáneamente. Y es justo en estos casos donde debemos de ganar rendimiento!
Borrando tablas temporales
Una vez hayamos finalizamos el test debemos de borrar la tabla temporal que se creó para tal efecto, para que no quede ocupando espacio tontamente en el servidor.
También tras cada ejecución si los datos son alterados, deberíamos de borrar los datos de pruebas y volver a generarlos, para trabajar siempre con la misma batería de pruebas iniciales y que ésto no influya en los resultados.
shell> sysbench --test=oltp \ --mysql-db=test --mysql-user=root --mysql-password=your_passwd \ cleanup
La entrada Linux benchmark II la puedes leer en Puppet Linux.
No hay comentarios :
Publicar un comentario