SlideShare ist ein Scribd-Unternehmen logo
1 von 26
Downloaden Sie, um offline zu lesen
SQL debug avec Django
Rodolphe Quiédeville
PyTong 2015
26 septembre 2015
#mylife
Admin/Sys tendance DevOps depuis 20 ans
Nourri au logiciel libre exclusivement
Python adepte depuis 10 ans
Consultant en performance des SI(G)
Senior Performance Engineer @PeopleDoc à temps partiel
2 mots sur PeopleDoc
Dématérialisation des documents RH
Conservation des documents 50 ans
Dizaine de projets Django internes
7 plateformes
3 clusters PostgreSQL par plateforme
une centaine de bases de données
50 Millions de documents, +100% tous les ans
Démarche
Créer un cercle vertueux entre le métier, la R&D et la
production
Démarche
Créer un cercle vertueux entre le métier, la R&D et la
production
Intervenir en développement au plus tôt (modification de
schéma, nouvelles fonctionnalités, ...)
Démarche
Créer un cercle vertueux entre le métier, la R&D et la
production
Intervenir en développement au plus tôt (modification de
schéma, nouvelles fonctionnalités, ...)
Suivre le métier (nouveaux clients, import d’historique, ...)
Démarche
Créer un cercle vertueux entre le métier, la R&D et la
production
Intervenir en développement au plus tôt (modification de
schéma, nouvelles fonctionnalités, ...)
Suivre le métier (nouveaux clients, import d’historique, ...)
Instrumenter la production
Démarche
Créer un cercle vertueux entre le métier, la R&D et la
production
Intervenir en développement au plus tôt (modification de
schéma, nouvelles fonctionnalités, ...)
Suivre le métier (nouveaux clients, import d’historique, ...)
Instrumenter la production
Proposer des pistes d’amélioration à la R&D basées sur
les mesures de production (nouveaux index, ré-écriture de
requêtes, ...)
Démarche
Créer un cercle vertueux entre le métier, la R&D et la
production
Intervenir en développement au plus tôt (modification de
schéma, nouvelles fonctionnalités, ...)
Suivre le métier (nouveaux clients, import d’historique, ...)
Instrumenter la production
Proposer des pistes d’amélioration à la R&D basées sur
les mesures de production (nouveaux index, ré-écriture de
requêtes, ...)
Anticiper la croissance et les nouvelles fonctionnalités
demandées par le métier
Mise en oeuvre de la démarche
sensibilisation à l’utilisation de DDT et query-inspector
configuration des différentes briques pour identification des
sources
analyse des logs SQL des instances de test
analyse des logs SQL en intégration
formation des dev à EXPLAIN
tirs de performance tous les jours
Mise en oeuvre de la démarche
sensibilisation à l’utilisation de DDT et query-inspector
configuration des différentes briques pour identification des
sources
analyse des logs SQL des instances de test
analyse des logs SQL en intégration
formation des dev à EXPLAIN
tirs de performance tous les jours
L’ORM n’est pas la solution ultime ni le mal absolu
Problématique
Identifier la source des requêtes SQL relevées dans les logs de
production avec pgbadger
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
pgbadger
Les outils développés
Une offre logicielle insuffisante (pour qui ne manipule pas grep,
awk, sed, ...)
django-sql-log
pgstat
django-sql-log
Tracer dans les logs de la base de données la view source de
la QuerySet.
fournit un middleware configurable
log l’entrée et la sortie dans une vue
publié sur Github @Novafloss
django-sql-log
log de PostgreSQL
duration: 0.174 ms statement: BEGIN
duration: 0.502 ms statement: SET TIME ZONE ’UTC’
duration: 0.053 ms statement: COMMIT
duration: 0.228 ms statement: SHOW default_transaction_isolation
duration: 0.043 ms statement: BEGIN
duration: 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_ar
duration: 0.118 ms statement: SELECT ’django_sql_log_demo.views.Index_STOP’
duration: 0.067 ms statement: ROLLBACK
duration: 0.179 ms statement: BEGIN
duration: 0.513 ms statement: SET TIME ZONE ’UTC’
duration: 0.054 ms statement: COMMIT
duration: 0.231 ms statement: SHOW default_transaction_isolation
pgstat
pgstat.py donne une vision de l’activité SQL
script python monolithique
sortie standard parsable
pour PostgreSQL à partir de 9.4
basé sur l’extension pg_stat_statement
analyse les données des tables catalogue
nécessite un accés exclusif à la base
développement en cours
utilisé chez PeopleDoc dans des jobs Jenkins/Gatling
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.3
pgstat limit : 100
pgstat ratio : 10
================================================================================
queries that returned more than 100 rows
----------------------------------------
1 ignored queries on 4 signatures
calls 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 les
estimations de PostgreSQL)
================================================================================
10 biggest tables
--------------------------------------------------------------------------------
indexes_tem 387973 public
hotel_hotelcompany 110004 public
duck_duck 44000 public
plum_plum 38342 public
hotel_hotel 30000 public
dali_fishon 20600 public
dali_fish_fishon 15223 public
hotel_hotelskin 12090 public
hotel_hoteldoor 12090 public
hotel_hotelcolor 12090 public
================================================================================
Statistiques
pour apprécier la lecture de
main stats, ratio=10
------------------------------------------------------------
pgstat rows total : 7591
pgstat rows / qry : 759
pgstat calls total : 79, limit 200 OK
pgstat calls / qry : 7
pgstat time total : 4547
pgstat time / qry : 454, limit 3000 OK
pgstat rows delta : 19
pgstat rows deltap : 0.25%
pgstat calls delta : 9
pgstat calls deltap : 12.86%
pgstat time delta : 524
pgstat time deltap : 13.02%
pgstat status : OK
------------------------------------------------------------
Indexation
Colonnes qui méritent attention
------------------------------------------------------------
column may be indexed
---------------------
score 260 for processes_task.action_needed_company
score 120 for processes_task.action_done_employee
score 180 for processes_task.action_needed_employee
score 20 for user_right.user_type
score 30 for ticket_ticketvisibleby.need_action
score 160 for processes_task.action_done_company
score 10 for processes_process.published
================================================================================
pgstat stop
Autres informations
statistiques par type de commande par utilisateur
queries with LIMIT 21 clause
Application name
Travail sur la configuration des workers avec supervisor,
utilisation de l’application name de la libpq
environment=PGAPPNAME=mytask
log_line_prefix = ’%t user=%u,db=%d,app=%a ’ dans
postgresql.conf
Questions ?
On recrute
Rodolphe Quiédeville
rodolphe.quiedeville@people-doc.com
Document publié sous Licence Creative Commons BY-SA 2.0

