RSS

Menghemat Daya Prosesor dengan Undervolting (Windows dan GNU/Linux)

20 Agu

Kalau Anda pengguna laptop/notebook tentu Anda sangat memperhatikan supaya baterai laptop Anda awet dan tidak mudah drop. Salah satu penyebab baterai drop adalah pemakaian daya yang besar misalnya maen game, rendering dan pekerjaan-pekerjaan lain yang menyebabkan siklus pengisian baterai bisa beberapa kali dalam satu hari.

Artikel ini akan membahas trik untuk menghemat konsumsi daya prosesor laptop Anda. Menurunkan frekuensi prosesor adalah cara yang umum untuk menghemat daya dan dengan perilaku ondemand frekuensi maka besarnya frekuensi akan disesuaikan dengan beban kerja prosesor jadi ketika sedang tidak banyak melakukan pekerjaan laptop Anda akan menghemat daya yang lumayan. Nah masih ada satu cara lagi untuk melakukan efisiensi penggunaan daya, yaitu undervolting, sebuah metode menurunkan tegangan kerja prosesor sehingga untuk melakukan tugas yang sama akan diperlukan daya yang lebih kecil. Daya (P) biasanya dihubungkan oleh tegangan (V) dan arus (I). Jadi kalo ingin menghemat daya bisa dilakukan dengan menurunkan penggunaan arus maupun tegangan. Arus jauh lebih sulit diatur sebab melibatkan arsitektur internal prosesor sedangkan tegangan bisa diatur dari luar terutama karena fitur-fitur penghemat daya yang menurunkan frekuensi juga menurunkan tegangan dan ternyata penurunan tegangan ini masih bisa diatur oleh pengguna supaya lebih rendah daripada spesifikasi pembuat prosesor tanpa ada (minim) efek samping yang berarti.

Misal core 2 duo T5550 dengan frekuensi minimal 1 GHz seharusnya berjalan pada 0,981 volt namun ambang ini bisa diturunkan ke ambang paling bawah, yaitu 0,738 volt dengan kinerja dan kestabilan yang sama. Dan titik-titik settingan yang lain bisa juga diatur.

Update:T5550 spt semua core 2 duo non ULV minimal voltage 0,950 volt menurut CPUZ, VID 19 pada GNU/Linux. Penghematan daya nampak jelas jika full load, dengan 0,950 frekuensi T5550 bisa disetel berapapun, 1GHz-1,8GHz, suhu fullload juga turun, dari 80’C menjadi 56’C

Di sini saya menggunakan distro Ubuntu Lucid Lynx. Karena kernel GNU/Linux adalah kernel monolitik maka setiap dukungan fitur perangkat keras harus disediakan oleh kernel dan tidak bisa ditambahin dari luar kernel, sekalipun untuk menjalankan fitur tersebut diperlukan modul-modul tambahan. Dan kernel generik bawaan distro tidak memiliki fitur ini, sebab untuk memiliki fitur ini kernel harus dikompilasi dengan setting sebagai berikut:

CONFIG_CPU_FREQ_STAT=m
CONFIG_X86_ACPI_CPUFREQ=m
CONFIG_X86_POWERNOW_K8=m
CONFIG_X86_SPEEDSTEP_CENTRINO=m
CONFIG_X86_P4_CLOCKMOD=m

