{"id":10742,"date":"2025-11-19T10:10:27","date_gmt":"2025-11-19T09:10:27","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=10742"},"modified":"2025-11-19T18:23:48","modified_gmt":"2025-11-19T17:23:48","slug":"postgresql-18-des-io-asynchrones-performantes","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/","title":{"rendered":"PostgreSQL 18 : des IO asynchrones performantes !"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10742&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10742&#038;title=PostgreSQL%2018%20%3A%20des%20IO%20asynchrones%20performantes%20%21\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=PostgreSQL%2018%20%3A%20des%20IO%20asynchrones%20performantes%20%21&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10742\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-10743\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/7346573-300x300.png\" alt=\"\" width=\"300\" height=\"300\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/7346573-300x300.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/7346573-150x150.png 150w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/7346573-144x144.png 144w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/7346573-50x50.png 50w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/7346573.png 512w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Le 25 septembre dernier, PostgreSQL sortait sa toute derni\u00e8re version, PostgreSQL 18.<br \/>\nCette version apporte de nombreux correctifs mais aussi des nouveaut\u00e9s et des am\u00e9liorations sur les performances globales.<\/p>\n<p>Une nouveaut\u00e9 est particuli\u00e8rement pertinente pour cette version. Il s&#8217;agit des &#8220;asynchronous IO&#8221; (AIO).<\/p>\n<h2>Pr\u00e9sentation<\/h2>\n<p>Une lecture en mode synchrone se fait lorsque PostgreSQL demande au kernel l&#8217;acc\u00e8s \u00e0 une page disque. PostgreSQL attend alors sa mise \u00e0 disposition pour \u00eatre trait\u00e9e et mont\u00e9e en m\u00e9moire partag\u00e9e.<br \/>\nL&#8217;OS \u00e9coute la requ\u00eate de la part de PostgreSQL et ne peut anticiper les \u00e9ventuelles demandes.<br \/>\nDans ce contexte, PostgreSQL est tr\u00e8s d\u00e9pendant des performances disques avec d&#8217;\u00e9ventuels &#8220;bottlenecks&#8221;.<\/p>\n<p>Avec le mode asynchrone IO, l&#8217;OS est capable de traiter en parall\u00e8le les demandes faites par PostgreSQL et peut donc facilement travailler sur plusieurs requ\u00eates en lecture.<\/p>\n<p>&nbsp;<\/p>\n<p>Synchronous IO\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 Asynchronous IO<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10744\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/synch_IO.jpg\" alt=\"\" width=\"474\" height=\"222\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/synch_IO.jpg 827w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/synch_IO-300x140.jpg 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/synch_IO-768x359.jpg 768w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/>\u00a0 \u00a0<img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10745\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/asynch_IO.jpg\" alt=\"\" width=\"459\" height=\"187\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/asynch_IO.jpg 818w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/asynch_IO-300x122.jpg 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/asynch_IO-768x314.jpg 768w\" sizes=\"auto, (max-width: 459px) 100vw, 459px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Un premier travail avait \u00e9t\u00e9 fait avec les versions r\u00e9centes de PostgreSQL afin de faire du &#8220;prefetch&#8221; de donn\u00e9es via la m\u00e9thode syst\u00e8me &#8220;<a href=\"http:\/\/manpagesfr.free.fr\/man\/man2\/posix_fadvise.2.html\">posix_fadvise<\/a>&#8220;, ceci permettait d&#8217;anticiper les d\u00e9clarations d&#8217;acc\u00e8s \u00e0 certaines donn\u00e9es ou pages de fichiers en d\u00e9clarant un offset de d\u00e9part et une longueur d\u00e9fini. Ceci \u00e9vite des allers-retours sur le m\u00eame fichier traitant des pages contigu\u00ebs.<br \/>\nMalheureusement, avec PostgreSQL, ce m\u00e9canisme ne permet pas de monter les pages dans le &#8220;<strong>shared_buffer<\/strong>&#8220;, mais s&#8217;appuie sur le cache disque.<\/p>\n<p>Avec les asynchronous IO, PostgreSQL est particuli\u00e8rement performant lors des lectures s\u00e9quentielles (seq scans, bitmap heap scan).<br \/>\nUn parall\u00e8le peut \u00eatre fait avec le m\u00e9canisme d&#8217;offloading fait par Oracle Exadata et les &#8220;smart scans&#8221; mont\u00e9s directement vers la PGA.<\/p>\n<p>&nbsp;<\/p>\n<h2>Param\u00e9trage<\/h2>\n<p>&nbsp;<\/p>\n<p>Avec la version 18, PostgreSQL met l&#8217;accent sur les lectures asynchrones avec de nouveaux param\u00e8tres.<\/p>\n<p><b>io_method<\/b> qui peut prendre 3 valeurs diff\u00e9rentes<\/p>\n<ul>\n<li><span style=\"color: #3366ff;\">sync<\/span> : ex\u00e9cute les IO en mode synchrone comme pour les versions PostgreSQL ant\u00e9rieures<\/li>\n<li><span style=\"color: #3366ff;\">worker<\/span> : valeur par d\u00e9faut. Les lectures se font via des processus en parall\u00e8les lanc\u00e9s par la requ\u00eate parente (3 par d\u00e9faut). Ces processus font des appels aupr\u00e8s du kernel et montent les donn\u00e9es dans le &#8220;shared_buffers&#8221; pour \u00eatre trait\u00e9es.<\/li>\n<li><span style=\"color: #3366ff;\">io_uring<\/span> : utilisation de la m\u00e9thode &#8220;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Io_uring\">io_uring<\/a>&#8221; qui consiste, depuis la version 5.1 du kernel Linux, \u00e0 utiliser des &#8220;shared ring buffers&#8221;. Ce proc\u00e9d\u00e9 utilise des &#8220;queue rings&#8221; entre PostgreSQL et le kernel , avec &#8220;completion queue&#8221; pour la partie kernel et &#8220;submission queue&#8221; g\u00e9r\u00e9 pour les demandes PostgreSQL.<br \/>\nJe vous invite \u00e0 lire <a href=\"https:\/\/www.phoronix.com\/news\/Linux-io_uring-Fast-Efficient\">cet article<\/a> pour plus de pr\u00e9cisions sur ce m\u00e9canisme.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><strong>io_worker<\/strong> repr\u00e9sentant le nombre de process en parall\u00e8le qui vont traiter les demandes de mise en cache des pages.<br \/>\nPar d\u00e9faut, le nombre est de 3, mais nous pouvons monter au-del\u00e0.<\/p>\n<p><strong>effective_io_concurrency<\/strong> est d\u00e9j\u00e0 pr\u00e9sent sur les anciennes versions de PostgreSQL. Cependant, dans le cas des IO asychrones (io_method=worker ou io_methode=io_uring), les IO se font en concurrence directement dans PostgreSQL.<\/p>\n<p><strong>io_combine_limit<\/strong> est la taille maximale d&#8217;IO.<\/p>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #ff6600;\">Syst\u00e8me<\/span><\/h4>\n<p>&nbsp;<\/p>\n<p>V\u00e9rifier que votre serveur Linux est compatible avec la m\u00e9thode &#8220;io_uring&#8221;. Pour cela ex\u00e9cuter cette commande, qui doit vous renvoyer 0<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">$ cat \/proc\/sys\/kernel\/io_uring_disabled\r\n0<\/pre>\n<p>Sinon, forcer la valeur \u00e0 0, sous &#8220;root&#8221;.<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\"># echo 0 &gt; \/proc\/sys\/kernel\/io_uring_disabled<\/pre>\n<p>&nbsp;<\/p>\n<p>La validation peut se faire \u00e9galement sur la configuration du kernel au d\u00e9marrage<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\"> # cat \/boot\/config-6.12.48+deb13-cloud-amd64 | grep -i io_uring\r\nCONFIG_IO_URING=y<\/pre>\n<p>&nbsp;<\/p>\n<h4><span style=\"color: #ff6600;\">PostgreSQL<\/span><\/h4>\n<p>&nbsp;<\/p>\n<p>Pour utiliser le mode &#8220;<strong>io_method=<span style=\"color: #3366ff;\">io_uring<\/span><\/strong>&#8220;, il faudra compiler PostgreSQL 18 avec ce mode -&gt; <strong>with-liburing<\/strong>.<\/p>\n<p>Il faut donc r\u00e9cup\u00e9rer les sources depuis le site officiel <a href=\"https:\/\/www.postgresql.org\/ftp\/source\/v18.1\/\">PostgreSQL<\/a><\/p>\n<p>Puis configurer avec l&#8217;option suivante :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\"># .\/configure --with-liburing\r\n# make\r\n# make install\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h2>Benchmark<\/h2>\n<p>&nbsp;<\/p>\n<p>Pour nos tests, nous utilisons l&#8217;outil &#8220;pgbench&#8221;.<br \/>\nNous allons cr\u00e9er un jeu de test avec un facteur de 500 sur le nombre de lignes cr\u00e9\u00e9es par d\u00e9faut dans les tables. Notre plus grosse table &#8220;pgbench_accounts&#8221; devrait donc d\u00e9passer les 50M de lignes.<\/p>\n<p>Attention, chaque test se fait avec donn\u00e9es &#8220;\u00e0 froid&#8221;. Le cache est vid\u00e9 \u00e0 chaque interrogation. C&#8217;est \u00e0 la premi\u00e8re ex\u00e9cution que le test est le plus repr\u00e9sentatif car PostgreSQL n&#8217;a pas de pages dans son cache et doit donc solliciter le kernel.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">$ pgbench -i pgbench -s 500\r\ndropping old tables...\r\nNOTICE: table &quot;pgbench_accounts&quot; does not exist, skipping\r\nNOTICE: table &quot;pgbench_branches&quot; does not exist, skipping\r\nNOTICE: table &quot;pgbench_history&quot; does not exist, skipping\r\nNOTICE: table &quot;pgbench_tellers&quot; does not exist, skipping\r\ncreating tables...\r\ngenerating data (client-side)...\r\nvacuuming...\r\ncreating primary keys...\r\ndone in 42.40 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 25.13 s, vacuum 3.35 s, primary keys 13.92 s).<\/pre>\n<p>&nbsp;<\/p>\n<p>La suite consiste \u00e0 lancer un &#8220;SELECT COUNT&#8221; sur la table &#8220;pgbench_accounts&#8221; et relever les temps d&#8217;ex\u00e9cution entre les diff\u00e9rentes versions de PostgreSQL et les diff\u00e9rentes m\u00e9thodes de lectures asynchrones.<\/p>\n<p>&nbsp;<\/p>\n<h4>PostgreSQL 17<\/h4>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">$  select count(abalance) from &quot;pgbench_accounts&quot;;\r\ncount\r\n----------\r\n50000000\r\n(1 row)\r\n\r\nTime: 48937.120 ms (00:48.937)<\/pre>\n<p>&nbsp;<\/p>\n<p>Nous mettons un peu plus de 49 secondes pour compter les 50M de lignes de la table.<\/p>\n<p>le plan d&#8217;ex\u00e9cution est le suivant<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">$  explain (analyze, buffers) select count(abalance) from &quot;pgbench_accounts&quot;;\r\nQUERY PLAN\r\n-------------------------------------------------------------------------------------------------------------------------------------------------------------\r\nFinalize Aggregate (cost=1081089.88..1081089.89 rows=1 width=8) (actual time=69053.114..69053.219 rows=1 loops=1)\r\nBuffers: shared hit=2518 read=817155\r\n- Gather (cost=1081089.67..1081089.88 rows=2 width=8) (actual time=69051.505..69053.209 rows=3 loops=1)\r\nWorkers Planned: 2\r\nWorkers Launched: 2\r\nBuffers: shared hit=2518 read=817155\r\n- Partial Aggregate (cost=1080089.67..1080089.68 rows=1 width=8) (actual time=69021.569..69021.571 rows=1 loops=3)\r\nBuffers: shared hit=2518 read=817155\r\n- Parallel Seq Scan on pgbench_accounts (cost=0.00..1028006.33 rows=20833333 width=4) (actual time=4.259..41669.680 rows=16666667 loops=3)\r\nBuffers: shared hit=2518 read=817155\r\nPlanning Time: 0.056 ms\r\nExecution Time: 69053.251 ms<\/pre>\n<p>&nbsp;<\/p>\n<p>Le &#8220;parallel seq scan&#8221; sur &#8220;pgbench_accounts&#8221; est fait avec 2 workers en parall\u00e8le.<\/p>\n<p>&nbsp;<\/p>\n<h4>PostgreSQL 18<\/h4>\n<p>&nbsp;<\/p>\n<p>Avec la valeur &#8220;<strong>io_methode=sync<\/strong>&#8220;, nous retrouvons \u00e0 peu pr\u00e8s le m\u00eame temps, m\u00eame si notre serveur sur PostgreSQL 18 est peu plus puissant et dispose de plus de RAM.Le &#8220;shared_buffer&#8221; a \u00e9t\u00e9 taill\u00e9 en cons\u00e9quence.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">pgbench=# select count(abalance) from &quot;pgbench_accounts&quot;;\r\ncount\r\n----------\r\n10000000\r\n(1 row)\r\n\r\nTime: 49704.009 ms (00:49.704)<\/pre>\n<p>&nbsp;<\/p>\n<p>le plan est \u00e0 peu pr\u00e8s le m\u00eame avec nos 2 workers effectuant du &#8220;parallel seq scan&#8221; sur &#8220;pgbench_accounts&#8221;.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">  - Parallel Seq Scan on public.pgbench_accounts (cost=0.00..205601.67 rows=4166667 width=4) (actual time=0.838..42937.512 rows=3333333.33 loops=3)\r\nOutput: aid, bid, abalance, filler\r\nBuffers: shared read=163935\r\nBuffers: shared read=54826<\/pre>\n<p>&nbsp;<\/p>\n<p>Avec &#8220;<strong>io_method=worker<\/strong>&#8221; = 3, l\u00e0, nous gagnons d\u00e9j\u00e0 quelques secondes en terme de temps d&#8217;ex\u00e9cution puisque notre requ\u00eate est proche des 40 sec.<\/p>\n<p>Puis avec &#8220;<strong>io_method=io_uring<\/strong>&#8220;, c&#8217;est l\u00e0 que nous sommes le plus performant puisque nous descendons \u00e0 moins de 25 secondes.<\/p>\n<p>&nbsp;<\/p>\n<p>Nous obtenons les r\u00e9sultats suivants<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10753 size-full\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/temps-2.jpg\" alt=\"\" width=\"629\" height=\"368\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/temps-2.jpg 629w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/temps-2-300x176.jpg 300w\" sizes=\"auto, (max-width: 629px) 100vw, 629px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>A noter que pendant des op\u00e9rations de lectures asynchrones, nous pouvons suivre l&#8217;\u00e9volution de celles ci via la vue &#8216;<strong>pg_aios<\/strong>&#8221; mise \u00e0 disposition par PostgreSQL.<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">$  select * from pg_aios;\r\npid | io_id | io_generation | state | operation | off | length | target | handle_data_len | raw_result | result | target_desc | f_sync | f_localmem | f_buffered\r\n-------+-------+---------------+-----------+-----------+-----------+--------+--------+-----------------+------------+---------+--------------------------------------------------+--------+------------+------------\r\n41329 | 192 | 9233 | SUBMITTED | readv | 570818560 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200752..200767 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 193 | 9290 | SUBMITTED | readv | 570556416 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200720..200735 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 194 | 9239 | SUBMITTED | readv | 570949632 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200768..200783 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 195 | 9229 | SUBMITTED | readv | 570687488 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200736..200751 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 197 | 9225 | SUBMITTED | readv | 571473920 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200832..200847 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 198 | 6372 | SUBMITTED | readv | 569638912 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200608..200623 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 200 | 6420 | SUBMITTED | readv | 571080704 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200784..200799 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 201 | 9247 | SUBMITTED | readv | 571211776 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200800..200815 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 202 | 9248 | SUBMITTED | readv | 571604992 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200848..200863 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 203 | 9221 | SUBMITTED | readv | 569769984 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200624..200639 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 207 | 9223 | SUBMITTED | readv | 569507840 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200592..200607 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 208 | 9226 | SUBMITTED | readv | 571736064 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200864..200879 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n41329 | 210 | 282085 | SUBMITTED | readv | 571342848 | 131072 | smgr | 16 | NULL | UNKNOWN | blocks 200816..200831 in file &quot;base\/16440\/16456&quot; | f | f | t\r\n(13 rows)<\/pre>\n<p>&nbsp;<\/p>\n<p>Cette vue est aliment\u00e9e via la fonction &#8216;<strong>pg_get_aios&#8221;<\/strong>.<\/p>\n<p>Nous pouvons voir l&#8217;offset de la page sur laquelle la lecture pointe ainsi que la longueur de l&#8217;op\u00e9ration IO en cours.<\/p>\n<h2>Conclusion<\/h2>\n<p>Pour profiter de l&#8217;efficacit\u00e9 des lectures asynchrones, ne pas oublier de configurer la valeur de &#8220;<strong>io_method<\/strong>&#8221; \u00e0 &#8220;<strong>worker<\/strong>&#8221; ou &#8220;<strong>io_uring\u00a0<\/strong><\/p>\n<p>A volumes \u00e9quivalents, les plans d&#8217;ex\u00e9cutions nous permettent de voir que l&#8217;on traite un nombre de &#8220;shared read&#8221; similaire entre PostgreSQL 18 qu&#8217;avec PostgreSQL 17 mais avec un temps plus faible pour PostgreSQL 18.<\/p>\n<p>Attention cependant, les gains sont effectifs sur les op\u00e9rations de type &#8220;seq scan&#8221; ou &#8220;bitmap heap scan&#8221;. Pas de gain possible sur des op\u00e9rations d&#8217;\u00e9critures.<\/p>\n<p>En d&#8217;autres termes, la configuration Asynchrones IO sera parfaitement adapt\u00e9e pour des requ\u00eates d\u00e9cisionnelles avec datawarehouse volumineux.<\/p>\n<p>Autre point \u00e0 savoir, il a \u00e9t\u00e9 relev\u00e9 \u00e9galement des risques en terme de s\u00e9curit\u00e9 avec le mode <strong>io_uring<\/strong> configur\u00e9 dans le kernel.<br \/>\nCertains sites comme <a href=\"https:\/\/www.upwind.io\/feed\/io_uring-linux-performance-boost-or-security-headache\">celui-ci<\/a> font \u00e9tats de potentiels processus de type &#8220;malwares&#8221; qui pourraient s&#8217;attaquer au kernel et mettre en p\u00e9ril la s\u00e9curit\u00e9 du serveur.<\/p>\n<p>Sur l&#8217;<a href=\"https:\/\/en.wikipedia.org\/wiki\/Io_uring\">article Wikip\u00e9dia<\/a> d\u00e9di\u00e9 \u00e0 &#8220;<strong>io_uring<\/strong>&#8220;, il est d&#8217;ailleurs not\u00e9 -&gt;<\/p>\n<p><em>&#8220;In June 2023, Google&#8217;s security team reported that 60% of the\u00a0<a title=\"Exploit (computer security)\" href=\"https:\/\/en.wikipedia.org\/wiki\/Exploit_(computer_security)\">exploits<\/a>\u00a0submitted to their\u00a0<a title=\"Bug bounty program\" href=\"https:\/\/en.wikipedia.org\/wiki\/Bug_bounty_program\">bug bounty program<\/a>\u00a0in 2022 were exploits of the Linux kernel&#8217;s io_uring vulnerabilities. As a result,\u00a0<code>io_uring<\/code>\u00a0was disabled for apps in\u00a0<a title=\"Android (operating system)\" href=\"https:\/\/en.wikipedia.org\/wiki\/Android_(operating_system)\">Android<\/a>, and disabled entirely in\u00a0<a title=\"ChromeOS\" href=\"https:\/\/en.wikipedia.org\/wiki\/ChromeOS\">ChromeOS<\/a>\u00a0as well as Google servers.<sup id=\"cite_ref-12\" class=\"reference\"><a href=\"https:\/\/en.wikipedia.org\/wiki\/Io_uring#cite_note-12\"><span class=\"cite-bracket\">[<\/span>11<span class=\"cite-bracket\">]<\/span><\/a><\/sup>\u00a0<a title=\"Docker (software)\" href=\"https:\/\/en.wikipedia.org\/wiki\/Docker_(software)\">Docker<\/a>\u00a0also consequently disabled io_uring from their default\u00a0<a title=\"Seccomp\" href=\"https:\/\/en.wikipedia.org\/wiki\/Seccomp\">seccomp<\/a> profile&#8221;<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>Bonne fin de journ\u00e9e !<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10742&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10742&#038;title=PostgreSQL%2018%20%3A%20des%20IO%20asynchrones%20performantes%20%21\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=PostgreSQL%2018%20%3A%20des%20IO%20asynchrones%20performantes%20%21&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10742\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>&nbsp; Le 25 septembre dernier, PostgreSQL sortait sa toute derni\u00e8re version, PostgreSQL 18. Cette version apporte de nombreux correctifs mais aussi des nouveaut\u00e9s et des am\u00e9liorations sur les performances globales. Une nouveaut\u00e9 est particuli\u00e8rement pertinente pour cette version. Il s&#8217;agit&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":32,"featured_media":10743,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,266],"tags":[491,181,221],"class_list":["post-10742","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-non-classe","category-postgresql","tag-async","tag-io","tag-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PostgreSQL 18 : des IO asynchrones performantes ! - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PostgreSQL 18 : des IO asynchrones performantes ! - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"&nbsp; Le 25 septembre dernier, PostgreSQL sortait sa toute derni\u00e8re version, PostgreSQL 18. Cette version apporte de nombreux correctifs mais aussi des nouveaut\u00e9s et des am\u00e9liorations sur les performances globales. Une nouveaut\u00e9 est particuli\u00e8rement pertinente pour cette version. Il s&#8217;agit&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-19T09:10:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-19T17:23:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/7346573.png\" \/>\n\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Emmanuel RAMI\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Emmanuel RAMI\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/\"},\"author\":{\"name\":\"Emmanuel RAMI\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae\"},\"headline\":\"PostgreSQL 18 : des IO asynchrones performantes !\",\"datePublished\":\"2025-11-19T09:10:27+00:00\",\"dateModified\":\"2025-11-19T17:23:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/\"},\"wordCount\":1690,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"async\",\"I\/O\",\"performance\"],\"articleSection\":{\"1\":\"PostgreSQL\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/\",\"name\":\"PostgreSQL 18 : des IO asynchrones performantes ! - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2025-11-19T09:10:27+00:00\",\"dateModified\":\"2025-11-19T17:23:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PostgreSQL 18 : des IO asynchrones performantes !\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae\",\"name\":\"Emmanuel RAMI\",\"sameAs\":[\"https:\/\/blog.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/erami\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PostgreSQL 18 : des IO asynchrones performantes ! - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/","og_locale":"fr_FR","og_type":"article","og_title":"PostgreSQL 18 : des IO asynchrones performantes ! - Capdata TECH BLOG","og_description":"&nbsp; Le 25 septembre dernier, PostgreSQL sortait sa toute derni\u00e8re version, PostgreSQL 18. Cette version apporte de nombreux correctifs mais aussi des nouveaut\u00e9s et des am\u00e9liorations sur les performances globales. Une nouveaut\u00e9 est particuli\u00e8rement pertinente pour cette version. Il s&#8217;agit&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2025-11-19T09:10:27+00:00","article_modified_time":"2025-11-19T17:23:48+00:00","og_image":[{"width":512,"height":512,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2025\/11\/7346573.png","type":"image\/png"}],"author":"Emmanuel RAMI","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Emmanuel RAMI","Dur\u00e9e de lecture estim\u00e9e":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/"},"author":{"name":"Emmanuel RAMI","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae"},"headline":"PostgreSQL 18 : des IO asynchrones performantes !","datePublished":"2025-11-19T09:10:27+00:00","dateModified":"2025-11-19T17:23:48+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/"},"wordCount":1690,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["async","I\/O","performance"],"articleSection":{"1":"PostgreSQL"},"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/","url":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/","name":"PostgreSQL 18 : des IO asynchrones performantes ! - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2025-11-19T09:10:27+00:00","dateModified":"2025-11-19T17:23:48+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/postgresql-18-des-io-asynchrones-performantes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"PostgreSQL 18 : des IO asynchrones performantes !"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/797b9b6698fa35f7ce3e9a70a8b102ae","name":"Emmanuel RAMI","sameAs":["https:\/\/blog.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/erami\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10742","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/32"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=10742"}],"version-history":[{"count":20,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10742\/revisions"}],"predecessor-version":[{"id":10768,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10742\/revisions\/10768"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/10743"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=10742"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=10742"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=10742"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}