Weitere ähnliche Inhalte

Andere mochten auch

Administrer ENT HdS J1
Administrer ENT HdS J1Administrer ENT HdS J1
Administrer ENT HdS J1
rvafiades
 
C´est nous, les slovaques 1. skupina
C´est nous, les slovaques   1. skupinaC´est nous, les slovaques   1. skupina
C´est nous, les slovaques 1. skupina
Oľga Fraňová
 
La fourmi d’Argentine (Linepithema humile) face à une fourmi dominante du gen...
La fourmi d’Argentine (Linepithema humile) face à une fourmi dominante du gen...La fourmi d’Argentine (Linepithema humile) face à une fourmi dominante du gen...
La fourmi d’Argentine (Linepithema humile) face à une fourmi dominante du gen...
Dr. Berville
 
Com Communication de crise franke
Com Communication de crise frankeCom Communication de crise franke
Com Communication de crise franke
Anne Dumas
 
Jean luc boeuf - Séance 5 - Les niveaux d'administration locale
Jean luc boeuf - Séance 5 - Les niveaux d'administration localeJean luc boeuf - Séance 5 - Les niveaux d'administration locale
Jean luc boeuf - Séance 5 - Les niveaux d'administration locale
Jean Luc Boeuf
 
Publier à partir de votre portable
Publier à partir de votre portablePublier à partir de votre portable
Publier à partir de votre portable
Doublet-fr
 