Kalau Anda punya niat, waktu dan kemampuan untuk mengkompilasi kernel sendiri (http://danangdk.blog.uns.ac.id/2011/06/24/tutorial-kompilasi-kernel-linux/) silakan membuat racikan kernel PHC sendiri namun jika Anda ingin lebih mudah, Anda bisa menggunakan paket pre-kompilasi yang sudah ada dalam PPA (Personal Package Archive) yang disediakan oleh David Gnedt dengan cara sebagai berikut:

1. Tambahkan lumbung perangkat lunak PHC dengan mengetikkan perintah berikut di terminal:

$ sudo add-apt-repository ppa:linux-phc/ppa

lalu lakukan pemutakhiran:

$ sudo apt-get update

2. Lakukan instalasi kernel PHC dengan perintah ini, atau bila menggunakan synaptic Anda bisa memilih kernel2 PHC yang lain :

$ sudo apt-get install linux-generic-phc linux-headers-generic-phc

3. Lakukan reboot lalu cek kernel apa yang dipakai:

$ uname -r

pada laptop saya akan menghasilkan:

2.6.32-33-generic-pae-phc

atau juga bisa menggunakan GNOME System Monitor

phc_gsm

Nah, sekarang kernel telah mendukung PHC, Processor Hardware Control.

Kalau bukan kernel PHC yang dipakai kemungkinan pemuat boot perlu diset (LILO, GRUB, GRUB2 , BURG)

untuk GRUB, silakan perintahkan:

$sudo update-grub

lalu jika ingin kernel ini Anda pakai terus silakan ubah file konfigurasi GRUB:

$sudo gedit /etc/default/grub

ubah “GRUB_DEFAULT=0” ke nilai kernel yang ada nama PHC di bagian bawah.

Langkah selanjutnya adalah memasang modul-modul PHC,

4. Unduh berkas sumber dari tautan berikut:
http://www.linux-phc.org/forum/viewtopic.php?f=13&t=2
Unduh sesuai kernel distro yang Anda pakai sebelumnya supaya tidak ada masalah kompabilitas dengan perangkat lunak lain yang sudah dipasang.

5. Buka berkas kompresi tersebut dan dari folder tersebut bukalah dengan terminal:

$ make prepare
$ make
$ sudo make install

jika sudah selesai, periksalah jika modul sudah terpasang:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/phc_default_vids
kalau punya saya: 43 29 19, yang berarti
Frekuensi 1,8 GHz 43 => 1,250 volt,
Frekuensi 1,33 GHz 29 => 1,058 volt,
Frekuensi 1 GHz 19 => 930,2 volt.

6. Lakukan pemeriksaan sampai batas berapa voltase bisa diturunkan:
Pakailah script berikut: http://openmindedbrain.info/wp-content/uploads/2010/05/intel-phc-undervolt.bash

#!/bin/bash
# Script downloaded from http://www.openmindedbrain.info
#
# http://www.linux-phc.org/

# #
# Below just some useful functions #
# #

# Text Colors:
esc=”33[”
tc000=”${esc}30m”
tcf00=”${esc}31m”
tc0f0=”${esc}32m”
tcff0=”${esc}33m”
tc00f=”${esc}34m”
tcf0f=”${esc}35m”
tc0ff=”${esc}36m”
tcfff=”${esc}37m”
tcRst=”${esc}0m”
# Background Colors:
bc000=”${esc}40m”
bcf00=”${esc}41m”
bc0f0=”${esc}42m”
bcff0=”${esc}43m”
bc00f=”${esc}44m”
bcf0f=”${esc}45m”
bc0ff=”${esc}46m”
bcfff=”${esc}47m”

check () {
s=$?
if [ “$s” = “0” ]; then
printf “$tc0f0> Success!$tcRst\n”
else
printf “$tcf00> PhaiL!!!$tcRst\n$tcff0> Smash your head on keyboard to continue.$tcRst\n”
read -n 1 -s > /dev/null
fi
return $s
}

silent_check () {
s=$?
return $s
}

confirm () {
loop=1
while [ “$loop” = “1” ]; do
printf “Do you want to continue? [Y/n/?] ”
read -n 1 -s answer
case “$answer” in
“Y” | “y” | “” )
printf “${tc0f0}Yes$tcRst\n”
loop=0
return 0
;;
“?” )
printf “${tc00f}?$tcRst\nIt’s really just a ${tc0f0}Yes$tcRst or ${tcf00}No$tcRst >:-[\n”
;;
“N” | “n” )
printf “${tcf00}No$tcRst\n”
loop=0
return 1
;;
* )
printf “${tcff0}$answer$tcRst\n”
;;
esac
done
}

confirm_section () {
confirm || {
printf “$tc00f> Skipping entire section.$tcRst\n”
exit 1
}
}

backup () {
printf “Creating backup ${file}~\n”
sudo cp -a “$file” “${file}~”
check
return $?
}

file_check () {
s=0
if [[ “$create” && ! -f “$file” ]]; then
create=
printf ” Create $file\n”
printf “$content” | sudo tee “$file”
check || return $?
s=1
fi
if [[ “$owner” && “`stat -c %U:%G \”$file\”`” != “$owner” ]]; then
printf ” Change ownsership of $file\n”
sudo chown “$owner” “$file”
check || return $?
s=1
fi
if [[ “$perm” && “`stat -c %a \”$file\”`” != “$perm” ]]; then
printf ” Change permissions of $file\n”
sudo chmod “$perm” “$file”
check || return $?
s=1
fi
if [ “$s” = “0” ]; then
printf “${tc00f}> SKIPPED:$tcRst Already applied\n”
fi
return 0
}

pattern_count () {
awk “/$pattern/{n++}; END {print n+0}” “$file”
}
line_count () {
awk “/$line/{n++}; END {print n+0}” “$file”
}

