SQL Debug avec Django @ PyConFr 2015

Post on 21-Jan-2017

693 views 3 download

Transcript of SQL Debug avec Django @ PyConFr 2015

SQL debug avec Django

Rodolphe Quiédeville

PyConFr 2015

18 octobre 2015

#mylife

I Admin/Sys tendance DevOps depuis 20 ansI Nourri au logiciel libre exclusivementI Python adepte depuis 10 ansI Consultant en performance des SI(G)I Senior Performance Engineer @PeopleDoc à temps partiel

2 mots sur PeopleDoc

I Dématérialisation des documents RHI Conservation des documents 50 ansI Dizaine de projets Django internesI 7 plateformesI 3 clusters PostgreSQL par plateformeI une centaine de bases de donnéesI 50 Millions de documents, +100% tous les ans

Problématique majeure

Identifier la source des requêtes SQL relevées dans les logs deproduction

SELECT "fish_fish"."id", "fish_fish"."title","fish_fish"."body", "fish_fish"."body_size","fish_fish"."title_size", "fish_fish"."lang_id","fish_fish"."lang"

FROM "fish_fish"

ORDER BY "fish_fish"."body" DESC

Démarche

Créer un cercle vertueux entre le métier, la R&D et laproduction

I Intervenir en développement au plus tôt (modification deschéma, nouvelles fonctionnalités, ...)

I Analyser les métriques de production (instrumentation, ...)I Suivre le métier (nouveaux clients, import d’historique, ...)I Anticiper la croissance et les nouvelles fonctionnalités

demandées par le métierI Proposer des pistes d’amélioration à la R&D basées sur

les mesures de production (nouveaux index, ré-écriture derequêtes, ...)

Démarche

Créer un cercle vertueux entre le métier, la R&D et laproduction

I Intervenir en développement au plus tôt (modification deschéma, nouvelles fonctionnalités, ...)

I Analyser les métriques de production (instrumentation, ...)I Suivre le métier (nouveaux clients, import d’historique, ...)I Anticiper la croissance et les nouvelles fonctionnalités

demandées par le métierI Proposer des pistes d’amélioration à la R&D basées sur

les mesures de production (nouveaux index, ré-écriture derequêtes, ...)

Démarche

Créer un cercle vertueux entre le métier, la R&D et laproduction

I Intervenir en développement au plus tôt (modification deschéma, nouvelles fonctionnalités, ...)

I Analyser les métriques de production (instrumentation, ...)

I Suivre le métier (nouveaux clients, import d’historique, ...)I Anticiper la croissance et les nouvelles fonctionnalités

demandées par le métierI Proposer des pistes d’amélioration à la R&D basées sur

les mesures de production (nouveaux index, ré-écriture derequêtes, ...)

Démarche

Créer un cercle vertueux entre le métier, la R&D et laproduction

I Intervenir en développement au plus tôt (modification deschéma, nouvelles fonctionnalités, ...)

I Analyser les métriques de production (instrumentation, ...)I Suivre le métier (nouveaux clients, import d’historique, ...)

I Anticiper la croissance et les nouvelles fonctionnalitésdemandées par le métier

I Proposer des pistes d’amélioration à la R&D basées surles mesures de production (nouveaux index, ré-écriture derequêtes, ...)

Démarche

Créer un cercle vertueux entre le métier, la R&D et laproduction

I Intervenir en développement au plus tôt (modification deschéma, nouvelles fonctionnalités, ...)

I Analyser les métriques de production (instrumentation, ...)I Suivre le métier (nouveaux clients, import d’historique, ...)I Anticiper la croissance et les nouvelles fonctionnalités

demandées par le métier

I Proposer des pistes d’amélioration à la R&D basées surles mesures de production (nouveaux index, ré-écriture derequêtes, ...)

Démarche

Créer un cercle vertueux entre le métier, la R&D et laproduction

I Intervenir en développement au plus tôt (modification deschéma, nouvelles fonctionnalités, ...)

I Analyser les métriques de production (instrumentation, ...)I Suivre le métier (nouveaux clients, import d’historique, ...)I Anticiper la croissance et les nouvelles fonctionnalités

demandées par le métierI Proposer des pistes d’amélioration à la R&D basées sur

les mesures de production (nouveaux index, ré-écriture derequêtes, ...)

Mise en oeuvre de la démarche

I sensibilisation à l’utilisation de DDT et query-inspectorI configuration des différentes briques pour identification des

sourcesI analyse des logs SQL des instances de testI analyse des logs SQL en intégrationI formation des développeurs à EXPLAINI tirs de performance tous les jours

pgbadger

Les outils développés

Une offre logicielle insuffisante (pour qui ne manipule pas grep,awk, sed, ...)

I django-sql-logI pgstat (PygCat)

django-sql-log

Tracer dans les logs de la base de données la view source dela QuerySet.

I fournit un middleware configurableI log l’entrée et la sortie dans une vueI publié sur Github @Novafloss

django-sql-log

log de PostgreSQL

duration: 0.174 ms statement: BEGINduration: 0.502 ms statement: SET TIME ZONE ’UTC’duration: 0.053 ms statement: COMMITduration: 0.228 ms statement: SHOW default_transaction_isolationduration: 0.043 ms statement: BEGINduration: 0.354 ms statement: SELECT ’django_sql_log_demo.views.Index_START’duration: 1.221 ms statement: SELECT "dummy_article"."id", "dummy_article"."title", "dummy_article"."body" FROM "dummy_article"duration: 0.118 ms statement: SELECT ’django_sql_log_demo.views.Index_STOP’duration: 0.067 ms statement: ROLLBACKduration: 0.179 ms statement: BEGINduration: 0.513 ms statement: SET TIME ZONE ’UTC’duration: 0.054 ms statement: COMMITduration: 0.231 ms statement: SHOW default_transaction_isolation