Andere mochten auch (20)

BROCHURE JSG Technologies
BROCHURE JSG Technologies BROCHURE JSG Technologies
BROCHURE JSG Technologies
 
Administrer ENT HdS J1
Administrer ENT HdS J1Administrer ENT HdS J1
Administrer ENT HdS J1
 
Projet sur les emplois informatiques
Projet sur les emplois informatiquesProjet sur les emplois informatiques
Projet sur les emplois informatiques
 
Réagir face aux crises : Social Media, Communication, Juridique
Réagir face aux crises : Social Media, Communication, JuridiqueRéagir face aux crises : Social Media, Communication, Juridique
Réagir face aux crises : Social Media, Communication, Juridique
 
Fd l0501
Fd l0501Fd l0501
Fd l0501
 
Étude de la Plate-forme Intermodale de Sines
Étude de la Plate-forme Intermodale de SinesÉtude de la Plate-forme Intermodale de Sines
Étude de la Plate-forme Intermodale de Sines
 
C´est nous, les slovaques 1. skupina
C´est nous, les slovaques   1. skupinaC´est nous, les slovaques   1. skupina
C´est nous, les slovaques 1. skupina
 
PR #29
PR #29PR #29
PR #29
 
Café VTÉ rencontre Reptic 3 octobre 2013
Café VTÉ rencontre Reptic 3 octobre 2013Café VTÉ rencontre Reptic 3 octobre 2013
Café VTÉ rencontre Reptic 3 octobre 2013
 
La fourmi d’Argentine (Linepithema humile) face à une fourmi dominante du gen...
La fourmi d’Argentine (Linepithema humile) face à une fourmi dominante du gen...La fourmi d’Argentine (Linepithema humile) face à une fourmi dominante du gen...
La fourmi d’Argentine (Linepithema humile) face à une fourmi dominante du gen...
 
Computraining replay
Computraining  replayComputraining  replay
Computraining replay
 
Exp2 e leglae_open_data
Exp2 e leglae_open_dataExp2 e leglae_open_data
Exp2 e leglae_open_data
 
Com Communication de crise franke
Com Communication de crise frankeCom Communication de crise franke
Com Communication de crise franke
 
Lentille bionique
Lentille bioniqueLentille bionique
Lentille bionique
 
Jean luc boeuf - Séance 5 - Les niveaux d'administration locale
Jean luc boeuf - Séance 5 - Les niveaux d'administration localeJean luc boeuf - Séance 5 - Les niveaux d'administration locale
Jean luc boeuf - Séance 5 - Les niveaux d'administration locale
 
Compte-rendu réunion 21.06.13
Compte-rendu réunion 21.06.13Compte-rendu réunion 21.06.13
Compte-rendu réunion 21.06.13
 
Publier à partir de votre portable
Publier à partir de votre portablePublier à partir de votre portable
Publier à partir de votre portable
 
Information metier hotellerie restauration fabrication de crêpes ou pizzas ww...
Information metier hotellerie restauration fabrication de crêpes ou pizzas ww...Information metier hotellerie restauration fabrication de crêpes ou pizzas ww...
Information metier hotellerie restauration fabrication de crêpes ou pizzas ww...
 
La medecine internationnale-1
La medecine internationnale-1La medecine internationnale-1
La medecine internationnale-1
 
Jean luc boeuf - Séance 4 - Droit administratif et institutions locales - L'...
Jean luc boeuf  - Séance 4 - Droit administratif et institutions locales - L'...Jean luc boeuf  - Séance 4 - Droit administratif et institutions locales - L'...
Jean luc boeuf - Séance 4 - Droit administratif et institutions locales - L'...
 

Ähnlich wie Pytong2015

Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx France
Marc Bojoly
 
PyConFR - testons en python
PyConFR - testons en pythonPyConFR - testons en python
PyConFR - testons en python
gburet
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Bruno Bonnin
 

