{"id":1666,"date":"2012-02-19T20:00:26","date_gmt":"2012-02-19T19:00:26","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=1666"},"modified":"2012-02-19T20:00:26","modified_gmt":"2012-02-19T19:00:26","slug":"options-de-compilation-pour-linux-industriel","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2012\/02\/19\/options-de-compilation-pour-linux-industriel\/","title":{"rendered":"Options de compilation pour Linux industriel (1)"},"content":{"rendered":"<p style=\"text-align: justify;\"><a href=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/02\/Capture.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright  wp-image-2455\" title=\"make menuconfig\" src=\"http:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2012\/02\/Capture-150x150.png\" alt=\"make menuconfig\" width=\"150\" height=\"150\" \/><\/a><\/p>\n<p style=\"text-align: justify;\">J&rsquo;ai remarqu\u00e9 une question r\u00e9currente, tant durant mes <a title=\"Formations\" href=\"http:\/\/www.blaess.fr\/christophe\/formations\/\" target=\"_blank\">sessions de formation<\/a> sur Linux industriel qu&rsquo;au cours de <a title=\"Prestations ing\u00e9nierie Linux\" href=\"http:\/\/www.logilin.fr\/Prestations-ingenierie-Linux.html\" target=\"_blank\">prestations d&rsquo;ing\u00e9nierie<\/a> concernant des syst\u00e8mes temps-r\u00e9el ou embarqu\u00e9s&nbsp;: \u00ab\u00a0Quelles sont les options du noyau qui influent sur <em>[un sujet donn\u00e9]<\/em> ?\u00a0\u00bb Le sujet en question a g\u00e9n\u00e9ralement trait aux m\u00e9canismes d&rsquo;ordonnancement, \u00e0 la vitesse de <em>boot<\/em>, \u00e0 la taille du code produit, etc.<\/p>\n<p>\n<!--more-->\n<\/p>\n<p style=\"text-align: justify;\">Donner une r\u00e9ponse exhaustive est impossible mais au fil du temps, j&rsquo;ai constitu\u00e9 une petite liste des options les plus importantes \u00e0 v\u00e9rifier lors de la compilation du noyau, pour optimiser certains aspects. Ces param\u00e8tres sont parfois compl\u00e9mentaires parfois antagonistes. Par exemple le souci d&rsquo;\u00e9conomie \u00e9nerg\u00e9tique sur un syst\u00e8me embarqu\u00e9 autonome est aux antipodes des probl\u00e9matiques de temps de r\u00e9ponse aux interruptions en temps-r\u00e9el.<\/p>\n<p style=\"text-align: justify; padding-left: 60px;\">Bien entendu, je ne traite pas ici des options permettant au kernel de fonctionner (reconna\u00eetre les p\u00e9riph\u00e9riques pr\u00e9sents, disposer des protocoles r\u00e9seau, g\u00e9rer les types de syst\u00e8mes de fichiers n\u00e9cessaires&#8230;) Je consid\u00e8re qu&rsquo;elles sont indispensables pour que le noyau d\u00e9marre. Ce qui m&rsquo;int\u00e9resse ici, ce sont les options de compilation susceptibles d&rsquo;am\u00e9liorer le comportement dans un environnement industriel.<\/p>\n<p style=\"text-align: justify;\">Je prends comme version de r\u00e9f\u00e9rence le noyau <a title=\"Linux 3.2\" href=\"http:\/\/www.kernel.org\/pub\/linux\/kernel\/v3.x\/linux-3.2.tar.bz2\" target=\"_blank\"><code>linux-3.2.tar.bz2<\/code><\/a> et je vais passer en revue les principaux menus de configuration que l&rsquo;on peut observer avec\u00a0 \u00ab\u00a0<code>make menuconfig<\/code>\u00a0\u00bb \u00ab\u00a0<code>make xconfig<\/code>\u00a0\u00bb \u00ab\u00a0<code>make gconfig<\/code>\u00a0\u00bb etc. Les param\u00e8tres d\u00e9crits ci-dessous proviennent d&rsquo;une configuration pour processeur <em>x86<\/em>, mais je d\u00e9crirai \u00e9galement quelques options sp\u00e9cifiques \u00e0 d&rsquo;autres architectures.<\/p>\n<h1>\u00a0Menu <em>General Setup<\/em><\/h1>\n<ul>\n<li style=\"text-align: justify;\"><strong><em>Cross-compiler tool prefix<\/em><\/strong> : lors d&rsquo;une compilation crois\u00e9e (pour un autre processeur), on indiquera ici le pr\u00e9fixe n\u00e9cessaire pour trouver la <em>cross-toolchain<\/em> (que l&rsquo;on peut <a title=\"Buildroot vs Crosstool-NG \u2013 Compilons notre cross-compiler\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/05\/27\/buildroot-vs-crosstool-ng-compilons-notre-cross-compiler\/\">g\u00e9n\u00e9rer de diff\u00e9rentes mani\u00e8res<\/a>). Par exemple <code>\/opt\/cross-arm\/usr\/bin\/arm-linux-<\/code> indiquera que les appels au compilateur <code>gcc<\/code> devront se transformer en <code>\/opt\/cross-arm\/usr\/bin\/arm-linux-gcc<\/code>, et ainsi de suite pour les autres outils de compilation (<code>as<\/code>, <code>ld<\/code>, <code>ar<\/code>, etc.). Il s&rsquo;agit d&rsquo;une option que l&rsquo;on peut \u00e9galement surcharger en remplissant la variable d&rsquo;environnement <code>CROSS_COMPILE<\/code> avant d&rsquo;appeler <code>make<\/code>.<\/li>\n<li style=\"text-align: justify;\"><strong><em>Kernel compression mode<\/em><\/strong> : pour optimiser la vitesse de boot on pr\u00e9f\u00e9rera une compression <code>LZO<\/code>, pour r\u00e9duire au maximum la taille du noyau en m\u00e9moire flash (avant transfert dans la Ram) on choisira <code>LZMA<\/code>, pour avoir un \u00e9quilibre entre ces deux param\u00e8tres j&rsquo;utiliserais <code>XZ<\/code>. Sur certaines architectures, toutes les compressions ne sont pas disponibles.<\/li>\n<li style=\"text-align: justify;\"><strong><em>Support for paging of anonymous memory (swap)<\/em><\/strong> : sur la plupart des syst\u00e8mes industriels, l&rsquo;utilisation de <em>swap<\/em> (partition ou fichier sur disque dans lesquels on transf\u00e8re temporairement une partie de la m\u00e9moire Ram en cas de saturation) est proscrite. En effet le syst\u00e8me de fichiers est g\u00e9n\u00e9ralement en m\u00e9moire flash qui ne supporte pas les \u00e9critures intensives. En outre cela diminue la pr\u00e9dictibilit\u00e9 des temps d&rsquo;acc\u00e8s. Je d\u00e9sactive habituellement cette option afin de ne pas risque d&rsquo;activer malencontreusement le <em>swap<\/em> ult\u00e9rieurement.<\/li>\n<li style=\"text-align: justify;\"><strong><em>System V IPC<\/em><\/strong> et <strong><em>Posix Message Queues<\/em><\/strong> : ces m\u00e9canismes de communication entre processus (<a title=\"Efficacit\u00e9 des IPC&nbsp;: les files de messages Posix\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/09\/17\/efficacite-des-ipc-les-files-de-messages-posix\/\">files de messages<\/a>, s\u00e9maphores, <a title=\"Efficacite des IPC&nbsp;: s\u00e9maphore et m\u00e9moire partag\u00e9e\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/10\/09\/efficacite-des-ipc-semaphore-et-memoire-partagee\/\">m\u00e9moire partag\u00e9e<\/a>) sont souvent employ\u00e9s dans les syst\u00e8mes industriels, sauf si le code applicatif est constitu\u00e9 seulement de threads regroup\u00e9 dans un unique processus. G\u00e9n\u00e9ralement j&rsquo;active ces deux options.<\/li>\n<li style=\"text-align: justify;\"><strong><em>BSD Process accounting<\/em><\/strong>, <strong><em>Export task\/process statistics<\/em><\/strong>, et <strong><em>Auditing Support<\/em><\/strong> : si ces options d&rsquo;instrumentation peuvent \u00eatre utiles pendant la phase de mise au point du code, elles n&rsquo;ont plus lieu d&rsquo;\u00eatre activ\u00e9es sur un syst\u00e8me en production. Je conseille de les d\u00e9sactiver (ce qui peut n\u00e9cessiter d&rsquo;intervenir dans les menus <strong><em>Security options<\/em><\/strong> et <strong><em>Virtualization<\/em><\/strong> que nous verrons dans d&rsquo;autres articles).<\/li>\n<li style=\"text-align: justify;\">Sous-menu <strong><em>RCU Subsystem<\/em><\/strong> : L&rsquo;option <strong><em>Enable RCU priority boosting<\/em><\/strong> permet de limiter les inversions de priorit\u00e9 li\u00e9es aux m\u00e9canismes de synchronisation <em>Read-Copy-Update<\/em>. Ceci peut \u00eatre utile &#8211; bien que d&rsquo;un effet limit\u00e9 &#8211; dans un syst\u00e8me temps-r\u00e9el \u00e0 condition de mettre une valeur \u00e9lev\u00e9e (<code>99<\/code> par exemple) pour <strong><em>Real-time priority to boost RCU readers to<\/em><\/strong>.<\/li>\n<li style=\"text-align: justify;\"><strong><em>Kernel .config support<\/em><\/strong> et <strong><em>Enable access to .config through \/proc\/config.gz<\/em><\/strong> : ces deux options sont \u00e0 mon avis tr\u00e8s utiles. Elles permettent d&#8217;embarquer dans l&rsquo;image du noyau compil\u00e9 sa propre configuration (r\u00e9alis\u00e9e avec <code>make menuconfig<\/code>). La mise au point d&rsquo;un syst\u00e8me embarqu\u00e9 ou temps-r\u00e9el peut n\u00e9cessiter des dizaines de compilations et tests successifs en modifiant peu \u00e0 peu les options d\u00e9crites ici. Il n&rsquo;est pas simple de garder une trace exacte de toutes les modifications apport\u00e9es et la discipline n\u00e9cessaire pour sauvegarder et documenter chaque fois le fichier <code>.config<\/code> vient souvent \u00e0 manquer apr\u00e8s des heures de frustrations et d&rsquo;\u00e9checs successifs. Le fait que chaque noyau compil\u00e9 puisse restituer sa propre configuration nous \u00e9vite de g\u00e9rer les versions et permet facilement de comparer les options utilis\u00e9es.<\/li>\n<li style=\"text-align: justify;\">Sous-menu <strong><em>Control Group support<\/em><\/strong> : la plupart des options de ce sous-menu peuvent \u00eatre utiles pour g\u00e9rer finement l&rsquo;ordonnancement des t\u00e2ches et la r\u00e9partition des ressources (CPU, m\u00e9moire, entr\u00e9es-sorties du sous-syst\u00e8me <em>Block<\/em>, etc.). Ces param\u00e8tres peuvent servir \u00e0 g\u00e9rer des t\u00e2ches en temps-partag\u00e9 mais \u00e9galement en temps-r\u00e9el (notamment <strong><em>Group CPU scheduler<\/em><\/strong> &#8211;&gt; <strong><em>Group scheduling for SCHED_RR\/FIFO<\/em><\/strong>).<\/li>\n<li style=\"text-align: justify;\">J&rsquo;ai \u00e9voqu\u00e9 l&rsquo;option <strong><em>Automatic process group scheduling<\/em><\/strong> dans <a title=\"[ACTU] Groupement automatique des processus\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/04\/01\/groupement-automatique-des-processus\/\">un article pr\u00e9c\u00e9dent<\/a>. Elle active le regroupement automatique des processus rattach\u00e9s au m\u00eame terminal pour leur donner une part de CPU \u00e9quivalente aux autres groupes en ordonnancement temps-partag\u00e9.<\/li>\n<li style=\"text-align: justify;\">Sur de nombreux syst\u00e8mes embarqu\u00e9s l&rsquo;option <strong><em>Initial RAM filesystem and RAM disk<\/em><\/strong> sera n\u00e9cessaire car elle permettra de d\u00e9marrer avec un syst\u00e8me de fichiers mont\u00e9 en m\u00e9moire Ram (quitte \u00e0 acc\u00e9der ensuite \u00e0 des partitions diff\u00e9rentes sur m\u00e9moire flash). On choisira en principe le m\u00eame type de compression (<code>LZMA<\/code>, <code>XZ<\/code>, <code>LZO<\/code>&#8230;) que celui de l&rsquo;option <em>Kernel compression mode<\/em> vue plus haut, en pr\u00e9f\u00e9rant un volume r\u00e9duit ou une d\u00e9compression plus rapide suivant les cas.<\/li>\n<li style=\"text-align: justify;\">L&rsquo;option <strong><em>Optimize for size<\/em><\/strong> sera activ\u00e9e sur les syst\u00e8mes embarqu\u00e9s pour demander au compilateur de r\u00e9duire la taille de l&rsquo;image du noyau&nbsp;; de m\u00eame on d\u00e9sactivera <strong><em>Enable full-sized data structures for core<\/em><\/strong> qui se trouve un peu plus bas<\/li>\n<li style=\"text-align: justify;\">Le sous-menu <strong><em>Configure standard kernel features (expert users)<\/em><\/strong> n&rsquo;est parfois accessible que si l&rsquo;option <strong><em>Embedded System<\/em><\/strong> (plus bas) est activ\u00e9e &#8211; ce qu&rsquo;il faut faire. On peut d\u00e9sactiver toutes les options du sous-menu sur la plupart des syst\u00e8mes embarqu\u00e9s. Le noyau deviendra totalement silencieux (pas de messages de trace avec <code>printk()<\/code>, pas d&rsquo;avertissement avec <code>WARN()<\/code>, pas d&rsquo;indication d&rsquo;erreur interne avec <code>BUG()<\/code>) et ne nous fournira plus d&rsquo;\u00e9l\u00e9ments de diagnostic. En revanche sa taille sera r\u00e9duite et le <em>boot<\/em> sensiblement plus rapide.<\/li>\n<li style=\"text-align: justify;\">J&rsquo;active syst\u00e9matiquement <strong><em>Enable futex support<\/em><\/strong> pour b\u00e9n\u00e9ficier des mutex rapides (verrouillage sans passage par le noyau s&rsquo;il n&rsquo;y a pas de contention, pour plus de d\u00e9tails voir cet <a title=\"Prises de mutex et priorit\u00e9s\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/10\/22\/prises-de-mutex-et-priorites\/\">article pr\u00e9c\u00e9dent<\/a>).<\/li>\n<li style=\"text-align: justify;\">Toutes les options <strong><em>Profiling support<\/em><\/strong>, <strong><em>Kprobes<\/em><\/strong>, <strong><em>Optimize trace point call sites<\/em><\/strong>, et<strong><em> GCOV-based kernel profiling<\/em><\/strong> devront \u00eatre d\u00e9sactiv\u00e9es sur le noyau final. Elles peuvent \u00eatre tr\u00e9s utiles durant la mise au point du syst\u00e8me, mais ne feraient que charger inutilement l&rsquo;image cible.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Les options qui n&rsquo;ont pas \u00e9t\u00e9 mentionn\u00e9es seront activ\u00e9es ou non en fonction de l&rsquo;utilisation de votre syst\u00e8me. Si l&rsquo;appel-syst\u00e8me <code>signalfd()<\/code> par exemple n&rsquo;est jamais employ\u00e9, l&rsquo;option <strong><em>Enable signalfd() system call<\/em><\/strong> n&rsquo;a pas vraiment d&rsquo;int\u00e9r\u00eat. N\u00e9anmoins on ne gagnera pas grand-chose \u00e0 la d\u00e9sactiver.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: justify;\">Voici un premier tableau r\u00e9capitulatif des options \u00e0 activer (Y) ou d\u00e9sactiver (N) en fonction des optimisations recherch\u00e9es. Les options non mentionn\u00e9es ici n&rsquo;ont pas d&rsquo;influence directe sur les aspects embarqu\u00e9s (taille m\u00e9moire et vitesse de boot) ou les performances temps-r\u00e9el.<\/p>\n<table border=\"1\" cellspacing=\"2\" cellpadding=\"3\">\n<tbody>\n<tr align=\"center\">\n<td><strong>Option<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Optimisation<br \/>\npour<br \/>\nembarqu\u00e9<\/strong><\/td>\n<td style=\"text-align: center;\"><strong>Optimisation<br \/>\npour<br \/>\ntemps-r\u00e9el<\/strong><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Kernel compression mode<\/td>\n<td>LZMA \/ LZO<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Support for paging of anonymous memory<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>BSD Process accounting<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Open by fhandle syscalls<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Export statistics through netlink<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Auditing support<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>RCU Subsystem -&gt; Enable tracing for RCU<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>RCU Subsystem -&gt; Enable RCU priority boosting<\/td>\n<td><\/td>\n<td>Y<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Kernel .config support<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Enable access to .config through \/proc\/config.gz<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Control Group Support -&gt; Example debug cgroup&#8230;<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Control Group Support -&gt; Freezer cgroup subsystem<\/td>\n<td><\/td>\n<td>Y<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Control Group Support -&gt; Device controller&#8230;<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Control Group Support -&gt; Cpuset support<\/td>\n<td><\/td>\n<td>Y<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Control Group Support -&gt; Group CPU -&gt; &#8230;SCHED_RR\/FIFO<\/td>\n<td><\/td>\n<td>Y<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Control Group Support -&gt; Block IO controller<\/td>\n<td>Y<\/td>\n<td>Y<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Control Group Support -&gt; Enable Block IO controller debugging<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Namespace support<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Automatic process group scheduling<\/td>\n<td><\/td>\n<td>Y<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Initial RAM filesystem and RAM disk<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Support initial RAM disk cmopressed using LZMA<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Support initial RAM disk cmopressed using XZ<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Support initial RAM disk cmopressed using LZO<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Optimize for size<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Configure standard kernel features -&gt; Enable 16-bit UID&#8230;<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Configure standard kernel features -&gt; Sysctl syscall support<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Configure standard kernel features -&gt; Enable support for printk<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Configure standard kernel features -&gt; BUG() support<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Configure standard kernel features -&gt; Enable Elf core dumps<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Enable full-sized data structures for core<\/td>\n<td>N<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Enable futex support<\/td>\n<td><\/td>\n<td>Y<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Enable AIO support<\/td>\n<td><\/td>\n<td>Y<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Embedded system<\/td>\n<td>Y<\/td>\n<td><\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Kernel performance&#8230; -&gt; Kernel performance counters<\/td>\n<td><\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Kernel performance&#8230; -&gt; Debug; use vmalloc to&#8230;<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Enable VM event counters for \/proc\/vmstat<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Profiling support<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Kprobes<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>Optimize trace point call sites<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<tr align=\"center\">\n<td>GCOV-based kernel profiling -&gt; Enable gcov-based &#8230;<\/td>\n<td>N<\/td>\n<td>N<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p style=\"text-align: justify;\">Nous examinerons les options d&rsquo;un autre menu dans <a title=\"Options de compilation pour Linux industriel (2)\" href=\"http:\/\/www.blaess.fr\/christophe\/2012\/02\/26\/options-de-compilation-pour-linux-industriel-2\/\">le prochain article<\/a>&#8230;<\/p>\n<p style=\"text-align: center;\">Tous les commentaires, rermarques, corrections, sont les bienvenus&#8230;<\/p>","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai remarqu&eacute; une question r&eacute;currente, tant durant mes sessions de formation sur Linux industriel qu&rsquo;au cours de prestations d&rsquo;ing&eacute;nierie concernant des syst&egrave;mes temps-r&eacute;el ou embarqu&eacute;s&nbsp;: &laquo;&nbsp;Quelles sont les options du noyau qui influent sur [un sujet donn&eacute;] ?&nbsp;&raquo; Le sujet en question a g&eacute;n&eacute;ralement trait aux m&eacute;canismes d&rsquo;ordonnancement, &agrave; la vitesse de boot, &agrave; 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,6,8,14],"tags":[],"class_list":["post-1666","post","type-post","status-publish","format-standard","hentry","category-embarque","category-formations","category-linux-2","category-temps-reel"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/1666","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=1666"}],"version-history":[{"count":0,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/1666\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=1666"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=1666"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=1666"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}