pgstat

pgstat.py donne une vision de l’activité SQL

I script python monolithique (était)I sortie standard parsableI pour PostgreSQL à partir de 9.4I basé sur l’extension pg_stat_statementI analyse les données des tables catalogueI nécessite un accés exclusif à la baseI développement en coursI utilisé chez PeopleDoc dans des jobs Jenkins/GatlingI publié sur gitlab.com:rodo/pg_tools.git

Rapport Gatling

Le rapport de Gatling comme source d’inspiration

================================================================================---- Global Information--------------------------------------------------------> request count 185 (OK=185 KO=0 )> min response time 13 (OK=13 KO=- )> max response time 3468 (OK=3468 KO=- )> mean response time 348 (OK=348 KO=- )> std deviation 278 (OK=278 KO=- )> response time 50th percentile 322 (OK=322 KO=- )> response time 75th percentile 431 (OK=431 KO=- )> mean requests/sec 1.84 (OK=1.84 KO=- )---- Response Time Distribution------------------------------------------------> t < 800 ms 184 ( 99%)> 800 ms < t < 1200 ms 0 ( 0%)> t > 1200 ms 1 ( 1%)> failed 0 ( 0%)================================================================================

pgstat

================================================================================pgstat start, version 1.4.3pgstat limit : 100pgstat ratio : 10================================================================================queries that returned more than 100 rows----------------------------------------1 ignored queries on 4 signaturescalls 10, rows 80090, rpc 8009.00 (rpc means rows per call)user : peopleask, sign 7887422347665ceddfe912ce7d0ad776--------------------------------------SELECT "user_right"."id", "user_right"."password","user_right"."is_superuser", "user_right"."username","user_right"."first_name", "user_right"."last_name","user_right"."email", "user_right"."is_staff","user_right"."is_active", "user_right"."date_joined","user_right"."language_code", "user_right"."user_type","user_right"."tech_id", "user_right"."timezone","user_right"."country_id" FROM "user_right" WHERE (NOT("user_right"."user_type" = ?) AND "user_right"."is_active" = ?)================================================================================pgstat status : KO================================================================================

Filtre manquant

Détection des requêtes sans clause WHERE

================================================================================queries without where clause----------------------------calls 2, rows 19458, rpc 9729.00 (rpc means rows per call)user : rodo, sign 6430b76b90ca0fa534d1cf382e535818--------------------------------------SELECT "fish_fish"."id", "fish_fish"."title" FROM"fish_fish"================================================================================calls 1, rows 9729, rpc 9729.00 (rpc means rows per call)user : rodo, sign 23e2a60edd4fdb127730b8150d352ffd--------------------------------------SELECT "fish_fish"."id", "fish_fish"."title","fish_fish"."body", "fish_fish"."body_size","fish_fish"."title_size", "fish_fish"."lang_id","fish_fish"."lang" FROM "fish_fish" ORDER BY"fish_fish"."body" DESC================================================================================

Indexation

Quelques statistiques de volumétrie (basées sur lesestimations de PostgreSQL)

================================================================================10 biggest tables--------------------------------------------------------------------------------indexes_tem 387973 publichotel_hotelcompany 110004 publicduck_duck 44000 publicplum_plum 38342 publichotel_hotel 30000 publicdali_fishon 20600 publicdali_fish_fishon 15223 publichotel_hotelskin 12090 publichotel_hoteldoor 12090 publichotel_hotelcolor 12090 public================================================================================

Statistiques

pour apprécier la lecture de

main stats, ratio=10------------------------------------------------------------pgstat rows total : 7591pgstat rows / qry : 759pgstat calls total : 79, limit 200 OKpgstat calls / qry : 7pgstat time total : 4547pgstat time / qry : 454, limit 3000 OKpgstat rows delta : 19pgstat rows deltap : 0.25%pgstat calls delta : 9pgstat calls deltap : 12.86%pgstat time delta : 524pgstat time deltap : 13.02%pgstat status : OK------------------------------------------------------------

Indexation

Colonnes qui méritent attention

------------------------------------------------------------column may be indexed---------------------score 260 for processes_task.action_needed_companyscore 120 for processes_task.action_done_employeescore 180 for processes_task.action_needed_employeescore 20 for user_right.user_typescore 30 for ticket_ticketvisibleby.need_actionscore 160 for processes_task.action_done_companyscore 10 for processes_process.published================================================================================pgstat stop

Autres informations

I statistiques par type de commande par utilisateurI queries with LIMIT 21 clause

Application name

Travail sur la configuration des workers avec supervisor,utilisation de l’application name de la libpq

I environment=PGAPPNAME=mytaskI log_line_prefix = ’%t user=%u,db=%d,app=%a ’ dans

postgresql.conf

... 11:59:39 ... user=rodo,host=10.0.42.2,db=tickets,app=psqlLOG: duration: 1.126 msstatement: select * from article;

... 11:59:41 ... user=rodo,host=10.0.42.2,db=tickets,app=index_queueLOG: duration: 0.227 msstatement: select * from article;

TL; TR;

I l’ORM n’est pas la solution ultime ...I ... ni le mal absoluI tous les logs sont intéressantsI l’information existe cherchez làI les tests de perfs remontent des erreurs fonctionnellesI le développeur ne doit pas testerI le debug repose sur le feeling

Questions ?

On recrute

Rodolphe Quiédeville

rodolphe.quiedeville@people-doc.com

Document publié sous Licence Creative Commons BY-SA 2.0