Menu Chiudi

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]

32 commenti

  1. FabioA

    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. Metallus

    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. Artemis

    @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. Ambrogio

    OTTIMO!!!

    W INTEL!!!!

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

    ciao

  5. Anonimo

    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. riva.dani

    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. Pawz

    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. piivi

    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. piivi

    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. johnny mnemonic

    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. pierluigi

    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. johnny mnemonic

    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. davided

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

    grazie.

  14. Mario Pascucci

    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. piivi

    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. Pingback:Pollycoking « www.ubuntista.it

  17. Pingback:Intel lancia “Mobile Linux Internet Project” « pollycoke :)

  18. Pingback:  A Intel piace pingue by Ivan Prignano

Rispondi

Scopri di più da pollycoke :)

Abbonati ora per continuare a leggere e avere accesso all'archivio completo.

Continue reading

Vai alla barra degli strumenti