pattern_confirm () {
if [ ! -f “$file” ]; then
printf “${tcff0}> WARNING:$tcRst Could not find $file\n”
return 1
fi
if [[ ( “$pattern” && “`pattern_count`” -gt “0” ) || ( ! “$pattern” && “`line_count`” = “0” ) ]]; then
printf “${tc00f}> SKIPPED:$tcRst Already applied\n”
return 1
fi
return 0
}

append () {
printf “Appending to $file\n”
printf “$append” | sudo tee -a “$file” > /dev/null
check
return $?
}

replace () {
printf “Scanning $file\n”
result=”`awk \”/$line/{sub(/$search/, \\\”$replace\\\”)}; {print}\” \”${file}\”`”
check &check
return $?
}

confirm_append () {
pattern_confirm && confirm && append
return $?
}

confirm_replace () {
pattern_confirm && confirm && replace
return $?
}

install_confirm () {
printf “\nInstall: $tc0f0$pkgs$tcRst\n”
dpkg -l $pkgs > /dev/null 2>&1 &> SKIPPED:$tcRst Already installed\n”
return 0
}
}
confirm && sudo aptitude –without-recommends install $pkgs
return $?
}

purge_confirm () {
printf “\nUninstall (purge): $tcf00$pkgs$tcRst\n”
dpkg -l $pkgs 2> /dev/null | grep -q “^i” > /dev/null || {
printf “${tc00f}> SKIPPED:$tcRst None installed\n”
return 0
}
confirm && sudo aptitude –without-recommends purge $pkgs
return $?
}

# #
# End of the useful functions #
# #

# #
# #
# #
# Below the actual code #
# #
# #
# #

above_vids=4
burn_wait=93

printf “\n
This script will optimize your voltages at every speed setting
by systematically lowering them while stressing the CPU.
Each voltage will be turned down until your system crashes, and the final
setting for that voltage will be $tc0f0$above_vids$tcRst VIDs above that to \”ensure\” stability.

WARNING:
This script will crash your system as many times as there are VIDs to tweak.
You might destroy your hardware, break laws and/or die in vain if you continue.\n\n”
confirm || exit 0

num_cpus=0
cpu0freq=/sys/devices/system/cpu/cpu0/cpufreq
cpusfreq=””
while [ [1] ]; do
cat /sys/devices/system/cpu/cpu$num_cpus/cpufreq/phc_default_vids > /dev/null 2>&1
silent_check || break
cpusfreq+=”/sys/devices/system/cpu/cpu$num_cpus/cpufreq ”
let num_cpus++
done

if [ $num_cpus = 0 ]; then
printf “$tcf00> ERROR:$tcRst No CPU core capable of undervolting found.\n”
exit 1
fi

printf “$tc0f0>Found $num_cpus CPU cores.$tcRst\n”
if [ $num_cpus -gt 1 ]; then
printf “Multiple cores found, the script will use the
same voltages for all cores, this means final
setting will be $tc0f0$above_vids$tcRst VIDs above the weakest core.\n”
fi

printf “\nInstall required packages.\nWill use burnMMX (part of cpuburn package) to stress CPU.”
pkgs=”cpuburn” # cpufrequtils
install_confirm

def_vids=`cat $cpu0freq/phc_default_vids`
c=0
for i in $def_vids; do
let c++
def_vids_arr[c]=$i
done

if [ -f phc_tweaked_vids ]; then
printf “\nLoad VIDs from ‘phc_tweaked_vids’ file\n”
cur_vids=`cat phc_tweaked_vids`
else
printf “\nRead default VIDs.\n”
cur_vids=”$def_vids”
fi

count_phc=`printf “$def_vids” | awk ‘{print NF}’`
count_tweak=`printf “$cur_vids” | awk ‘{printf NF}’`

if [ “$count_phc” != “$count_tweak” ]; then
printf “$tcf00> ERROR:$tcRst Wrong VID count!\n”
exit 1
fi
let count_phc–
check || {
printf “$tcf00> ERROR:$tcRst Number of VIDs is zero!\n”
exit 1
}

if [[ -f phc_tweaked_vids && -f phc_cur_pos ]]; then
printf “Load position from ‘phc_cur_pos’\n”
cur_pos=`cat phc_cur_pos`
let ++cur_pos
check || exit 1
else
printf “Reset position to 0.\n”
cur_pos=0
fi

printf “Read available frequencies.\n”
freqs=`cat $cpu0freq/scaling_available_frequencies`

c=0
for i in $freqs; do
let c++
freq[c]=$i
done
if [ “$c” != “$count_tweak” ]; then
printf “$tcf00> ERROR:$tcRst Number of frequencies ($c) and VIDs ($count_tweak) do not match!\n”
exit 1
fi
check

#printf “$cur_vids” | awk ‘{for (i=1; i phc_tweaked_vids
printf “$cur_pos” > phc_cur_pos

