Intel rilascia PowerTOP per Linux

Sembra fatto apposta… dopo il post “Intel, ma allora siamo proprio amici?” adesso una segnalazione che Intel ha rilasciato PowerTOP, uno strumento pensato per capire dove, come e quanto i nostri sistemi GNU/Linux consumino più energia influendo ad esempio sulla durata della carica della batterie dei laptop (e sulla vita delle batterie stesse).

powertop.png

Ma c’è di più: alla Intel si sono spinti a determinare quali siano le cause più comuni di “spreco” e hanno stilato un elenco di applicazioni che potrebbero essere migliorate per richiedere meno risorse.

Come ciliegina sulla torta, hanno approntato apposite patch per migliorare la situazione di applicazioni quali Evolution, Gaim/Pidgin, il Kernel Linux, Firefox e altro. Le patch sono disponibili a questa pagina.

Nota: PowerTOP è codice aperto, rilasciato con licenza GPL :)

[via: OSNews]

34 pensieri su “Intel rilascia PowerTOP per Linux

  1. wow ! Il vantaggio prestazionale, il calo dei prezzi, l’apertura all’opensource, la partnership con nvidia… sembra che io debba ribaltare le mie preferenze in fatto di processori (dal p75 in poi son sempre stato amd-ista). Ora speriamo scrivano patch anche per kde :)

  2. Io ora aspetto la risposta di AMD, che spero non tardi….

    Personalmente ora installo qualche patch, che mi serviva proprio (sopratutto per firefox!) e vi faccio sapere se ci stanno cambiamenti…

  3. @FabioA: anche io sono sempre stato AMDista, da tempo immemorie… usavo già i 386 ed i 486 costruiti da AMD :)
    Il problema è che con noi linuxisti AMD non si comporta bene, e la sua nuova acquisizione, ATI, tanto peggio, mentre Intel invece è corretta.

    Io comunque sui desktop continuo a difendere l’uso di processori amd, soprattuto degli AthlonX2. Se da un lato è vero che non vanno quando un C2D Conroe di pari clock, è anche vero che costano immensamente meno, e che sono sempre dei processori molto risparmiosi di corrente e molto equilibrati.
    Sui portatili, invece, la situazione è scandalosa.
    Intel offre una piattaforma completa e supportata, mentre AMD offre un chipset ATI che funziona male (pessimo risparmio energetico, per esempio), e sui modelli più economici uno della SIS che funziona ancora paggio.
    Inoltre non si sa mai con che scheda wireless ci si trova…. le broadcom finalmente hanno driver nativi, ma che comunque non sono grandi driver, e comunque sono stati ottenuti dalla comunità.

    Devo dire che non c’è assolutamente paragone… personalmente penso che non comprerò mai un notebook amd :)

  4. OTTIMO!!!

    W INTEL!!!!

    penso che sia un azienda più che neutrale ma affezionata al free software…

    ciao

  5. Lo so, mi direte “questo vuole la pappa pronta” ma c’è una speranza che queste patch si integrino nelle versioni ufficiali dei sopracitati progetti (es. la prossima versione del kernel vanilla?)

    In secundo luogo: timeo danaos et dona ferentes. Voglio dire: siamo abituati agli scherzetti che le megamulti (una tra tutte: M$) fanno con le loro menate di brevetti e copirait, e mi chiedo: cosa vorrà in cambio Intel? Non penso sia solo magnanimità…

  6. Non sono in grado di installare quelle patch, a dire il vero non so installare nulla che non finisca in .deb… =D
    Però non usando un portatile non dovrei nemmeno averne bisogno, vero?

  7. Spero escano presto dei .deb per ubuntu per avere una semplice installazione click’n’run, almeno di powertop, che scrivono si trova già pacchettizzato per debian, gentoo e fedora

  8. Ciao a tutto, sto provando ora powertop, ho dovuto applicare una piccola modifica ai sorgenti, per riuscire a farlo funzionare su ubuntu feisty, posto powertop.c :

    /*
    * Copyright (C) 2006, Intel Corporation
    *
    * This file is part of PowerTOP
    *
    * This program file is free software; you can redistribute it and/or modify it
    * under the terms of the GNU General Public License as published by the
    * Free Software Foundation; version 2 of the License.
    *
    * This program is distributed in the hope that it will be useful, but WITHOUT
    * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
    * for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program in a file named COPYING; if not, write to the
    * Free Software Foundation, Inc.,
    * 51 Franklin Street, Fifth Floor,
    * Boston, MA 02110-1301 USA
    *
    * Authors:
    * Arjan van de Ven
    */

    #include
    #include
    #include
    #include
    #include
    #include
    #include

    uint64_t start_usage[8], start_duration[8];
    uint64_t last_usage[8], last_duration[8];

    void suggest_kernel_config(char *string, int onoff, char *comment);

    int ticktime = 5;

    int suggestioncount = 0;

    #define IRQCOUNT 100

    struct irqdata {
    int active;
    int number;
    uint64_t count;
    char description[256];
    };

    struct irqdata interrupts[IRQCOUNT];

    #define FREQ 3579.545

    int nostats;

    #define LINECOUNT 250+IRQCOUNT
    char lines[LINECOUNT][256];
    int linec[LINECOUNT];
    int linehead;
    int linectotal;

    void push_line(char *string, int count)
    {
    int i;
    for (i=0; i i)
    firstfree = i;
    }

    interrupts[firstfree].active = 1;
    interrupts[firstfree].count = count;
    interrupts[firstfree].number = irq;
    strcpy(interrupts[firstfree].description, name);
    if (strlen(name)>40)
    interrupts[firstfree].description[40]=0;
    return count;
    }

    static void do_proc_irq(void)
    {
    FILE *file;
    char line[1024];
    char *name;
    uint64_t delta;
    file = fopen(“/proc/interrupts”, “r”);
    if (!file)
    return;
    while (!feof(file)) {
    char *c;
    int nr = -1;
    uint64_t count = 0;
    memset(line,0,sizeof(line));
    fgets(line, 1024, file);
    c = strchr(line, ‘:’);
    if (!c)
    continue;
    /* deal with NMI and the like */
    nr = strtoull(line, NULL, 10);
    if (line[0]!=’ ‘ && (line[0]’9’))
    continue;
    *c=0;
    c++;
    while (c && strlen(c)) {
    char *newc;
    count += strtoull(c, &newc, 10);
    if (newc==c)
    break;
    c = newc;
    }
    c = strchr(c, ‘ ‘);
    while (c && *c==’ ‘) c++;
    c = strchr(c, ‘ ‘);
    while (c && *c==’ ‘) c++;
    name = c;
    delta = update_irq(nr, count, name);
    c = strchr(name, ‘\n’);
    if (strlen(name)>50)
    name[50]=0;
    if (c) *c=0;
    sprintf(line, ” : %s”,name);
    if (nr>0 && delta>0)
    push_line(line, delta);
    }
    fclose(file);
    }

    static void read_data(uint64_t *usage, uint64_t *duration)
    {
    DIR *dir;
    struct dirent *entry;
    FILE *file = NULL;
    char line[4096];
    char *c;
    int clevel = 0;

    memset(usage, 0, 64);
    memset(duration, 0, 64);

    dir = opendir(“/proc/acpi/processor”);
    if (!dir)
    return;
    while ((entry=readdir(dir))) {
    if (strlen(entry->d_name)d_name);
    file = fopen(line, “r”);
    if (!file)
    continue;

    clevel = 0;

    while (!feof(file)) {
    memset(line, 0, 4096);
    fgets(line, 4096, file);
    c = strstr(line, “age[“);
    if (!c)
    continue;
    c+=4;
    usage[clevel] += strtoull(c, NULL, 10);
    c = strstr(line, “ation[“);
    if (!c)
    continue;
    c+=6;
    duration[clevel] += strtoull(c, NULL, 10);

    clevel++;

    }
    fclose(file);
    }
    closedir(dir);
    }

    void stop_timerstats(void)
    {
    FILE *file;
    file = fopen(“/proc/stat”,”w”);
    if (!file) {
    nostats = 1;
    return;
    }
    fprintf(file,”0\n”);
    fclose(file);
    }
    void start_timerstats(void)
    {
    FILE *file;
    file = fopen(“/proc/stat”,”w”);
    if (!file) {
    nostats = 1;
    return;
    }
    fprintf(file,”1\n”);
    fclose(file);
    }

    void green(void)
    {
    printf(“\33[42m\33[1m”);
    }
    void yellow(void)
    {
    printf(“\33[43m\33[1m”);
    }
    void red(void)
    {
    printf(“\33[41m\33[1m”);
    }
    void normal(void)
    {
    printf(“\33[0m”);
    fflush(stdout);
    }

    void sort_lines(void)
    {
    int swaps = 1;
    while (swaps) {
    int i;
    uint64_t c;
    char line[1024];
    swaps = 0;
    for (i=0; id_name);
    file = fopen(filename, “r”);
    if (!file)
    continue;
    while (!feof(file)) {
    char line[1024];
    char *c;
    int dontcount = 0;
    fgets(line, 1024, file);
    if (strstr(line, “present:”) && strstr(line,”no”))
    break;

    if (strstr(line, “charging state:”) && !strstr(line,”discharging”))
    dontcount=1;
    if (!strstr(line,”present rate”) && !strstr(line, “remaining capacity”))
    continue;
    c = strchr(line, ‘:’);
    if (!c)
    continue;
    c++;
    if (strstr(line,”capaci”))
    cap += strtoull(c, NULL, 10);
    else if (!dontcount)
    rate += strtoull(c, NULL, 10);

    }
    fclose(file);
    }
    closedir(dir);
    if (rate>0)
    printf(“Power usage (ACPI estimate) : %5.1f W (%3.1f hours left)\n”, rate/1000.0, cap*1.0/rate);
    }

    int main(int argc, char **argv)
    {
    char line[1024];
    FILE *file = NULL;
    uint64_t cur_usage[8], cur_duration[8];
    read_data(&start_usage[0], &start_duration[0]);

    memcpy(last_usage, start_usage, sizeof(last_usage));
    memcpy(last_duration, start_duration, sizeof(last_duration));

    do_proc_irq();

    memset(cur_usage, 0, sizeof(cur_usage));
    memset(cur_duration, 0, sizeof(cur_duration));
    printf(“PowerTOP 1.0 (C) 2007 Intel Corporation \n\n”);
    if (getuid()!=0)
    printf(“PowerTOP needs to be run as root to collect enough information\n”);
    printf(“Collecting data for %i seconds \n”, ticktime);
    stop_timerstats();
    while (1) {
    double maxsleep = 0.0;
    int64_t totalticks;
    int64_t totalevents;
    int i = 0;
    double c0 = 0;
    char *c;
    do_proc_irq();
    start_timerstats();
    sleep(ticktime);
    stop_timerstats();
    read_data(&cur_usage[0], &cur_duration[0]);

    totalticks = 0;
    totalevents = 0;
    for (i=0; i\n”);
    } else {
    c0 = sysconf(_SC_NPROCESSORS_ONLN)*ticktime * 1000 * FREQ – totalticks;
    if (c0″;
    if (strcmp(process,”swapper”)==0)
    process = “”;
    c = strchr(c, ‘\n’);
    if (strncmp(func,”tick_nohz_”,10)==0)
    continue;
    if (strcmp(process,”powertop”)==0)
    continue;
    if (c) *c=0;
    cnt = strtoull(count, NULL, 10);
    sprintf(line,”%15s : %s”, process, func);
    push_line(line, cnt);
    i++;
    }
    if (file )
    pclose(file);
    printf(“\n”);
    if (!nostats && totalevents) {
    int d;
    d = totalevents * 1.0 / ticktime / sysconf(_SC_NPROCESSORS_ONLN);
    printf(“Wakeups-from-idle per second : “);
    if (d0 && counter++

  9. scusa felipe, l’ho fatto troppo lungo… cmq basta modificare le righe di codice che fanno riferimento a /proc/timer_stats con /proc/stat

  10. piivi ma fare un link ad un file da qualche parte no??

    comunque sto provando powertop, per ora mi ha dato alcuni consigli sul kernel che ho prontamente applicato, poi vedremo se porterà miglioramenti…

  11. riguardo CONFIG_TIMER_STATS:

    Documentation/hrtimer/timer_stats.txt: “It is not intended for production usage as it adds significant overhead to the (hr)timer code and the (hr)timer data structures.”

    è davvero così significativo questo overhead?
    penso che lo disabiliterò.

  12. per tutti quelli che cercano pacchetti vari…. sarò anche utente slackware, magari più avvezzo alla compilazione, ma powertop basta scompattarlo e dare un make… non ci vorrà tutta questa scienza vero?…. sperem!

  13. qualcuno sa come far partire in automatico e in maniera pulita i governor a velocità ridotta? (vorrei partissero “ondemand”)

    grazie.

  14. Attenzione che sul sito di powertop il requisito per il funzionamento è un kernel 2.6.21 o successivo.

    @piivi
    Il contenuto e lo scopo dei due file sono differenti e il file /proc/timer_stats è presente solo nei kernel 2.6.21 e successivi (fa parte di una feature per il debug nella sezione “kernel hacking” della configurazione): cambiandolo con /proc/stat, pur apparentemente funzionante, non ottieni risultati sensati.
    Riferimenti:
    Nel Changelog del kernel 2.6.21
    http://www.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.21
    basta cercare “timer_stats”, oppure per chi ha tempo e banda scaricarsi il kernel 2.6.21 e guardare in Documentation/hrtimer/hrtimer_stats.txt

  15. ah…. cmq facendo dei test i risultati hanno un senso.. forse ignora i dati di /proc/stat… quindi dici che solo col 2.6.21 funzioni bene?

  16. You can also save money by using coupons. Printable Oakley coupons for example can
    be used to buy a particular item in the actual store.
    uk Promo code to a specific print advertisement, commercial,
    radio spot, or partner website.

  17. Yeast infections affect warm, moiust areas of the body and oral Candida infections aare fairly typical.
    They do not affect the baby and they generally clear up with
    treatment. However, once you have the infection, eating yogurt of
    any kind won’t actually cure it.

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...