Blog

Do it quick! Exemple d'utilisation de percona-playback

Écrit le 27 05 2013 par Kévin MET _

Et hop là, encore une nouvelle catégorie pour le blog. Cette fois ça sera Do it quick !. Je vais présenter un outil ou un truc vite fait, sans rentrer dans les détails de son utilisation. En gros c'est le genre d'article sur lequel on est content de tomber quand on veux faire marcher un truc, vite fait bien fait, sans forcement comprendre dans le détail ce qu'on est en train de faire.

Pour le premier de la série je vais parler de percona-playback. Cet outil est super pratique, il permet de rejouer la charge d'un serveur à l'identique sur le même serveur ou un autre serveur. Pour cela il peut utiliser :

  • les slow queries
  • une capture tcpdump

Dans ce tutoriel on va utiliser les slow queries. On va commencer par récupérer le données sur le serveur sur lequel les requêtes sont jouées. Il faut donc se connecter au cli de MySQL :


# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11823519
Server version: 5.1.63-0+squeeze1-log (Debian)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Ensuite on change la valeur de long_query_time pour la passer à 0 et on active le log des slow queries si jamais ce n'était pas déjà fait :


mysql> show global variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
1 row in set (0.00 sec)


mysql> set global long_query_time = 0;
Query OK, 0 rows affected (0.00 sec)


mysql> show global variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 0.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

#On regarde ou sont stockés les logs et on vérifie que le slow queries sont activés

mysql> show global variables like 'slow_query_log%';
+---------------------+---------------------------------+
| Variable_name       | Value                           |
+---------------------+---------------------------------+
| slow_query_log      | ON                              |
| slow_query_log_file | /var/run/mysqld/mysqld-slow.log |
+---------------------+---------------------------------+
2 rows in set (0.00 sec)

#Si on a slow_query_log sur OFF, on l'active comme ça :

mysql> set global slow_query_log=ON;
Query OK, 0 rows affected (0.00 sec)

Attention, cela peut entrainer de très forte baisse des performances selon le serveur et la charge de MySQL. Car ces commandes vont envoyées TOUTES les requêtes dans votre fichier de log des slow queries.

Une fois qu'on a assez de données, on envoi le fichier /var/run/mysqld/mysqld-slow.log sur le serveur sur lequel on va réaliser notre bench et on installe percona-playback sur celui-ci. Il faut donc ajouter le dépôt de percona. Sur une squeeze ça donne ça :


# gpg --keyserver  hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A
# gpg -a --export CD2EFD2A | apt-key add -

# vim /etc/apt/sources.list

deb http://repo.percona.com/apt squeze main
deb-src http://repo.percona.com/apt squeeze main

# aptitude update

# aptitude install percona-playback

Il ne reste plus qu'à lancer percona-playback avec les options qui vont bien :

  • --mysql-schema=db_name : le nom de la base de données sur laquelle on bench
  • --show-per-connection-query-count : donne le nombre de requêtes exécutées par connexion
  • --dispatcher-plugin=thread-pool et --thread-pool-threads-count=# : permet de threader et d'indiquer le nombre de thread
  • Un exemple avec utilisation d'un log se nommant mysqld-slow.log sur MySQL en local, qui écoute sur 3306, avec l'utilisateur root, sans password, sur la base plop et en utilisant 20 threads :

    
    # percona-playback --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root \
    --mysql-schema=plop \
    --show-per-connection-query-count \
    --dispatcher-plugin=thread-pool --thread-pool-threads-count=20 \
    --query-log-file=mysqld-slow.log
    

    Et voici le genre de résultat qu'on peut obtenir :

    
    Detailed Report
    ----------------
    SELECTs  : 0 queries (0 faster, 0 slower)
    INSERTs  : 0 queries (0 faster, 0 slower)
    UPDATEs  : 0 queries (0 faster, 0 slower)
    DELETEs  : 0 queries (0 faster, 0 slower)
    REPLACEs : 0 queries (0 faster, 0 slower)
    DROPs    : 0 queries (0 faster, 0 slower)
    
    
    Report
    ------
    Executed 16017 queries
    Spent 00:00:10.533681 executing queries versus an expected 00:01:15.215905 time.
    9987 queries were quicker than expected, 6030 were slower
    A total of 1095 queries had errors.
    Expected 275522 rows, got 185363 (a difference of 90159)
    Number of queries where number of rows differed: 1850.
    
    Average of 16017.00 queries per connection (1 connections).
    
    Per Thread results
    ------------------
    Conn Id		Queries
    0		16017
    

    Pour plus d'informations sur cet outil : percona-playback documentation. Vous voyez je présume le potentiel de cet outil pour bencher la prod sur la preprod ou tout simplement pour bencher lors de la migration d'un serveur de prod. Cela peut également être utile pour faire des optimisations sur les schémas de vos bases et d'en bencher les performances sans impacter votre prod. Bref un outil vraiment très utile.

    En fait ce Do it quick ! est plus long que prévu, pour le prochain je vais essayer de faire plus court...

♥ Partage sur tes réseaux sociaux ♥
Kévin MET
Kévin MET

Auteur de ce blog et gérant de la société MNT-TECH, je publie sur ce blog lorsque le temps me le permet et lorsqu'un sujet qui me parait intéressant n'a pas encore été abordé en français. Toutes les informations techniques présentes sur cette page peuvent être réutilisées moyennant le fait de citer la source.