{"id":2507,"date":"2012-07-02T07:00:22","date_gmt":"2012-07-02T06:00:22","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=2507"},"modified":"2012-11-30T13:37:49","modified_gmt":"2012-11-30T12:37:49","slug":"la-pandaboard-au-porteau-de-torture-3-timers-linux-et-linux-rt","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2012\/07\/02\/la-pandaboard-au-porteau-de-torture-3-timers-linux-et-linux-rt\/","title":{"rendered":"La Pandaboard au porteau de torture &#8211; 3 &#8211; Timers Linux et Linux-rt"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/2012\/07\/02\/la-pandaboard-au-porteau-de-torture-3-timers-linux-et-linux-rt\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright  wp-image-2517\" title=\"La Pandaboard au poteau de torture 3\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/panda-poteau2.png\" alt=\"La Pandaboard au poteau de torture 3\" width=\"200\" height=\"145\" \/><\/a>J&rsquo;ai poursuivi les tests entam\u00e9s dans l&rsquo;<a title=\"La Pandaboard au poteau de torture \u2013 2 \u2013 Fluctuations de timers Linux\" href=\"http:\/\/www.blaess.fr\/christophe\/2012\/06\/18\/la-pandaboard-au-poteau-de-torture-2-fluctuations-de-timers-linux\/\">article pr\u00e9c\u00e9dent de cette s\u00e9rie<\/a>,\u00a0 en laissant tourner pendant de longues dur\u00e9es un programme qui v\u00e9rifie les fluctuations d&rsquo;un timer logiciel \u00e0 100 micro-secondes. Voici quelques r\u00e9sultats obtenus sur la Pandaboard avec un noyau Linux 3.4.1 en version \u00ab\u00a0vanilla\u00a0\u00bb pour commencer, puis avec l&rsquo;application d&rsquo;un patch Linux-rt par la suite.<\/p>\n<p style=\"text-align: justify;\">\n<!--more-->\n<\/p>\n<h1>Noyau Linux standard<\/h1>\n<p style=\"text-align: justify;\">Dans la premi\u00e8re s\u00e9rie d&rsquo;exp\u00e9riences, mon programme de test se trouvait parfois sur le m\u00eame c\u0153ur de processeur que les traitements d&rsquo;interruption. Ceci pouvait provoquer des retards tr\u00e8s longs (jusqu&rsquo;\u00e0 6 millisecondes) dans le d\u00e9clenchement des timers. J&rsquo;ai alors essay\u00e9 de mieux r\u00e9partir les traitements.<\/p>\n<p style=\"text-align: justify;\">Pendant plusieurs jours, j&rsquo;ai fait fonctionner le programme de test sur un c\u0153ur de CPU, apr\u00e8s avoir redirig\u00e9 le traitement des interruptions sur l&rsquo;autre c\u0153ur. Rappelons que pour transf\u00e9rer le traitement d&rsquo;une interruption (par exemple 44) sur le second c\u0153ur, il faut \u00e9crire<\/p>\n<pre>[Panda]# <strong>echo 2 &gt; \/proc\/irq\/44\/smp_affinity<\/strong>\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">La valeur \u00e9crite est un masque repr\u00e9sentant l&rsquo;ensemble des CPU sur lesquels l&rsquo;interruption peut \u00eatre trait\u00e9e. Pour rediriger toutes les interruptions vers un c\u0153ur, je fais<\/p>\n<pre>[Panda]# <strong>for i in \/proc\/irq\/[0-9]*; do echo 2 &gt; \"$i\/smp_affinity\"; done<\/strong>\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Voici quelques r\u00e9sultats obtenus en pla\u00e7ant successivement la t\u00e2che de mesure sur les c\u0153urs 0 puis 1, et les interruptions sur l&rsquo;autre c\u0153ur.<\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-5.txt.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2511\" title=\"Fluctuation d'un timer Linux - jour 5\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-5.txt-300x225.png\" alt=\"Fluctuation d'un timer Linux - jour 5\" width=\"300\" height=\"225\" \/><\/a><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-6.txt.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2512\" title=\"Fluctuation d'un timer Linux - jour 6\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-6.txt-300x225.png\" alt=\"Fluctuation d'un timer Linux - jour 6\" width=\"300\" height=\"225\" \/><\/a><\/p>\n<p><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-7.txt.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2513\" title=\"Fluctuation d'un timer Linux - jour 7\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-7.txt-300x225.png\" alt=\"Fluctuation d'un timer Linux - jour 7\" width=\"300\" height=\"225\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Puisque nos r\u00e9sultats sont d\u00e9pendants des traitements des interruptions, il est int\u00e9ressant de r\u00e9aliser les m\u00eames exp\u00e9rimentations avec le noyau Linux-rt qui am\u00e9liorer les performances temps r\u00e9el du noyau standard.<\/p>\n<h2>Noyau Linux modifi\u00e9 par le patch Linux-rt<\/h2>\n<p style=\"text-align: justify;\">J&rsquo;ai compil\u00e9 un <a title=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/v3.x\/linux-3.4.1.tar.bz2\" href=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/v3.x\/linux-3.4.1.tar.bz2\">noyau 3.4.1<\/a> apr\u00e8s avoir appliqu\u00e9 un patch <a title=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/projects\/rt\/3.4\/older\/patch-3.4.1-rt9.patch.bz2\" href=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/projects\/rt\/3.4\/older\/patch-3.4.1-rt9.patch.bz2\">Linux-rt-9<\/a> adapt\u00e9 \u00e0 ce noyau (avec ce <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-06-29\/config-linux-3.4.1-rt\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-06-29\/config-linux-3.4.1-rt\">fichier de configuration<\/a>).<\/p>\n<p style=\"text-align: justify;\">La premi\u00e8re ex\u00e9cution s&rsquo;est d\u00e9roul\u00e9e comme pr\u00e9c\u00e9demment avec les interruptions sur un coeur et la t\u00e2che de mesure sur l&rsquo;autre coeur. Les r\u00e9sultats sont comparables \u00e0 ceux du noyau standard.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-8.txt.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2514\" title=\"Fluctuations d'un timer Linux-rt - Essai 1\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-8.txt-300x225.png\" alt=\"Fluctuations d'un timer Linux-rt - Essai 1\" width=\"300\" height=\"225\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Pour v\u00e9rifier si les r\u00e9sultats sont meilleurs avec Linux-rt ou non, j&rsquo;ai \u00e0 nouveau laiss\u00e9 le programme s&rsquo;ex\u00e9cuter <strong>sur le m\u00eame c\u0153ur<\/strong> que les traitements d&rsquo;interruptions.<\/p>\n<p style=\"text-align: justify;\">L&rsquo;un des principaux int\u00e9r\u00eats du patch Linux-rt est de proposer des <em>threaded interrupts<\/em>, c&rsquo;est-\u00e0-dire d&rsquo;ordonnancer dans des threads du kernel les traitements \u00e0 r\u00e9aliser en r\u00e9ponse aux interruptions, plut\u00f4t que des les ex\u00e9cuter dans des <em>tasklets<\/em> (non ordonnanc\u00e9es, directement en sortie du handler bas-niveau) comme le fait le noyau standard. Nous pouvons profiter de ceci en fixant des priorit\u00e9s temps-r\u00e9els aux traitements qui nous int\u00e9ressent le plus.<\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai tout d&rsquo;abord voulu avoir un \u00e9tat des lieux sur les interrutions \u00ab\u00a0thread\u00e9es\u00a0\u00bb et leur priorit\u00e9. Voyons d&rsquo;abord la liste des t\u00e2ches apr\u00e8s le boot d&rsquo;un syst\u00e8me Linux-rt sur la Pandaboard.<\/p>\n<pre>[Panda]# <strong>ps<\/strong> \nPID   USER     TIME   COMMAND\n    1 root       0:01 init\n    2 root       0:00 [kthreadd]\n    3 root       0:02 [ksoftirqd\/0]\n    4 root       0:00 [kworker\/0:0]\n    5 root       0:00 [kworker\/u:0]\n    6 root       0:00 [posixcputmr\/0]\n    7 root       0:00 [migration\/0]\n    8 root       0:00 [posixcputmr\/1]\n    9 root       0:00 [migration\/1]\n   10 root       0:00 [kworker\/1:0]\n   11 root       0:01 [ksoftirqd\/1]\n   12 root       0:00 [khelper]\n   13 root       0:00 [kworker\/u:1]\n   20 root       0:00 [irq\/52-gpmc]\n   49 root       0:00 [irq\/41-l3-dbg-i]\n   50 root       0:00 [irq\/42-l3-app-i]\n   96 root       0:00 [irq\/44-DMA]\n  249 root       0:00 [sync_supers]\n  251 root       0:00 [bdi-default]\n  253 root       0:00 [kblockd]\n  266 root       0:00 [omap2_mcspi\/1]\n  268 root       0:00 [omap2_mcspi\/2]\n  270 root       0:00 [omap2_mcspi\/3]\n  272 root       0:00 [omap2_mcspi\/4]\n  282 root       0:00 [khubd]\n  288 root       0:00 [irq\/88-omap_i2c]\n  293 root       0:00 [irq\/39-TWL6030-]\n  294 root       0:00 [twl6030-irq]\n  315 root       0:00 [irq\/89-omap_i2c]\n  317 root       0:00 [irq\/93-omap_i2c]\n  320 root       0:00 [irq\/94-omap_i2c]\n  337 root       0:00 [cfg80211]\n  432 root       0:00 [kswapd0]\n  433 root       0:00 [fsnotify_mark]\n  434 root       0:00 [crypto]\n  448 root       0:00 [irq\/57-OMAP DIS]\n  451 root       0:00 [irq\/85-omapdss_]\n  452 root       0:00 [irq\/116-omapdss]\n  468 root       0:00 [OMAP UART0]\n  470 root       0:00 [OMAP UART1]\n  472 root       0:00 [OMAP UART2]\n  474 root       0:00 [OMAP UART3]\n  551 root       0:00 [irq\/109-ehci_hc]\n  557 root       0:00 [irq\/108-ohci_hc]\n  572 root       0:00 [kpsmoused]\n  575 root       0:00 [kworker\/1:1]\n  579 root       0:00 [irq\/363-rtc0]\n  598 root       0:00 [irq\/115-mmc0]\n  600 root       0:00 [irq\/91-mmc1]\n  616 root       0:00 [irq\/419-hwmod_i]\n  627 root       0:00 [deferwq]\n  633 root       0:00 [mmcqd\/0]\n  638 root       0:00 [kjournald]\n  650 root       0:00 [flush-179:0]\n  662 root       0:00 dropbear -r \/etc\/dbkey.rsa\n  [...]\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Tous les processus dont les noms sont indiqu\u00e9s entre crochets par <code>ps<\/code> sont des threads du kernel. Nous pouvons remarquer ceux qui servent \u00e0 ex\u00e9cuter les traitements en r\u00e9ception d&rsquo;interruption, dont le nom est pr\u00e9fix\u00e9 par <code>irq\/<\/code> suivi du num\u00e9ro de l&rsquo;IRQ. Pour conna\u00eetre les priorit\u00e9s temps r\u00e9el de ces threads, j&rsquo;ai \u00e9crit le petit script suivant<\/p>\n<pre><strong><a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-06-29\/liste-taches-rt\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-06-29\/liste-taches-rt\">liste-taches-rt<\/a>:<\/strong> \n#! \/bin\/sh\n\nLISTE_PID=$(ps | awk '{print $1}')\n\nfor PID in $LISTE_PID\ndo \n    chrt -p $PID 2&gt;\/dev\/null | grep 'FIFO|RR' &gt;\/dev\/null 2&gt;&amp;1\n    if [ $? -eq 0 ];  then\n\n        PRIO=$(chrt -p $PID | grep 'priority' | sed 's\/^.*priority: \/\/')\n        CMD=\"$(cat \/proc\/$PID\/comm)\"\n        printf \"%2d %6d %sn\" $PRIO $PID \"$CMD\"\n    fi\ndone | sort -r<\/pre>\n<p style=\"text-align: justify;\">Voici le r\u00e9sultat sur un noyau Linux-rt fra\u00eechement boot\u00e9<\/p>\n<pre>[Panda]# <strong>liste-taches-rt<\/strong> \n99      9 migration\/1\n99      8 posixcputmr\/1\n99      7 migration\/0\n99      6 posixcputmr\/0\n50    616 irq\/419-hwmod_i\n50    600 irq\/91-mmc1\n50    598 irq\/115-mmc0\n50    579 irq\/363-rtc0\n50    557 irq\/108-ohci_hc\n50    551 irq\/109-ehci_hc\n50    452 irq\/116-omapdss\n50    451 irq\/85-omapdss_\n50    448 irq\/57-OMAP DIS\n50    320 irq\/94-omap_i2c\n50    317 irq\/93-omap_i2c\n50    315 irq\/89-omap_i2c\n50    293 irq\/39-TWL6030-\n50    288 irq\/88-omap_i2c\n50     96 irq\/44-DMA\n50     50 irq\/42-l3-app-i\n50     49 irq\/41-l3-dbg-i\n50     20 irq\/52-gpmc\n 1     11 ksoftirqd\/1\n 1      3 ksoftirqd\/0\n[Panda]#<\/pre>\n<p style=\"text-align: justify;\">Nous remarquons que les t\u00e2ches <code>migration<\/code> et <code>posixcputmr<\/code> (un exemplaire sur chaque c\u0153ur) sont les plus prioritaires du syst\u00e8me. Ensuite se trouvent les traitements pour les interruptions mat\u00e9rielles. Enfin les t\u00e2ches <code>ksoftirq<\/code> sont les plus faibles en priorit\u00e9s temps r\u00e9el (elle sont toutefois plus prioritaires que toutes les t\u00e2ches temps partag\u00e9).<\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai choisi de lancer la t\u00e2che de mesure sur le m\u00eame CPU que les interruptions, mais \u00e0 une priorit\u00e9 (70)\u00a0 plus \u00e9lev\u00e9e que les interruptions trait\u00e9es par les drivers de p\u00e9riph\u00e9riques et inf\u00e9rieure \u00e0 celles des handlers les plus prioritaires.<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-9.txt.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2561\" title=\"Fluctuation d'un timer Linux-rt - Jour 2\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-9.txt-300x225.png\" alt=\"Fluctuation d'un timer Linux-rt - Jour 2\" width=\"300\" height=\"225\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">Afin de soumettre la carte \u00e0 une charge tr\u00e8s \u00e9lev\u00e9e en interruptions, elle \u00e9tait la cible de deux \u00ab\u00a0<em>ping<\/em>\u00a0\u00bb en mode <em>flood<\/em> suppl\u00e9mentaires par rapport aux exp\u00e9riences pr\u00e9c\u00e9dentes (donc trois <em>ping<\/em> en tout provenant de trois h\u00f4tes sur le m\u00eame r\u00e9seau).<\/p>\n<p style=\"text-align: justify;\">Nous voyons que les performances moyennes sont \u00e9quivalentes \u00e0 celles obtenues avec un noyau Linux standard dans les m\u00eames circonstances (dans l&rsquo;<a title=\"La Pandaboard au poteau de torture \u2013 2 \u2013 Fluctuations de timers Linux\" href=\"http:\/\/www.blaess.fr\/christophe\/2012\/06\/18\/la-pandaboard-au-poteau-de-torture-2-fluctuations-de-timers-linux\/\">article pr\u00e9c\u00e9dent<\/a>). Les r\u00e9sultats pour les pires fluctuations sont assez sensiblement meilleurs qu&rsquo;avec Linux vanilla.<\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai prolong\u00e9 ce test durant une\u00a0 journ\u00e9e suppl\u00e9mentaire, ce qui confirme ces r\u00e9sultats&nbsp;:<\/p>\n<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-10.txt.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2562\" title=\"Fluctuation d'un timer Linux-rt - Jour 3\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/06\/resultat-fluctuations-timer-linux-10.txt-300x225.png\" alt=\"Fluctuation d'un timer Linux-rt - Jour 3\" width=\"300\" height=\"225\" \/><\/a><\/p>\n<h1 style=\"text-align: justify;\">Conclusion<\/h1>\n<p style=\"text-align: justify;\">En utilisant sur la Pandboard le noyau Linux standard ou celui \u00ab\u00a0patch\u00e9\u00a0\u00bb Linux-rt, nous avons observ\u00e9 que les timers logiciels offraient une tr\u00e8s bonne stabilit\u00e9 <span style=\"text-decoration: underline;\">en moyenne<\/span> : sur chaque intervalle de cinq secondes, la p\u00e9riode mesur\u00e9e moyenne est entre 99 et 100 microsecondes pour une p\u00e9riode demand\u00e9e de 100 microsecondes.<\/p>\n<p style=\"text-align: justify;\">Lorsque le syst\u00e8me n&rsquo;est pas particuli\u00e8rement charg\u00e9 ou lorsque la t\u00e2che de mesure s&rsquo;ex\u00e9cute sur un coeur de processeur peu sollicit\u00e9 par les interruptions, les retards de traitement restent inf\u00e9rieurs \u00e0 la milliseconde.<\/p>\n<p style=\"text-align: justify;\">En revance, si le syst\u00e8me est tr\u00e8s charg\u00e9 &#8211; notamment en interruption &#8211; les pires retards peuvent atteindre plusieurs millisecondes (2 \u00e0 3 avec Linux-rt, plus de 6 avec Linux standard). Ceci est repr\u00e9sentatif d&rsquo;un syst\u00e8me temps r\u00e9el souple (<em>soft realtime<\/em>), et ces performances peuvent s&rsquo;av\u00e9rer insuffisantes dans certaines applications. Dans le prochain article nous allons reprendre les m\u00eames mesures sur un noyau comportant l&rsquo;extension Xenomai et v\u00e9rifier si le comportement temps r\u00e9el est vraiment am\u00e9lior\u00e9.<\/p>\n<h1 style=\"text-align: justify;\">Pour en savoir plus&#8230;<\/h1>\n<ul>\n<li>L&rsquo;archive contenant les fichiers des r\u00e9sultats que j&rsquo;ai obtenus est <a title=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-06-29\/resultats-fluctuations-Linux.tar.bz2\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-06-29\/resultats-fluctuations-Linux.tar.bz2\">disponible ici<\/a>.<\/li>\n<li>Mon nouveau livre \u00ab\u00a0<a title=\"Solutions temps r\u00e9el sous Linux\" href=\"http:\/\/www.blaess.fr\/christophe\/livres\/solutions-temps-reel-sous-linux\/\">Solutions temps r\u00e9el sous Linux<\/a>\u00ab\u00a0<\/li>\n<li>Sessions de formation \u00ab\u00a0<a title=\"Formation Temps r\u00e9el Linux et Xenomai\" href=\"http:\/\/www.logilin.fr\/Formation_Temps_Reel_Linux_Xenomai.html\" target=\"_blank\">Temps r\u00e9el Linux et Xenomai<\/a>\u00a0\u00bb que j&rsquo;anime chez <a title=\"Logilin - Ing\u00e9nierie et formations\" href=\"http:\/\/www.logilin.fr\/Prestations-ingenierie-Linux.html\" target=\"_blank\">Logilin<\/a>.<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai poursuivi les tests entam&eacute;s dans l&rsquo;article pr&eacute;c&eacute;dent de cette s&eacute;rie,&nbsp; en laissant tourner pendant de longues dur&eacute;es un programme qui v&eacute;rifie les fluctuations d&rsquo;un timer logiciel &agrave; 100 micro-secondes. Voici quelques r&eacute;sultats obtenus sur la Pandaboard avec un noyau Linux 3.4.1 en version &laquo;&nbsp;vanilla&nbsp;&raquo; pour commencer, puis avec l&rsquo;application d&rsquo;un patch Linux-rt par la [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,8,10,14],"tags":[],"class_list":["post-2507","post","type-post","status-publish","format-standard","hentry","category-embarque","category-linux-2","category-microprocesseur","category-temps-reel"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/2507","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=2507"}],"version-history":[{"count":1,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/2507\/revisions"}],"predecessor-version":[{"id":3235,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/2507\/revisions\/3235"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=2507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=2507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=2507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}