Ähnlich wie Pytong2015 (20)

USI 2013 : 7 changements nécessaires pour sauver vos SI décisionnels
USI 2013 : 7 changements nécessaires pour sauver vos SI décisionnelsUSI 2013 : 7 changements nécessaires pour sauver vos SI décisionnels
USI 2013 : 7 changements nécessaires pour sauver vos SI décisionnels
 
Python application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgentsPython application packaging @ MeilleursAgents
Python application packaging @ MeilleursAgents
 
ASFA - Organisation et Méthodologie du projet COLSA
ASFA - Organisation et Méthodologie du projet COLSAASFA - Organisation et Méthodologie du projet COLSA
ASFA - Organisation et Méthodologie du projet COLSA
 
Hello mongo
Hello mongoHello mongo
Hello mongo
 
Retour d'expérience sur PowerShell
Retour d'expérience sur PowerShellRetour d'expérience sur PowerShell
Retour d'expérience sur PowerShell
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx France
 
Perf university
Perf universityPerf university
Perf university
 
PyConFR - testons en python
PyConFR - testons en pythonPyConFR - testons en python
PyConFR - testons en python
 
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
Guide (un tout petit peu) pratique (et totalement subjectif) du stream proces...
 
Plateformes et infrastructure infonuagique natif de ville de Montréall
Plateformes et infrastructure infonuagique natif de ville de MontréallPlateformes et infrastructure infonuagique natif de ville de Montréall
Plateformes et infrastructure infonuagique natif de ville de Montréall
 
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
 
BBL - Monitoring - kyriba
BBL - Monitoring - kyribaBBL - Monitoring - kyriba
BBL - Monitoring - kyriba
 
Université de la performance
Université de la performanceUniversité de la performance
Université de la performance
 
Paris Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascriptParis Web 2015 - Atelier desendettement javascript
Paris Web 2015 - Atelier desendettement javascript
 
Liquibase en action
Liquibase en actionLiquibase en action
Liquibase en action
 
Devops chez Voyages-Sncf.com
Devops chez Voyages-Sncf.comDevops chez Voyages-Sncf.com
Devops chez Voyages-Sncf.com
 
Fusion io
Fusion ioFusion io
Fusion io
 
Architecture Plug-in en LabVIEW : de la conception à la réalisation
Architecture Plug-in en LabVIEW : de la conception à la réalisationArchitecture Plug-in en LabVIEW : de la conception à la réalisation
Architecture Plug-in en LabVIEW : de la conception à la réalisation
 

Mehr von Rodolphe Quiédeville

Présentation de Tsung chez Leboncoin
Présentation de Tsung chez LeboncoinPrésentation de Tsung chez Leboncoin
Présentation de Tsung chez Leboncoin
Rodolphe Quiédeville
 

Mehr von Rodolphe Quiédeville (14)

PostgreSQL Meetup Nantes #2
PostgreSQL Meetup Nantes #2PostgreSQL Meetup Nantes #2
PostgreSQL Meetup Nantes #2
 
Tsung de 1 à 1 million / Confoo Montréal 2015
Tsung de 1 à 1 million / Confoo Montréal 2015Tsung de 1 à 1 million / Confoo Montréal 2015
Tsung de 1 à 1 million / Confoo Montréal 2015
 
Confoo django
Confoo djangoConfoo django
Confoo django
 
BBL Données gégraphiques libres chez Work4labs
BBL Données gégraphiques libres chez Work4labsBBL Données gégraphiques libres chez Work4labs
BBL Données gégraphiques libres chez Work4labs
 
Tsung GIS
Tsung GISTsung GIS
Tsung GIS
 
BBL autour de PostgreSQL @Novapost
BBL autour de PostgreSQL @NovapostBBL autour de PostgreSQL @Novapost
BBL autour de PostgreSQL @Novapost
 
BBL chez Mappy autour de Tsung
BBL chez Mappy autour de TsungBBL chez Mappy autour de Tsung
BBL chez Mappy autour de Tsung
 