if [ “$cur_pos” -gt “$count_phc” ]; then
printf “\nAll VIDs have been tweaked!
Results are in the file ‘phc_tweaked_vids’ – use with care.\n”
printf “\nAll done! – Have a nice day.\n”
exit 0
fi

if [ “x$vid_last” != “x” ]; then
if [ “$vid_next” -gt “${vid[$cur_pos]}” ]; then
printf “\nNext VID higher than last – copying.”
vid[$(( cur_pos + 1 ))]=${vid[$cur_pos]}
fi
fi
let ++cur_pos

printf “\nSwitch to ‘userspace’ scaling governor.\n”
for i in $cpusfreq; do
printf “userspace” | sudo tee $i/scaling_governor > /dev/null
done
check || exit 1

printf “Set frequency to ${freq[$cur_pos]}.\n”
for i in $cpusfreq; do
printf “${freq[$cur_pos]}” | sudo tee $i/scaling_setspeed > /dev/null
done
check || exit 1

printf “Run burnMMX.\n”
pkill burnMMX
for i in $cpusfreq; do
burnMMX &
printf ” PID: $!\n”
done

recover () {
printf “\n\nRecovering CPU.\n”
pkill burnMMX
for i in $cpusfreq; do
printf “$def_vids” | sudo tee $i/phc_vids > /dev/null
printf “ondemand” | sudo tee $i/scaling_governor > /dev/null
done
printf “\nRun this script again to continue the optimization.\n”
}

printf “\n—–\nStart testing.\n”
confirm || {
recover
exit 1
}

while [[ 1 ]]; do
let vid[cur_pos]–
if [ “${vid[$cur_pos]}” -lt “0” ]; then
printf “\n\nThe lowest acceptable VID is 0.”
recover
exit 0
fi

printf “\nDefault VIDs: $def_vids
Current VIDs: $tc0f0$vids_done$tc0f0$vid_last$tcf00${vid[$cur_pos]}$tcRst$vids_rem
Testing VID: ${vid[$cur_pos]} ($(( ${vid[$cur_pos]} * 16 + 700)) mV)\n”

printf “$vids_done$vid_last${vid[$cur_pos]}$vids_rem” > phc_tweaked_vids
sync

for i in $cpusfreq; do
printf “$vids_done$vid_last${vid[$cur_pos]}$vids_rem” | sudo tee $i/phc_vids > /dev/null
done

c=0
while [ $c -lt $burn_wait ]; do
burnMMX_instances=`ps aux | grep [b]urnMMX | wc -l`
if [ $burnMMX_instances -ne $num_cpus ]; then
printf “\nburnMMX instances different than the CPU cores number. (Maybe one crashed)!”
recover
exit 0
else
printf “.”
if [ $c -eq 30 -o $c -eq 61 ]; then
printf “\n”
fi
sleep 0.5
let c++
fi
done
done

simpan sebagai intel-phc-undervolt.bash (terserah namanya, akhirannya bash) dan beri penanda ijin untuk dapat dieksekusi sebagai program:

$ chmod +x intel-phc-undervolt.bash

lalu jalankan script tersebut.

$ ./intel-phc-undervolt.bash

Untuk prosesor T5550 script ini akan menghasilkan 43 22 4, terlihat bahwa itu bersesuaian dengan tegangan 1,250 volt, 0,9686 dan 0,738. Script ini secara otomatis akan menambahkan nilai 4 dari nilai yang lolos uji untuk memastikan kestabilan prosesor dalam jangka panjang. Namun saya tidak puas dengan nilai tegangan untuk 1,8 GHz karena tetap sama sedangkan di windows bisa sampai 1,1 volt secara manual, lalu nilai ini saya ubah sebagai berikut 33 20 4, yang bersesuaian dengan 1,109 volt, 0,943 dan 0,7384 volt.

nah, nilai voltage id ini dimasukkan ke rc.local

$ sudo gedit /etc/rc.local

tambahkan baris berikut di bagian bawah

echo “33 20 4” > /sys/devices/cpu/cpu0/cpufreq/phc_vids

echo “33 20 4” > /sys/devices/cpu/cpu1/cpufreq/phc_vids

lalu restart.

Hasilnya ? Biasanya prosesor memiliki suhu 67-70 ‘ C sekarang hanya 45-50 ‘C, penurunan 15 ‘ bagus sekali kan,

kalo di ruangan AC: HDD 33’C, ACPI 48’C, CPU 39’C dan nVidia 49’C

nvidia-dingin1

 
Tinggalkan komentar

Ditulis oleh pada Agustus 20, 2012 in GNU/Linux

 

Tag: ,

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

 
%d blogger menyukai ini: