jump to navigation

Intel rilascia PowerTOP per Linux

In Ergonomia, Estetica, Guide, News il 13/05/07 @ 16:16 trackback

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]

Pagine forse correlate:


Commenti »

1. neXus ™ - 13/05/07 @ 16:22

Ok.. Intel è anvanti, è un dato di fatto.

2. FabioA - 13/05/07 @ 16:29

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 :)

3. Metallus - 13/05/07 @ 16:35

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…

4. Artemis - 13/05/07 @ 16:38

@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 :)

5. Raideiin - 13/05/07 @ 17:02

W intel!

6. paolino - 13/05/07 @ 17:17

insomma, ’sti consumi eccessivi sono causati da applicazioni gtk! lol w le qt!

(è una battuta prendetela come tale!!)

7. linuxiano - 13/05/07 @ 17:22

in archlinux ho visto che la patch per firefox è già inclusa o sbaglio ? :P

8. Ambrogio - 13/05/07 @ 17:27

OTTIMO!!!

W INTEL!!!!

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

ciao

9. Sfac - 13/05/07 @ 17:46

Pare che qualcosa si stia muovendo da parte di AMD…buone notizie per i possessori di schede ati
http://enterpriselinuxlog.blogs.techtarget.com/2007/05/09/amd-will-deliver-open-graphics-drivers/

10. Anonimo - 13/05/07 @ 17:48

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à…

11. FabioA - 13/05/07 @ 17:50

E cosa può volere, il primogenito di Linus ?

12. riva.dani - 13/05/07 @ 17:51

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?

13. Xander - 13/05/07 @ 17:53

#11 LOL XD

14. Pawz - 13/05/07 @ 18:19

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

15. piivi - 13/05/07 @ 18:30

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++

16. piivi - 13/05/07 @ 18:32

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

17. johnny mnemonic - 13/05/07 @ 18:35

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…

18. piivi - 13/05/07 @ 18:37

eh lo so ho cappellato….:)

19. mythsmith - 13/05/07 @ 18:38

su debian unstable c’è: forse potete usare quel pacchetto anche per ubuntu

20. ph1lo - 13/05/07 @ 19:17

Beh, almeno hanno capito come relazionarsi con la Comunità… dare e avere deve essere il motto!

Altro che NOvell!

21. pierluigi - 13/05/07 @ 19:46

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

22. johnny mnemonic - 13/05/07 @ 20:05

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!

23. davided - 13/05/07 @ 20:07

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

grazie.

24. Mario Pascucci - 13/05/07 @ 20:15

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

25. piivi - 13/05/07 @ 21:17

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?

26. cover - 13/05/07 @ 21:48

Dovrò provarlo… :|

27. johnny mnemonic - 13/05/07 @ 21:48

felipe hanno già aggiornato alla versione 1.1, lavori in corso!!!

28. Pollycoking « www.ubuntista.it - 14/05/07 @ 6:50

[...] 1) Intel rilascia powertop per Linux [...]

29. unwiredbrain - 14/05/07 @ 20:12

@piivi #15
La prossima volta, usa phpfi.com

30. ilPestifero - 16/05/07 @ 19:17

spettacolo.
grazie mille per la segnalazione.

31. Intel lancia “Mobile Linux Internet Project” « pollycoke :) - 17/07/07 @ 16:38

[...] accennato all’impegno di Intel nel settore Linux mobile nel post “Intel rilascia PowerTOP per Linux“, o meglio ancora in “UMPC Intel e Linux, nasce Ubuntu Mobile” (guardate il [...]

32.   A Intel piace pingue by Ivan Prignano - 18/07/07 @ 13:15

[...] risaputo che il pinguino è sempre stato oggetto d’interesse per il chipmaker, interesse che, ora più che mai, si manifesta [...]