Un Tsung vaut mieux que 2 "croisons les doigts"
Un Tsung vaut mieux que 2 "croisons les doigts"Un Tsung vaut mieux que 2 "croisons les doigts"
Un Tsung vaut mieux que 2 "croisons les doigts"
 
OpenStreetMap Realtime Check
OpenStreetMap Realtime CheckOpenStreetMap Realtime Check
OpenStreetMap Realtime Check
 
Présentation de Tsung chez Leboncoin
Présentation de Tsung chez LeboncoinPrésentation de Tsung chez Leboncoin
Présentation de Tsung chez Leboncoin
 
de 1 à 1 million avec Tsung
de 1 à 1 million avec Tsungde 1 à 1 million avec Tsung
de 1 à 1 million avec Tsung
 
Tests de performance avec Tsung
Tests de performance avec TsungTests de performance avec Tsung
Tests de performance avec Tsung
 
Asterisk
AsteriskAsterisk
Asterisk
 
Tests de montée en charge avec Tsung
Tests de montée en charge avec TsungTests de montée en charge avec Tsung
Tests de montée en charge avec Tsung
 

Pytong2015

  • 1. SQL debug avec Django Rodolphe Quiédeville PyTong 2015 26 septembre 2015
  • 2. #mylife Admin/Sys tendance DevOps depuis 20 ans Nourri au logiciel libre exclusivement Python adepte depuis 10 ans Consultant en performance des SI(G) Senior Performance Engineer @PeopleDoc à temps partiel
  • 3. 2 mots sur PeopleDoc Dématérialisation des documents RH Conservation des documents 50 ans Dizaine de projets Django internes 7 plateformes 3 clusters PostgreSQL par plateforme une centaine de bases de données 50 Millions de documents, +100% tous les ans
  • 4. Démarche Créer un cercle vertueux entre le métier, la R&D et la production
  • 5. Démarche Créer un cercle vertueux entre le métier, la R&D et la production Intervenir en développement au plus tôt (modification de schéma, nouvelles fonctionnalités, ...)
  • 6. Démarche Créer un cercle vertueux entre le métier, la R&D et la production Intervenir en développement au plus tôt (modification de schéma, nouvelles fonctionnalités, ...) Suivre le métier (nouveaux clients, import d’historique, ...)
  • 7. Démarche Créer un cercle vertueux entre le métier, la R&D et la production Intervenir en développement au plus tôt (modification de schéma, nouvelles fonctionnalités, ...) Suivre le métier (nouveaux clients, import d’historique, ...) Instrumenter la production
  • 8. Démarche Créer un cercle vertueux entre le métier, la R&D et la production Intervenir en développement au plus tôt (modification de schéma, nouvelles fonctionnalités, ...) Suivre le métier (nouveaux clients, import d’historique, ...) Instrumenter la production Proposer des pistes d’amélioration à la R&D basées sur les mesures de production (nouveaux index, ré-écriture de requêtes, ...)
  • 9. Démarche Créer un cercle vertueux entre le métier, la R&D et la production Intervenir en développement au plus tôt (modification de schéma, nouvelles fonctionnalités, ...) Suivre le métier (nouveaux clients, import d’historique, ...) Instrumenter la production Proposer des pistes d’amélioration à la R&D basées sur les mesures de production (nouveaux index, ré-écriture de requêtes, ...) Anticiper la croissance et les nouvelles fonctionnalités demandées par le métier
  • 10. Mise en oeuvre de la démarche sensibilisation à l’utilisation de DDT et query-inspector configuration des différentes briques pour identification des sources analyse des logs SQL des instances de test analyse des logs SQL en intégration formation des dev à EXPLAIN tirs de performance tous les jours
  • 11. Mise en oeuvre de la démarche sensibilisation à l’utilisation de DDT et query-inspector configuration des différentes briques pour identification des sources analyse des logs SQL des instances de test analyse des logs SQL en intégration formation des dev à EXPLAIN tirs de performance tous les jours L’ORM n’est pas la solution ultime ni le mal absolu
  • 12. Problématique Identifier la source des requêtes SQL relevées dans les logs de production avec pgbadger 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
  • 14. Les outils développés Une offre logicielle insuffisante (pour qui ne manipule pas grep, awk, sed, ...) django-sql-log pgstat
  • 15. django-sql-log Tracer dans les logs de la base de données la view source de la QuerySet. fournit un middleware configurable log l’entrée et la sortie dans une vue publié sur Github @Novafloss
  • 16. django-sql-log log de PostgreSQL duration: 0.174 ms statement: BEGIN duration: 0.502 ms statement: SET TIME ZONE ’UTC’ duration: 0.053 ms statement: COMMIT duration: 0.228 ms statement: SHOW default_transaction_isolation duration: 0.043 ms statement: BEGIN duration: 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_ar duration: 0.118 ms statement: SELECT ’django_sql_log_demo.views.Index_STOP’ duration: 0.067 ms statement: ROLLBACK duration: 0.179 ms statement: BEGIN duration: 0.513 ms statement: SET TIME ZONE ’UTC’ duration: 0.054 ms statement: COMMIT duration: 0.231 ms statement: SHOW default_transaction_isolation
  • 17. pgstat pgstat.py donne une vision de l’activité SQL script python monolithique sortie standard parsable pour PostgreSQL à partir de 9.4 basé sur l’extension pg_stat_statement analyse les données des tables catalogue nécessite un accés exclusif à la base développement en cours utilisé chez PeopleDoc dans des jobs Jenkins/Gatling publié sur gitlab.com:rodo/pg_tools.git
  • 18. 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%) ================================================================================
  • 19. pgstat ================================================================================ pgstat start, version 1.4.3 pgstat limit : 100 pgstat ratio : 10 ================================================================================ queries that returned more than 100 rows ---------------------------------------- 1 ignored queries on 4 signatures calls 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 ================================================================================
  • 20. 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 ================================================================================
  • 21. Indexation Quelques statistiques de volumétrie (basées sur les estimations de PostgreSQL) ================================================================================ 10 biggest tables -------------------------------------------------------------------------------- indexes_tem 387973 public hotel_hotelcompany 110004 public duck_duck 44000 public plum_plum 38342 public hotel_hotel 30000 public dali_fishon 20600 public dali_fish_fishon 15223 public hotel_hotelskin 12090 public hotel_hoteldoor 12090 public hotel_hotelcolor 12090 public ================================================================================
  • 22. Statistiques pour apprécier la lecture de main stats, ratio=10 ------------------------------------------------------------ pgstat rows total : 7591 pgstat rows / qry : 759 pgstat calls total : 79, limit 200 OK pgstat calls / qry : 7 pgstat time total : 4547 pgstat time / qry : 454, limit 3000 OK pgstat rows delta : 19 pgstat rows deltap : 0.25% pgstat calls delta : 9 pgstat calls deltap : 12.86% pgstat time delta : 524 pgstat time deltap : 13.02% pgstat status : OK ------------------------------------------------------------
  • 23. Indexation Colonnes qui méritent attention ------------------------------------------------------------ column may be indexed --------------------- score 260 for processes_task.action_needed_company score 120 for processes_task.action_done_employee score 180 for processes_task.action_needed_employee score 20 for user_right.user_type score 30 for ticket_ticketvisibleby.need_action score 160 for processes_task.action_done_company score 10 for processes_process.published ================================================================================ pgstat stop
  • 24. Autres informations statistiques par type de commande par utilisateur queries with LIMIT 21 clause
  • 25. Application name Travail sur la configuration des workers avec supervisor, utilisation de l’application name de la libpq environment=PGAPPNAME=mytask log_line_prefix = ’%t user=%u,db=%d,app=%a ’ dans postgresql.conf
  • 26. Questions ? On recrute Rodolphe Quiédeville rodolphe.quiedeville@people-doc.com Document publié sous Licence Creative Commons BY-SA 2.0