{"id":2041,"date":"2012-04-30T09:00:47","date_gmt":"2012-04-30T08:00:47","guid":{"rendered":"http:\/\/www.blaess.fr\/christophe\/?p=2041"},"modified":"2012-04-30T09:00:47","modified_gmt":"2012-04-30T08:00:47","slug":"modifier-facilement-la-frequence-processeur","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2012\/04\/30\/modifier-facilement-la-frequence-processeur\/","title":{"rendered":"Modifier facilement la fr\u00e9quence processeur"},"content":{"rendered":"<p style=\"text-align: justify;\">Linux offre une possibilit\u00e9 int\u00e9ressante&nbsp;: celle de configurer assez finement la vitesse du processeur depuis la ligne de commande. Il permet d&rsquo;agir ind\u00e9pendamment (pour autant que l&rsquo;architecture mat\u00e9rielle le permette) sur les diff\u00e9rents coeurs des processeurs. On m&rsquo;a demand\u00e9 r\u00e9cemment une petite illustration pratique de ces possibilit\u00e9s&nbsp;: en voici un r\u00e9sum\u00e9.<\/p>\n<p>\n<!--more-->\n<\/p>\n<h1>Configurer la vitesse CPU avec <code>\/sys<\/code><\/h1>\n<p style=\"text-align: justify;\">La premi\u00e8re op\u00e9ration n\u00e9cessaire est de conna\u00eetre la liste des fr\u00e9quences support\u00e9es par un CPU. Cette liste est accessible gr\u00e2ce au pseudo syst\u00e8me de fichier <code>\/sys<\/code>.<\/p>\n<pre># <strong>ls \/sys\/devices\/system\/cpu\/<\/strong>\ncpu0  cpu1  cpu2  cpu3  cpufreq  cpuidle  kernel_max  offline  online  possible  present  probe  release  sched_mc_power_savings\n# <strong>cat \/sys\/devices\/system\/cpu\/online <\/strong>\n0-3\n# <strong>cat \/sys\/devices\/system\/cpu\/possible <\/strong>\n0-7\n# <strong>cat \/sys\/devices\/system\/cpu\/present <\/strong>\n0-3\n#<\/pre>\n<p style=\"text-align: justify;\">Ici, le noyau peut g\u00e9rer sept CPU (param\u00e8tre <code>possible<\/code>), mais il n&rsquo;y en a que quatre connect\u00e9s (<code>present<\/code>). Ils sont tous actifs (<code>online<\/code>). Choisissons, arbitrairement, le CPU num\u00e9ro 1 et v\u00e9rifions ses fr\u00e9quences de fonctionnement.<\/p>\n<pre># <strong>ls \/sys\/devices\/system\/cpu\/cpu1\/<\/strong>\ncache  cpufreq  crash_notes  online  thermal_throttle  topology\n# <strong>ls \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/<\/strong>\naffected_cpus               related_cpus                   scaling_max_freq\nbios_limit                  scaling_available_frequencies  scaling_min_freq\ncpuinfo_cur_freq            scaling_available_governors    scaling_setspeed\ncpuinfo_max_freq            scaling_cur_freq               stats\ncpuinfo_min_freq            scaling_driver\ncpuinfo_transition_latency  scaling_governor\n# <strong>cat \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_available_frequencies <\/strong>\n2400000 2133000 1867000 1600000\n# <strong>cat \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_cur_freq <\/strong>\n2400000\n#<\/pre>\n<p style=\"text-align: justify;\">Le CPU accepte quatre fr\u00e9quences, il est actuellement configur\u00e9 avec la plus rapide&nbsp;: 2,4GHz. On peut la modifier ainsi.<\/p>\n<pre># <strong>echo userspace &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_governor <\/strong>\n# <strong>echo 1867000 &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_setspeed <\/strong>\n# <strong>cat \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_cur_freq <\/strong>\n1867000\n#<\/pre>\n<h1>Mesurer les effets de la vitesse CPU<\/h1>\n<p style=\"text-align: justify;\">Nous expliquerons la premi\u00e8re ligne de l&rsquo;exemple ci-dessus dans le prochain paragraphe.<br \/>\nPour voir les effets de la configuration pr\u00e9c\u00e9dente, on peut utiliser <a title=\"compte-iterations.c\" href=\"http:\/\/www.blaess.fr\/christophe\/files\/article-2012-04-30\/compte-iterations.c\">un petit programme<\/a> qui incr\u00e9mente un compteur pendant une dur\u00e9e donn\u00e9e (cinq secondes ici).<\/p>\n<pre><strong>compte-iterations.c :<\/strong>\n#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;sys\/time.h&gt;\n\nint main(void)\n{\n\tstruct timeval tv;\n\tstruct timeval tv_debut;\n\tlong long int compteur;\n\n\t\/\/ Attendre le debut d'une nouvelle seconde\n\tgettimeofday(&amp; tv_debut, NULL);\n\tdo {\n\t\tgettimeofday(&amp; tv, NULL);\n\t} while (tv.tv_sec == tv_debut.tv_sec);\n\n\t\/\/ Compter pendant cinq secondes\n\tcompteur = 0;\n\ttv_debut = tv;\n\tdo {\n\t\tcompteur ++;\n\t\tgettimeofday(&amp; tv, NULL);\n\t} while (tv.tv_sec &lt; (tv_debut.tv_sec + 5));\n\n\tprintf(\"Resultats : %lldn\", compteur);\n\treturn EXIT_SUCCESS;\n}<\/pre>\n<p style=\"text-align: justify;\">Essayons de l&rsquo;ex\u00e9cuter avec diff\u00e9rentes fr\u00e9quences.<\/p>\n<pre># <strong>echo 1600000 &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_setspeed <\/strong>\n# <strong>taskset -pc 1 $$<\/strong>\npid 9778's current affinity list: 0-3\npid 9778's new affinity list: 1\n# <strong>.\/compte-iterations <\/strong>\nResultats : 17263876\n# <strong>.\/compte-iterations <\/strong>\nResultats : 16733090\n# <strong>.\/compte-iterations <\/strong>\nResultats : 16810727\n# <strong>echo 1867000 &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_setspeed <\/strong>\n# <strong>.\/compte-iterations <\/strong>\nResultats : 19926359\n# <strong>.\/compte-iterations <\/strong>\nResultats : 19868890\n# <strong>.\/compte-iterations <\/strong>\nResultats : 19681040\n# <strong>echo 2133000 &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_setspeed <\/strong>\n# <strong>.\/compte-iterations <\/strong>\nResultats : 22517877\n# <strong>.\/compte-iterations <\/strong>\nResultats : 23028619\n# <strong>.\/compte-iterations <\/strong>\nResultats : 22310298\n# <strong>echo 2400000 &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_setspeed <\/strong>\n# <strong>.\/compte-iterations <\/strong>\nResultats : 25317042\n# <strong>.\/compte-iterations <\/strong>\nResultats : 25806554\n# <strong>.\/compte-iterations <\/strong>\nResultats : 25916774\n#<\/pre>\n<p style=\"text-align: justify;\">Nous voyons bien que le nombre d&rsquo;it\u00e9rations fluctue en fonction de la fr\u00e9quence configur\u00e9e.<\/p>\n<h1>Configurer le comportement du CPU<\/h1>\n<p style=\"text-align: justify;\">Plut\u00f4t qu&rsquo;agir directement sur la fr\u00e9quence, ce qui n\u00e9cessite de lire la valeur et d&rsquo;inscrire celle choisie, le noyau nous propose des comportements, des heuristiques, qu&rsquo;il nomme <em>governors<\/em>, qui vont assurer la modification de la fr\u00e9quence CPU afin de l&rsquo;ajuster aux besoins de l&rsquo;utilisateur.<br \/>\nOn trouvera des explications plus d\u00e9taill\u00e9es sur les <strong>governors<\/strong> dans <a title=\"Temps-r\u00e9el et \u00e9conomie d\u2019\u00e9nergie (1)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/03\/04\/temps-reel-et-economie-d-energie-1\/\">cet article<\/a>. Il existe (suivant la configuration du noyau \u00e0 la compilation) jusqu&rsquo;\u00e0 cinq <em>governors<\/em>, dont les noms sont visibles ainsi.<\/p>\n<pre># <strong>cat \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_available_governors <\/strong>\nconservative ondemand userspace powersave performance\n#<\/pre>\n<p style=\"text-align: justify;\">Leurs comportements&nbsp;:<\/p>\n<ul>\n<li style=\"text-align: justify;\"><em>powersave<\/em> : \u00e9conomiser la batterie (d&rsquo;un ordinateur portable) en utilisant la fr\u00e9quence la plus faible possible.<\/li>\n<li style=\"text-align: justify;\"><em>performance<\/em> : optimiser la vitesse de traitement en adoptant la fr\u00e9quence disponible la plus \u00e9lev\u00e9e.<\/li>\n<li style=\"text-align: justify;\"><em>ondemand<\/em> : faire varier la fr\u00e9quence en fonction de la charge syst\u00e8me afin d&rsquo;optimiser la vitesse de traitement lorsqu&rsquo;il y a une forte demande, tout en \u00e9conomisant la batterie lorsqu&rsquo;il y a peu de t\u00e2ches en cours.<\/li>\n<li style=\"text-align: justify;\"><em>conservative<\/em> : adopter le m\u00eame comportement que <em>ondemand<\/em>, en \u00e9vitant les modifications trop fr\u00e9quentes de la vitesse du CPU.<\/li>\n<li style=\"text-align: justify;\"><em>userspace<\/em> : laisser l&rsquo;utilisateur fixer lui-m\u00eame la vitesse qui lui convient, comme nous l&rsquo;avons fait dans les paragraphes pr\u00e9c\u00e9dents.<\/li>\n<\/ul>\n<p style=\"text-align: justify;\">Essayons les effets des principaux <em>governors<\/em> sur notre programme.<\/p>\n<pre># <strong>echo performance &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_governor <\/strong>\n# <strong>cat \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_cur_freq <\/strong>\n2400000\n# <strong>.\/compte-iterations <\/strong>\nResultats : 25932762\n# <strong>.\/compte-iterations <\/strong>\nResultats : 25937413\n# <strong>.\/compte-iterations <\/strong>\nResultats : 25335626\n# <strong>echo powersave &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_governor <\/strong>\n# <strong>cat \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_cur_freq<\/strong>\n1600000\n# <strong>.\/compte-iterations <\/strong>\nResultats : 17625101\n# <strong>.\/compte-iterations <\/strong>\nResultats : 16788736\n# <strong>.\/compte-iterations <\/strong>\nResultats : 17017337\n# <strong>echo ondemand &gt; \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_governor <\/strong>\n# <strong>cat \/sys\/devices\/system\/cpu\/cpu1\/cpufreq\/scaling_cur_freq<\/strong>\n1600000\n# <strong>.\/compte-iterations <\/strong>\nResultats : 25371803\n# <strong>.\/compte-iterations <\/strong>\nResultats : 25294453\n#<strong> .\/compte-iterations <\/strong>\nResultats : 25920801\n#<\/pre>\n<h1>Conclusion<\/h1>\n<p style=\"text-align: justify;\">Il est int\u00e9ressant de pouvoir configurer facilement la vitesse du processeur ind\u00e9pendamment des fr\u00e9quences exactes, en employant par exemple une heuristique <em>powersave<\/em> sur un portable, <em>performance<\/em> sur un serveur, ou <em>ondemand<\/em> sur un poste de travail g\u00e9n\u00e9raliste.<\/p>\n<p style=\"text-align: justify;\">Pour les syst\u00e8mes embarqu\u00e9s, les choix ne sont pas toujours \u00e9vidents, comme on peut le voir dans ces articles&nbsp;: <a title=\"Temps-r\u00e9el et \u00e9conomie d\u2019\u00e9nergie (1)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/03\/04\/temps-reel-et-economie-d-energie-1\/\" target=\"_blank\">Temps r\u00e9el et \u00e9conomie d&rsquo;\u00e9nergie 1<\/a> et <a title=\"Temps-r\u00e9el et \u00e9conomie d\u2019\u00e9nergie (2)\" href=\"http:\/\/www.blaess.fr\/christophe\/2011\/03\/11\/temps-reel-et-economie-denergie-2\/\" target=\"_blank\">2<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Linux offre une possibilit&eacute; int&eacute;ressante&nbsp;: celle de configurer assez finement la vitesse du processeur depuis la ligne de commande. Il permet d&rsquo;agir ind&eacute;pendamment (pour autant que l&rsquo;architecture mat&eacute;rielle le permette) sur les diff&eacute;rents coeurs des processeurs. On m&rsquo;a demand&eacute; r&eacute;cemment une petite illustration pratique de ces possibilit&eacute;s&nbsp;: en voici un r&eacute;sum&eacute;.<\/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-2041","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\/2041","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=2041"}],"version-history":[{"count":0,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/2041\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=2041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=2041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=2041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}