{"id":38196,"date":"2019-10-31T22:22:13","date_gmt":"2019-10-31T19:22:13","guid":{"rendered":"https:\/\/prohoster.info\/blog\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql\/"},"modified":"2019-10-31T22:22:13","modified_gmt":"2019-10-31T19:22:13","slug":"odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql","title":{"rendered":"Une des m\u00e9thodes pour obtenir le profil de charge de travail et l'historique des attentes dans PostgreSQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Suite de l'article &#171;<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/467181\/\">Tentative de cr\u00e9ation d'un \u00e9quivalent d'ASH pour PostgreSQL <\/a><\/noindex>\u00bb.<\/p>\n<p>Cet article examinera et illustrera, \u00e0 l'aide de requ\u00eates et d'exemples concrets, quelles informations utiles peuvent \u00eatre obtenues gr\u00e2ce \u00e0 la vue pg_stat_activity.<\/p>\n<blockquote><p>Avertissement.<br \/>\nEn raison de la nouveaut\u00e9 du sujet et de l'ach\u00e8vement du processus de test, l'article peut contenir des erreurs. Les critiques et commentaires sont les bienvenus et attendus.<\/p><\/blockquote>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Donn\u00e9es d'entr\u00e9e<\/h2>\n<p><\/p>\n<h3>Vue d'historique pg_stat_statements<\/h3>\n<p>\n<b class=\"spoiler_title\">pg_stat_history<\/b><\/p>\n<pre><code class=\"pgsql\">CREATE TABLE pg_stat_history ( \nid SERIAL, \nsnapshot_timestamp  timestamp without time zone, \ndatabase_id integer,\ndbid oid,\nuserid oid,\nqueryid bigint,\nquery text,\ncalls bigint, \ntotal_time double precision, \nmin_time double precision, \nmax_time double precision, \nmean_time double precision,\nstddev_time double precision,\nrows bigint,\nshared_blks_hit bigint, \nshared_blks_read bigint, \nshared_blks_dirtied bigint, \nshared_blks_written bigint, \nlocal_blks_hit bigint, \nlocal_blks_read bigint,\nlocal_blks_dirtied bigint, \nlocal_blks_written bigint, \ntemp_blks_read bigint,\ntemp_blks_written bigint,\nblk_read_time double precision, \nblk_write_time double precision, \nbaseline_id integer );<\/code><\/pre>\n<p>\n La table est remplie chaque heure en utilisant dblink vers la base de donn\u00e9es cible. La colonne la plus int\u00e9ressante et utile de la table est bien s\u00fbr <b>queryid<\/b>.<\/p>\n<h3>Vue d'historique pg_stat_activity<\/h3>\n<p>\n<b class=\"spoiler_title\">archive_pg_stat_activity<\/b><\/p>\n<pre><code class=\"pgsql\">CREATE TABLE archive_pg_stat_activity\n(\n  timepoint timestamp without time zone,\n  datid             oid, \n  datname           name,\n  pid               integer,\n  usesysid          oid,\n  usename           name,\n  application_name  text,\n  client_addr       inet,\n  client_hostname   text,\n  client_port       integer,\n  backend_start     timestamp without time zone,\n  xact_start        timestamp without time zone,\n  query_start       timestamp without time zone,\n  state_change      timestamp without time zone,\n  wait_event_type   text,                     \n  wait_event        text,                   \n  state             text,                  \n  backend_xid       xid,                 \n  backend_xmin      xid,                \n  query             text,               \n  backend_type      text,\n  queryid           bigint\n);<\/code><\/pre>\n<p>\nLa table repr\u00e9sente une table partitionn\u00e9e par heure de history_pg_stat_activity (En savoir plus ici \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/467277\/\">pg_stat_statements + pg_stat_activity + loq_query = pg_ash ? <\/a><\/noindex> et ici \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/467181\/\">Tentative de cr\u00e9er un \u00e9quivalent ASH pour PostgreSQL.)<\/a><\/noindex><\/p>\n<h2>Sortie<\/h2>\n<p><\/p>\n<h3>TEMPS CPU TOTAL (SYST\u00c8ME + CLIENTS )<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">AVEC \n t AS\n (\n\tSELECT \t\t\n\t\t\tdate_trunc('second', timepoint)\n\tFROM \tactivity_hist.archive_pg_stat_activity aa\n\tWHERE \ttimepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 heure') AND pg_stat_history_end+(current_hour_diff * interval '1 heure')  AND \n\t\t\t( aa.wait_event_type IS NULL  ) AND\n\t\t\taa.state = 'active'\n )\n SELECT count(*) \n INTO cpu_total\n FROM t ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre><code class=\"plaintext\">TEMPS CPU TOTAL (SYST\u00c8ME + CLIENTS ) : 28:37:46<\/code><\/pre>\n<p><\/p>\n<h3>TEMPS D'ATTENTE TOTAL<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">AVEC \n t AS\n (\n\tSELECT \t\t\n\t\t\tdate_trunc('second', timepoint)\n\tFROM \tactivity_hist.archive_pg_stat_activity aa\n\tWHERE \ttimepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 heure') AND pg_stat_history_end+(current_hour_diff * interval '1 heure')  AND \n\t\t\t( aa.wait_event_type IS NOT NULL  ) AND\n\t\t\taa.state = 'active'\n )\n SELECT count(*) \n INTO cpu_total\n FROM t ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre><code class=\"plaintext\">TEMPS D'ATTENTE TOTAL : 30:12:49<\/code><\/pre>\n<p><\/p>\n<h3>Valeurs totales pg_stat_statements<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\"> --TOTAL pg_stat\n  SELECT \n    SUM(calls) AS calls, SUM(total_time) AS total_time, SUM(rows) AS rows ,\n\tSUM(shared_blks_hit) AS shared_blks_hit, SUM(shared_blks_read) AS shared_blks_read ,\n\tSUM(shared_blks_dirtied) AS shared_blks_dirtied, SUM(shared_blks_written) AS shared_blks_written , \n    SUM(local_blks_hit) AS local_blks_hit , SUM(local_blks_read) AS local_blks_read , \n\tSUM(local_blks_dirtied) AS local_blks_dirtied , SUM(local_blks_written) AS local_blks_written,\n\tSUM(temp_blks_read) AS temp_blks_read, SUM(temp_blks_written) AS temp_blks_written , \n\tSUM(blk_read_time) AS blk_read_time , SUM(blk_write_time) AS blk_write_time\n  INTO \n    pg_total_stat_history_rec\n  FROM \n    pg_stat_history\n  WHERE \n \tsnapshot_timestamp BETWEEN pg_stat_history_begin AND pg_stat_history_end AND \n\tqueryid IS NULL;<\/code><\/pre>\n<p><\/p>\n<h3>SQL DBTIME \u2014 temps d'ex\u00e9cution total des requ\u00eates<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">dbtime_total = interval '1 millisecond' * pg_total_stat_history_rec.total_time ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre><code class=\"plaintext\">SQL DBTIME : 136:49:36<\/code><\/pre>\n<p><\/p>\n<h3>SQL CPU TIME \u2014 temps CPU consacr\u00e9 \u00e0 l'ex\u00e9cution des requ\u00eates<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">WITH \n t AS\n (\n\tSELECT \t\t\n\t\t\tdate_trunc('second', timepoint)\n\tFROM \tactivity_hist.archive_pg_stat_activity aa\n\tWHERE \ttimepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND \n\t\t\t( aa.wait_event_type IS NULL ) AND\n\t\t\tbackend_type = 'client backend' AND \n\t\t\taa.state = 'active'\n )\n SELECT count(*) \n INTO cpu_total\n FROM t ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre><code class=\"plaintext\">SQL CPU TIME : 27:40:15<\/code><\/pre>\n<p><\/p>\n<h3>SQL WAITINGS TIME \u2014 temps total d'attente pour les requ\u00eates<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">WITH \n t AS\n (\n\tSELECT \t\t\n\t\t\tdate_trunc('second', timepoint)\n\tFROM \tactivity_hist.archive_pg_stat_activity aa\n\tWHERE \ttimepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND \n\t\t\t( aa.wait_event_type IS NOT NULL ) AND\n\t\t\taa.state = 'active' AND \n\t\tbackend_type = 'client backend'\n )\n SELECT count(*) \n INTO waiting_total\n FROM t ;<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre><code class=\"plaintext\">SQL WAITINGS TIME : 30:04:09<\/code><\/pre>\n<p>\nLes requ\u00eates suivantes sont triviales et pour \u00e9conomiser de l'espace, les d\u00e9tails de mise en \u0153uvre sont omis :<\/p>\n<p><b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre><code class=\"plaintext\">| SQL IOTIME : 19:44:50\n| SQL READ TIME : 19:44:32\n| SQL WRITE TIME : 00:00:17\n|\n| SQL CALLS : 12188248\n-------------------------------------------------------------\n| SQL SHARED BLOCKS READS : 7997039120\n| SQL SHARED BLOCKS HITS : 8868286092\n| SQL SHARED BLOCKS HITS\/READS % : 110.89\n| SQL SHARED BLOCKS DIRTED : 419945\n| SQL SHARED BLOCKS WRITTEN : 19857\n|\n| SQL TEMPORARY BLOCKS READS : 7836169\n| SQL TEMPORARY BLOCKS WRITTEN : 10683938\n<\/code><\/pre>\n<p>\nPassons au chapitre le plus int\u00e9ressant<\/p>\n<h2>STATISTIQUES D'ATTENTE<\/h2>\n<p><\/p>\n<h3>TOP 10 DES ATTENTES PAR TEMPS D'ATTENTE TOTAL POUR LES PROCESSUS CLIENTS<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">SELECT \n  wait_event_type , wait_event ,\n  get_system_waiting_duration( wait_event_type , wait_event ,pg_stat_history_begin+(current_hour_diff * interval '1 hour') ,pg_stat_history_end+(current_hour_diff * interval '1 hour') ) AS duration \nFROM\n  activity_hist.archive_pg_stat_activity aa\nWHERE \n  timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND backend_type != 'client backend' AND wait_event_type IS NOT NULL \nGROUP BY \n  wait_event_type, wait_event\nORDER BY 3 DESC\nLIMIT 10<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre>+------------------------------------------------------------------------------------\n| TOP 10 ATTENTES PAR TEMPS TOTAL D'ATTENTE POUR LES PROCESSUS SYST\u00c8MES\n+-----+------------------------------+--------------------+--------------------\n|    #|               type_d'attente|          \u00e9v\u00e9nement_d'attente|            dur\u00e9e\n+-----+------------------------------+--------------------+--------------------\n|    1|                      Activit\u00e9| LogicalLauncherMain|            10:43:28\n|    2|                      Activit\u00e9|      AutoVacuumMain|            10:42:49\n|    3|                      Activit\u00e9|       WalWriterMain|            10:28:53\n|    4|                      Activit\u00e9|    CheckpointerMain|            10:23:50\n|    5|                      Activit\u00e9|        BgWriterMain|            09:11:59\n|    6|                      Activit\u00e9|   BgWriterHibernate|            01:37:46\n|    7|                            IO|        BufFileWrite|            00:02:35\n|    8|                        LWLock|      buffer_mapping|            00:01:54\n|    9|                            IO|        DataFileRead|            00:01:23\n|   10|                            IO|            WALWrite|            00:00:59\n+-----+------------------------------+--------------------+--------------------\n<\/pre>\n<p><\/p>\n<h3>TOP 10 DES ATTENTES PAR TEMPS D'ATTENTE TOTAL POUR LES PROCESSUS CLIENTS<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">S\u00c9LECTIONNER \n  type_d'attente , \u00e9v\u00e9nement_d'attente ,\n  get_clients_waiting_duration( type_d'attente , \u00e9v\u00e9nement_d'attente , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as dur\u00e9e\nDE \n  activity_hist.archive_pg_stat_activity aa\nO\u00d9 \n  timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hour') ET pg_stat_history_end+(current_hour_diff * interval '1 hour') ET backend_type = 'client backend' ET type_d'attente EST NOT NULL \nGROUP BY type_d'attente, \u00e9v\u00e9nement_d'attente\nORDRE PAR 3 DESC\nLIMIT 10<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre>+-----+------------------------------+--------------------+--------------------+----------\n|    #|               type_d'attente|          \u00e9v\u00e9nement_d'attente|            dur\u00e9e|  % temps_db\n+-----+------------------------------+--------------------+--------------------+----------\n|    1|                          Verrou|       transactionid|            08:16:47|      6.05\n|    2|                            IO|        DataFileRead|            06:13:41|      4.55\n|    3|                       Timeout|             PgSleep|            02:53:21|      2.11\n|    4|                        LWLock|      buffer_mapping|            00:40:42|       0.5\n|    5|                        LWLock|           buffer_io|            00:17:17|      0.21\n|    6|                            IO|        BufFileWrite|            00:01:34|      0.02\n|    7|                          Verrou|               tuple|            00:01:32|      0.02\n|    8|                        Client|          ClientRead|            00:01:19|      0.02\n|    9|                            IO|         BufFileRead|            00:00:37|      0.01\n|   10|                        LWLock|      buffer_content|            00:00:08|         0\n+-----+------------------------------+--------------------+--------------------+----------\n<\/pre>\n<p><\/p>\n<h3>TYPES D'ATTENTES PAR TEMPS TOTAL D'ATTENTE, POUR LES PROCESSUS SYST\u00c8MES<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">S\u00c9LECTIONNER \n  type_d'attente ,\n  get_system_waiting_type_duration( type_d'attente , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as dur\u00e9e\nDE\n  activity_hist.archive_pg_stat_activity aa\nO\u00d9 \n  timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hour') ET pg_stat_history_end+(current_hour_diff * interval '1 hour') ET  backend_type != 'client backend' ET type_d'attente EST NOT NULL \nGROUP BY type_d'attente\nORDRE PAR 2 DESC<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre>+-----+------------------------------+--------------------\n|    #|               type_d_attente|            dur\u00e9e\n+-----+------------------------------+--------------------\n|    1|                      Activit\u00e9|            53:08:45\n|    2|                            I\/O|            00:06:24\n|    3|                        LWLock|            00:03:02\n+-----+------------------------------+--------------------\n<\/pre>\n<p><\/p>\n<h3> TYPES D'ATTENTE PAR TEMPS D'ATTENTE TOTAL, POUR LES PROCESSES CLIENT<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">SELECT \n  type_d_attente ,\n  get_clients_waiting_type_duration( type_d_attente , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as dur\u00e9e\nFROM\n  activity_hist.archive_pg_stat_activity aa\nWHERE \n  timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND backend_type = 'client backend' AND type_d_attente IS NOT NULL \nGROUP BY type_d_attente\nORDER BY 2 DESC<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre>+-----+------------------------------+--------------------+--------------------\n|    #|               type_d_attente|            dur\u00e9e|            % dbtime\n+-----+------------------------------+--------------------+--------------------\n|    1|                          Verrou|            08:18:19|                6.07\n|    2|                            I\/O|            06:16:01|                4.58\n|    3|                       D\u00e9lai|            02:53:21|                2.11\n|    4|                        LWLock|            00:58:12|                0.71\n|    5|                        Client|            00:01:19|                0.02\n|    6|                           IPC|            00:00:04|                   0\n+-----+------------------------------+--------------------+--------------------\n<\/pre>\n<p>\nDur\u00e9es d'attente, pour les processus syst\u00e8me et les requ\u00eates individuelles.<\/p>\n<h3>ATTENTES POUR LES PROCESSES SYST\u00c8MES<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">SELECT \n  type_backend , datname , type_d_attente , \u00e9v\u00e8nement_d_attente , get_backend_type_waiting_duration( type_backend , type_d_attente , \u00e9v\u00e8nement_d_attente , pg_stat_history_begin+(current_hour_diff * interval '1 hour') , pg_stat_history_end+(current_hour_diff * interval '1 hour') ) as dur\u00e9e \nFROM \n  activity_hist.archive_pg_stat_activity aa\nWHERE \n  timepoint BETWEEN pg_stat_history_begin+(current_hour_diff * interval '1 hour') AND pg_stat_history_end+(current_hour_diff * interval '1 hour') AND type_backend != 'client backend' AND type_d_attente IS NOT NULL \nGROUP BY type_backend , datname , type_d_attente , \u00e9v\u00e8nement_d'attente\nORDER BY 5 DESC<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre>+-----+-----------------------------+----------+--------------------+----------------------+--------------------\n|    #|                 backend_type|    dbname|     wait_event_type|            wait_event|            duration\n+-----+-----------------------------+----------+--------------------+----------------------+--------------------\n|    1| lancement de r\u00e9plication logique|          |            Activit\u00e9|   LogicalLauncherMain|            10:43:28\n|    2|          lancement d'autovacuum|          |            Activit\u00e9|        AutoVacuumMain|            10:42:49\n|    3|                    walwriter|          |            Activit\u00e9|         WalWriterMain|            10:28:53\n|    4|                 v\u00e9rificateur|          |            Activit\u00e9|      CheckpointerMain|            10:23:50\n|    5|            \u00e9crivain d'arri\u00e8re-plan|          |            Activit\u00e9|          BgWriterMain|            09:11:59\n|    6|            \u00e9crivain d'arri\u00e8re-plan|          |            Activit\u00e9|     BgWriterHibernate|            01:37:46\n|    7|              travailleur parall\u00e8le|      tdb1|                  IO|          BufFileWrite|            00:02:35\n|    8|              travailleur parall\u00e8le|      tdb1|              LWLock|        buffer_mapping|            00:01:41\n|    9|              travailleur parall\u00e8le|      tdb1|                  IO|          DataFileRead|            00:01:22\n|   10|              travailleur parall\u00e8le|      tdb1|                  IO|           BufFileRead|            00:00:59\n|   11|                    walwriter|          |                  IO|              WALWrite|            00:00:57\n|   12|              travailleur parall\u00e8le|      tdb1|              LWLock|             buffer_io|            00:00:47\n|   13|            travailleur d'autovacuum|      tdb1|              LWLock|        buffer_mapping|            00:00:13\n|   14|            \u00e9crivain d'arri\u00e8re-plan|          |                  IO|         DataFileWrite|            00:00:12\n|   15|                 v\u00e9rificateur|          |                  IO|         DataFileWrite|            00:00:11\n|   16|                    walwriter|          |              LWLock|          WALWriteLock|            00:00:09\n|   17|                 v\u00e9rificateur|          |              LWLock|          WALWriteLock|            00:00:06\n|   18|            \u00e9crivain d'arri\u00e8re-plan|          |              LWLock|          WALWriteLock|            00:00:06\n|   19|                    walwriter|          |                  IO|          WALInitWrite|            00:00:02\n|   20|            travailleur d'autovacuum|      tdb1|              LWLock|          WALWriteLock|            00:00:02\n|   21|                    walwriter|          |                  IO|           WALInitSync|            00:00:02\n|   22|            travailleur d'autovacuum|      tdb1|                  IO|          DataFileRead|            00:00:01\n|   23|                 v\u00e9rificateur|          |                  IO| ControlFileSyncUpdate|            00:00:01\n|   24|            \u00e9crivain d'arri\u00e8re-plan|          |                  IO|              WALWrite|            00:00:01\n|   25|            \u00e9crivain d'arri\u00e8re-plan|          |                  IO|         DataFileFlush|            00:00:01\n|   26|                 v\u00e9rificateur|          |                  IO|         SLRUFlushSync|            00:00:01\n|   27|            travailleur d'autovacuum|      tdb1|                  IO|              WALWrite|            00:00:01\n|   28|                 v\u00e9rificateur|          |                  IO|          DataFileSync|            00:00:01\n+-----+-----------------------------+----------+--------------------+----------------------+--------------------<\/pre>\n<p><\/p>\n<h3>ATTENTES POUR SQL \u2014 attentes pour des requ\u00eates sp\u00e9cifiques par queryid<\/h3>\n<p>\n<b class=\"spoiler_title\">Requ\u00eate<\/b><\/p>\n<pre><code class=\"pgsql\">S\u00c9LECTIONNER \nqueryid, datname, wait_event_type, wait_event, get_query_waiting_duration( queryid, wait_event_type, wait_event, pg_stat_history_begin+(current_hour_diff * interval '1 hour'), pg_stat_history_end+(current_hour_diff * interval '1 hour') ) comme dur\u00e9e \nFROM \n  activity_hist.archive_pg_stat_activity aa\nWHERE \n  timepoint ENTRE pg_stat_history_begin+(current_hour_diff * interval '1 hour') ET pg_stat_history_end+(current_hour_diff * interval '1 hour') ET backend_type = 'client backend' ET wait_event_type EST NON NULL ET queryid EST NON NULL \nGROUPE PAR queryid, datname, wait_event_type, wait_event\nORDER BY 1, 5 DESC <\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">Exemple<\/b><\/p>\n<pre>+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------\n|    #|                  queryid|    dbname|     wait_event_type|          wait_event|            waitings|               total\n|     |                         |          |                    |                    |            duration|            duration\n+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------\n|    1|     -8247416849404883188|      tdb1|              Client|          ClientRead|            00:00:02|\n|    2|     -6572922443698419129|      tdb1|              Client|          ClientRead|            00:00:05|\n|    3|     -6572922443698419129|      tdb1|                  IO|        DataFileRead|            00:00:01|\n|    4|     -5917408132400665328|      tdb1|              Client|          ClientRead|            00:00:04|\n|    5|     -4091009262735781873|      tdb1|              Client|          ClientRead|            00:00:03|\n|    6|     -1473395109729441239|      tdb1|              Client|          ClientRead|            00:00:01|\n|    7|        28942442626229688|      tdb1|                  IO|        BufFileWrite|            00:01:34|            00:46:06\n|    8|        28942442626229688|      tdb1|              LWLock|      buffer_mapping|            00:01:05|            00:46:06\n|    9|        28942442626229688|      tdb1|                  IO|        DataFileRead|            00:00:44|            00:46:06\n|   10|        28942442626229688|      tdb1|                  IO|         BufFileRead|            00:00:37|            00:46:06\n|   11|        28942442626229688|      tdb1|              LWLock|           buffer_io|            00:00:35|            00:46:06\n|   12|        28942442626229688|      tdb1|              Client|          ClientRead|            00:00:05|            00:46:06\n|   13|        28942442626229688|      tdb1|                 IPC| MessageQueueReceive|            00:00:03|            00:46:06\n|   14|        28942442626229688|      tdb1|                 IPC|    BgWorkerShutdown|            00:00:01|            00:46:06\n|   15|       389015618226997618|      tdb1|                Lock|       transactionid|            03:55:09|            04:14:15\n|   16|       389015618226997618|      tdb1|                  IO|        DataFileRead|            03:23:09|            04:14:15\n|   17|       389015618226997618|      tdb1|              LWLock|      buffer_mapping|            00:12:09|            04:14:15\n|   18|       389015618226997618|      tdb1|              LWLock|           buffer_io|            00:10:18|            04:14:15\n|   19|       389015618226997618|      tdb1|                Lock|               tuple|            00:00:35|            04:14:15\n|   20|       389015618226997618|      tdb1|              LWLock|        WALWriteLock|            00:00:02|            04:14:15\n|   21|       389015618226997618|      tdb1|                  IO|       DataFileWrite|            00:00:01|            04:14:15\n|   22|       389015618226997618|      tdb1|              LWLock|        SyncScanLock|            00:00:01|            04:14:15\n|   23|       389015618226997618|      tdb1|              Client|          ClientRead|            00:00:01|            04:14:15\n|   24|       734234407411547467|      tdb1|              Client|          ClientRead|            00:00:11|\n|   25|       734234407411547467|      tdb1|              LWLock|      buffer_mapping|            00:00:05|\n|   26|       734234407411547467|      tdb1|                  IO|        DataFileRead|            00:00:02|\n|   27|      1237430309438971376|      tdb1|              LWLock|      buffer_mapping|            00:02:18|            02:45:40\n|   28|      1237430309438971376|      tdb1|                  IO|        DataFileRead|            00:00:27|            02:45:40\n|   29|      1237430309438971376|      tdb1|              Client|          ClientRead|            00:00:02|            02:45:40\n|   30|      2404820632950544954|      tdb1|              Client|          ClientRead|            00:00:01|\n|   31|      2515308626622579467|      tdb1|              Client|          ClientRead|            00:00:02|\n|   32|      4710212362688288619|      tdb1|              LWLock|      buffer_mapping|            00:03:08|            02:18:21\n|   33|      4710212362688288619|      tdb1|                  IO|        DataFileRead|            00:00:22|            02:18:21\n|   34|      4710212362688288619|      tdb1|              Client|          ClientRead|            00:00:06|            02:18:21\n|   35|      4710212362688288619|      tdb1|              LWLock|           buffer_io|            00:00:02|            02:18:21\n|   36|      9150846928388977274|      tdb1|                  IO|        DataFileRead|            00:01:19|\n|   37|      9150846928388977274|      tdb1|              LWLock|      buffer_mapping|            00:00:34|\n|   38|      9150846928388977274|      tdb1|              Client|          ClientRead|            00:00:10|\n|   39|      9150846928388977274|      tdb1|              LWLock|           buffer_io|            00:00:01|\n+-----+-------------------------+----------+--------------------+--------------------+--------------------+--------------------<\/pre>\n<p><\/p>\n<h3>STATISTIQUES SQL CLIENT \u2014 TOP des requ\u00eates<\/h3>\n<p>\nLes requ\u00eates pour obtenir \u00e0 nouveau, sont triviales et pour \u00e9conomiser de l'espace, ne sont pas indiqu\u00e9es. <\/p>\n<p><b class=\"spoiler_title\">Exemples<\/b><\/p>\n<pre>+------------------------------------------------------------------------------------\n| CLIENT SQL class\u00e9 par Temps \u00c9coul\u00e9\n+--------------------+----------+----------+----------+----------+----------+--------------------\n|        temps \u00e9coul\u00e9|     appels|  % dbtime|     % CPU|      % IO|    nom_base|             queryid\n+--------------------+----------+----------+----------+----------+----------+--------------------\n|            04:14:15|        19|       3.1|     10.83|     11.52|      tdb1|  389015618226997618\n|            02:45:40|       746|      2.02|      4.23|      0.08|      tdb1| 1237430309438971376\n|            02:18:21|       749|      1.69|      3.39|       0.1|      tdb1| 4710212362688288619\n|            00:46:06|       375|      0.56|      0.94|      0.41|      tdb1|   28942442626229688\n+--------------------+----------+----------+----------+----------+----------+--------------------\n| CLIENT SQL class\u00e9 par Temps CPU\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|            temps cpu|     appels|  % dbtime|temps_total|     % CPU|      % IO|    nom_base|             queryid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|            02:59:49|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n|            01:10:12|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n|            00:56:15|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n|            00:15:35|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n| CLIENT SQL class\u00e9 par Temps d'Attente I\/O Utilisateur\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|        temps_io_wait|     appels|  % dbtime|temps_total|     % CPU|      % IO|    nom_base|             queryid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|            03:23:10|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n|            00:02:54|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n|            00:00:27|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n|            00:00:22|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n| CLIENT SQL class\u00e9 par Lectures des Buffers Partag\u00e9s\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|       lectures buffers|     appels|  % dbtime|temps_total|     % CPU|      % IO|    nom_base|             queryid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|          1056388566|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n|            11709251|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n|             3439004|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n|             3373330|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n| CLIENT SQL class\u00e9 par Temps de Lectures de Disque\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|           temps lecture|     appels|  % dbtime|temps_total|     % CPU|      % IO|    nom_base|             queryid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|            02:16:30|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n|            00:04:50|       375|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n|            00:01:10|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n|            00:00:57|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n| CLIENT SQL class\u00e9 par Ex\u00e9cutions\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|               appels|      lignes|  % dbtime|temps_total|     % CPU|      % IO|    nom_base|             queryid\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------\n|                 749|       749|      1.69|  02:18:21|      3.39|       0.1|      tdb1| 4710212362688288619\n|                 746|       746|      2.02|  02:45:40|      4.23|      0.08|      tdb1| 1237430309438971376\n|                 375|         0|      0.56|  00:46:06|      0.94|      0.41|      tdb1|   28942442626229688\n|                  19|        19|       3.1|  04:14:15|     10.83|     11.52|      tdb1|  389015618226997618\n+--------------------+----------+----------+----------+----------+----------+----------+--------------------<\/pre>\n<p><\/p>\n<h2>Conclusion<\/h2>\n<p>\nEn utilisant les requ\u00eates pr\u00e9sent\u00e9es et les rapports obtenus, vous pouvez obtenir une vision plus compl\u00e8te pour analyser et r\u00e9soudre les probl\u00e8mes de d\u00e9gradation des performances, tant pour les requ\u00eates individuelles que pour l'ensemble du cluster.<\/p>\n<h2>D\u00e9veloppement<\/h2>\n<p>\nLes projets de d\u00e9veloppement suivants sont en cours :<\/p>\n<ul>\n<li>Compl\u00e9ter les rapports avec l'historique des verrouillages. Les requ\u00eates sont en cours de test et seront pr\u00e9sent\u00e9es prochainement.<\/li>\n<li>Utiliser l'extension TimescaleDB pour stocker l'historique de pg_stat_activity et pg_locks.<\/li>\n<li>Pr\u00e9parer une solution en lot sur GitHub pour un d\u00e9ploiement massif sur les bases de donn\u00e9es de production.<\/li>\n<\/ul>\n<p>\n\u00c0 suivre...<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/467575\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &#171;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 ASH \u0434\u043b\u044f PostgreSQL &#171;. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u2014 \u043a\u0430\u043a\u0443\u044e \u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f pg_stat_activity. \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u043d\u043e\u0432\u0438\u0437\u043d\u043e\u0439 \u0442\u0435\u043c\u044b \u0438 \u043d\u0435\u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435\u043c \u043f\u0435\u0440\u0438\u043e\u0434\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0441\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438. \u041a\u0440\u0438\u0442\u0438\u043a\u0430 \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f \u0432\u0441\u044f\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442\u0441\u044f \u0438 \u043e\u0436\u0438\u0434\u0430\u044e\u0442\u0441\u044f. \u0412\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-38196","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 ASH \u0434\u043b\u044f PostgreSQL &quot;. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0434\u0438\u043d \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 \u0432 PostgreSQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 ASH \u0434\u043b\u044f PostgreSQL &quot;. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:22:13+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:22:13+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Une m\u00e9thode pour obtenir un profil de charge de travail et un historique des attentes dans PostgreSQL | ProHoster","description":"Suite de l'article \"Tentative de cr\u00e9er un analogue d'ASH pour PostgreSQL\". L'article abordera et montrera des requ\u00eates sp\u00e9cifiques.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0434\u0438\u043d \u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 \u0432 PostgreSQL | ProHoster","og:description":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 &quot;\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0430\u043d\u0430\u043b\u043e\u0433 ASH \u0434\u043b\u044f PostgreSQL &quot;. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0438.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/odin-iz-metodov-polucheniya-profilya-rabochej-nagruzki-i-istorii-ozhidanij-v-postgresql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:22:13+00:00","article:modified_time":"2019-10-31T19:22:13+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"38196","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-23 20:52:50","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:13:23","updated":"2026-01-23 20:52:50","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/38196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=38196"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/38196\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=38196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=38196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=38196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}