LINUX.ORG.RU

CPUmode - a userspace application for changing CPU powersaving modes

 , ,


0

1

Запускать под рутом/sudo.

#! /bin/bash
#----------------------------------------------------------------------
# Description: Put CPU to and backto full powersave mode
# Author: Artem S. Tashkinov <birdie at permonline.ru>
# Created at: Sun Jun 19 00:14:40 YEKST 2005
# Computer: home.birdie.net
# System: Linux 2.6.12-k8 on i686
#
# Thu Jul 1  19:18:10 2010
#  1.0 Added SMP support 
# Sun Dec 25 16:50:36 2011
#  1.1 Completely reworked modules loading mechanism
#      userspace governor
# Sun Jul 22 05:30:16 YEKT 2012
#  1.2 Set/Reset
#  Improved output
#
# Copyright (c) 2005-2012 Artem S. Tashkinov. All rights reserved.
#----------------------------------------------------------------------

version=1.1
DRIVER=acpi_cpufreq
cpu0=/sys/devices/system/cpu/cpu0/cpufreq
max0=$cpu0/cpuinfo_max_freq
lim0=$cpu0/scaling_max_freq
SD=$cpu0/scaling_driver

if [ ! -f $SD -a "$1" != "-l" -a "$1" != "--load" ]; then
	echo "Error: cpufrequency subsystem is not running!"
	exit 1
fi

SG=/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

governors=`cat $cpu0/scaling_available_governors 2>&1`

for i in performance conservative userspace powersave ondemand; do
	cgovern=`echo $governors | grep $i`
	if [ -z "$cgovern" ]; then
		echo "CPU governor '$i' not found."
		module="cpufreq_$i"
		echo "Installing $module ... "
		modprobe $module >/dev/null 2>&1
		if [ "$?" != "0" ]; then
			echo "Error: can't load $module module. Do you have it installed?"
			exit 1
		else
			echo "OK"
		fi
	fi
done

test "$1" = "-l" -o "$1" = "--load" || current=`cat $SG`

case $1 in
	--version|-v) #print the version number
		echo "`basename $0` version "$version
		exit 0;;

	--help|-h) #Display the help screen
		echo "Usage: `basename $0` [OPTION]"
		echo "	-M --maximum		- performance mode (minimum powersavings)"
		echo "	-m --mimimum		- powersave mode (minimum performance)"
		echo "	-a --auto		- ondemand mode (rapid auto performance)"
		echo "	-c --conservative	- conservative mode (gradual auto performance)"
		echo "	-u --userspace FREQ	- user defined CPU frequency"
		echo "	-l --load		- load CPU powersave driver"
		echo "	-n --now		- show current mode"
		echo "	-s --set FREQ		- set maximum CPU frequency"
		echo "	-r --reset		- reset maximum CPU frequency"
		echo "	-v --version		- show application version and exit"
		echo "	-h --help		- show this help and exit"
		exit 0;;

	--load|-l)
		KDRIVER=`echo $DRIVER | sed 's/-/_/g'`
		if [ -z "`lsmod | grep $KDRIVER`" ]; then
			modprobe $DRIVER && echo "CPU powersave driver has been loaded successfully"
		else
			echo "CPU powersave driver is already loaded"
		fi
		exit;;

	--userspace|-u)
		allowed=`cat $cpu0/scaling_available_frequencies`
		if [ -z "$2" ]; then
			echo "Need an argument to continue. The possible frequences are: "
			echo $allowed
		else
			if [ -n "`echo "$allowed" | grep -w "$2"`" ]; then
				echo -n "Setting "$2" frequency ... "
				echo "userspace" | tee $SG > /dev/null
				echo "$2" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_setspeed > /dev/null
				[ "`cat $cpu0/scaling_cur_freq 2>/dev/null`" == "$2" ] && echo OK || echo Failed
			else
				echo "'$2' is not amongst allowed frequencies: "
				echo $allowed
			fi
		fi
		exit;;

	--conservative|-c)
		echo "conservative" | tee $SG > /dev/null
		echo "conservative mode has been activated"
		exit;;

	--minimum|-m)
		echo "powersave" | tee $SG > /dev/null
		echo "powersave mode has been activated"
		exit;;

	--maximum|-M)
		echo "performance" | tee $SG > /dev/null
		echo "performance mode has been activated"
		exit;;

	--set|-s)
		allowed=`cat $cpu0/scaling_available_frequencies`
		if [ -z "$2" ]; then
			echo "Need an argument to continue. The possible frequences are: "
			echo $allowed
		else
			if [ -n "`echo "$allowed" | grep -w "$2"`" ]; then
				echo "The current governor is: `cat $cpu0/scaling_governor`"
				echo "Setting maximum frequency ... "
				echo "$2" | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq > /dev/null
				cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
			else
				echo "'$2' is not amongst allowed frequencies: "
				echo $allowed
			fi
		fi
		exit;;

	--reset|-r)
		echo "The current governor is: `cat $cpu0/scaling_governor`"
		echo "Resetting maximum frequency ... "
		cat $max0 | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq > /dev/null
		cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
		exit;;

	--auto|-a)
		echo "ondemand" | tee $SG > /dev/null
		echo "auto (ondemand) mode has been activated"
		exit;;

	--now|-n|*)
		cmode=`cat $SG | sort | uniq`
		echo "$cmode mode is currently activated:"
		cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
		if [ "`cat $max0`" == "`cat $lim0`" ]; then
			echo "No frequency limit is enforced."
		else
			echo "Maximum allowed frequency is `cat $lim0` (out of `cat $max0`)"
		fi
		exit;;
esac
★★★★★

Ман cpufreq-utils

anonymous
()

v1.2.1

# Mon Aug  6 00:46:25 YEKT 2012
#  1.2.1 unified userspace and maxfreq; unified everything; more error checkings
#
# ToDo: replace with MHz

version=1.2.1
DRIVER=acpi_cpufreq
lead=/sys/devices/system/cpu

cpu0=$lead/cpu0/cpufreq
max0=$cpu0/cpuinfo_max_freq
lim0=$cpu0/scaling_max_freq
SG=$lead/cpu*/cpufreq/scaling_governor
SD=$cpu0/scaling_driver

setgov()
{
	echo "$1" | tee $SG > /dev/null
	test -n "`cat $SG | grep -v "$1"`" && echo "Failed setting $1 governor!" && exit 100
	echo "$1 mode has been activated"
}

getgov()
{
	echo "`cat $SG | sort | uniq` mode is currently activated."
}

setspeed()
{
	allowed=`cat $cpu0/scaling_available_frequencies`
	if [ -z "$2" ]; then
		echo "Need an argument to continue. The possible frequences are: "
		echo $allowed
		return 1
	fi

	if [ -z "`echo "$allowed" | grep -w "$2"`" ]; then
		echo "'$2' is not amongst the allowed frequencies: "
		echo $allowed
		return 2
	fi

	if [ "$1" == "userspace" ]; then
		test "$2" -gt "`cat $lim0`" && echo "You cannot set $2 user frequency as it is bigger than the maximum allowed frequency of `cat $lim0`." && return 3
		setgov userspace
		echo -n "Setting user ${2}Hz frequency ... "
		echo "$2" | tee $lead/cpu*/cpufreq/scaling_setspeed > /dev/null
		[ "`cat $cpu0/scaling_cur_freq 2>/dev/null`" == "$2" ] && echo OK || echo Failed
	elif [ "$1" == "maxfreq" ]; then
		getgov
		echo "Setting maximum frequency of ${2}Hz... "
		echo "$2" | tee $lead/cpu*/cpufreq/scaling_max_freq > /dev/null
		cat $lead/cpu*/cpufreq/scaling_max_freq
	else
		echo "Don't know what to do"
	fi
}

if [ ! -f $SD -a "$1" != "-l" -a "$1" != "--load" ]; then
	echo "Error: cpufrequency subsystem is not running!"
	exit 1
fi

governors=`cat $cpu0/scaling_available_governors 2>&1`

for i in performance conservative userspace powersave ondemand; do
	cgovern=`echo $governors | grep $i`
	if [ -z "$cgovern" ]; then
		echo "CPU governor '$i' not found."
		module="cpufreq_$i"
		echo "Installing $module ... "
		modprobe $module >/dev/null 2>&1
		if [ "$?" != "0" ]; then
			echo "Error: can't load $module module. Do you have it installed?"
			exit 1
		else
			echo "OK"
		fi
	fi
done

test "$1" = "-l" -o "$1" = "--load" || current=`cat $SG`

case $1 in
	--version|-v) #print the version number
		echo "`basename $0` version "$version
		exit 0;;

	--help|-h) #Display the help screen
		echo "Usage: `basename $0` [OPTION]"
		echo "	-M --maximum		- performance mode (minimum powersavings)"
		echo "	-m --mimimum		- powersave mode (minimum performance)"
		echo "	-a --auto		- ondemand mode (rapid auto performance)"
		echo "	-c --conservative	- conservative mode (gradual auto performance)"
		echo "	-u --userspace FREQ	- user defined CPU frequency"
		echo "	-l --load		- load CPU powersave driver"
		echo "	-n --now		- show current mode"
		echo "	-s --set FREQ		- set maximum CPU frequency"
		echo "	-r --reset		- reset maximum CPU frequency"
		echo "	-v --version		- show application version and exit"
		echo "	-h --help		- show this help and exit"
		exit 0;;

	--load|-l)
		KDRIVER=`echo $DRIVER | sed 's/-/_/g'`
		if [ -z "`lsmod | grep $KDRIVER`" ]; then
			modprobe $DRIVER && echo "CPU powersave driver has been loaded successfully"
		else
			echo "CPU powersave driver is already loaded"
		fi
		exit;;

	--userspace|-u)
		setspeed userspace "$2"
		exit;;

	--conservative|-c)
		setgov conservative
		exit;;

	--minimum|-m)
		setgov powersave
		exit;;

	--maximum|-M)
		setgov performance
		exit;;

	--set|-s)
		setspeed maxfreq "$2"
		exit;;

	--reset|-r)
		getgov
		echo "Resetting maximum frequency ... "
		cat $max0 | tee $lead/cpu*/cpufreq/scaling_max_freq > /dev/null
		cat $lead/cpu*/cpufreq/scaling_max_freq
		exit;;

	--auto|-a)
		setgov ondemand
		exit;;

	--now|-n|*)
		getgov
		cat $lead/cpu*/cpufreq/scaling_cur_freq
		if [ "`cat $max0`" == "`cat $lim0`" ]; then
			echo "No frequency limit is enforced."
		else
			echo "Maximum allowed frequency is `cat $lim0` (out of `cat $max0`)"
		fi
		exit;;
esac

anonymous
()
2 июня 2013 г.

v1.2.3

Part 1

#! /bin/bash
#----------------------------------------------------------------------
# Description: Put CPU to and backto full powersave mode
# Author: Artem S. Tashkinov <birdie at permonline.ru>
# Created at: Sun Jun 19 00:14:40 YEKST 2005
# Computer: home.birdie.net
# System: Linux 2.6.12-k8 on i686
#
# Thu Jul 1  19:18:10 2010
#  1.0 Added SMP support
#
# Sun Dec 25 16:50:36 2011
#  1.1 Completely reworked modules loading mechanism; userspace governor
#
# Sun Jul 22 05:30:16 YEKT 2012
#  1.2 Set/Reset; Improved output
#
# Mon Aug  6 00:46:25 YEKT 2012
#  1.2.1 unified userspace and maxfreq; unified everything; more error checkings
#
# Mon Feb 11 06:19:04 YEKT 2013
#  1.2.2 --now shows frequency in MHz
#
# Fri May  3 00:41:13 YEKT 2013
#  1.2.3 I've discovered that after suspend/resume max CPU cores 2, 3 and 4
# frequences have been reset. This script "thought" those numbers are always
# the same, now we tread carefully and check if they are indeed different
#   Also fix userspace set frequency - maxfreq also has to be adjusted
#
# Copyright (c) 2013 Artem S. Tashkinov. All rights reserved.
#----------------------------------------------------------------------

#set -x

version=1.2.3
DRIVER=acpi_cpufreq
lead=/sys/devices/system/cpu

cpu0=$lead/cpu0/cpufreq
max0=`cat $cpu0/cpuinfo_max_freq 2>/dev/null`
lim0=`cat $cpu0/scaling_max_freq 2>/dev/null`
SG=$lead/cpu*/cpufreq/scaling_governor
SD=$cpu0/scaling_driver

hz2mhz() # only ONE argument at a time!
{
	freq="$1"
	test -z "$freq" && read freq
	awk 'END{print '$freq'/1000"MHz"}' < /dev/null
}

setgov()
{
	echo "$1" | tee $SG > /dev/null
	test -n "`cat $SG | grep -v "$1"`" && echo "Failed setting $1 governor!" && exit 100
	echo "$1 mode has been activated"
}

getgov()
{
	echo "`cat $SG | sort | uniq` mode is currently activated."
}

setspeed()
{
	allowed=`cat $cpu0/scaling_available_frequencies`
	if [ -z "$2" ]; then
		echo "Need an argument to continue. The possible frequences are: "
		echo $allowed
		return 1
	fi

	if [ -z "`echo "$allowed" | grep -w "$2"`" ]; then
		echo "'$2' is not amongst the allowed frequencies: "
		echo $allowed
		return 2
	fi

	if [ "$1" == "userspace" ]; then
		setgov userspace
		echo -n "Setting user defined frequency of `echo $2 | hz2mhz` ... "
		echo "$2" | tee $lead/cpu*/cpufreq/scaling_max_freq > /dev/null
		echo "$2" | tee $lead/cpu*/cpufreq/scaling_setspeed > /dev/null
		[ "`cat $cpu0/scaling_cur_freq 2>/dev/null`" == "$2" ] && echo OK || echo Failed
	elif [ "$1" == "maxfreq" ]; then
		getgov
		echo "Setting maximum frequency of `echo $2 | hz2mhz` ... "
		echo "$2" | tee $lead/cpu*/cpufreq/scaling_max_freq > /dev/null
		cat $lead/cpu*/cpufreq/scaling_max_freq
	else
		echo "Don't know what to do"
	fi
}
anonymous
()
Ответ на: v1.2.3 от anonymous

Part 2

if [ ! -f $SD -a "$1" != "-l" -a "$1" != "--load" ]; then
	echo "Error: cpufrequency subsystem is not running!"
	exit 1
fi

governors=`cat $cpu0/scaling_available_governors 2>&1`

for i in performance conservative userspace powersave ondemand; do
	cgovern=`echo $governors | grep $i`
	if [ -z "$cgovern" ]; then
		echo "CPU governor '$i' not found."
		module="cpufreq_$i"
		echo "Installing $module ... "
		modprobe $module >/dev/null 2>&1
		if [ "$?" != "0" ]; then
			echo "Error: can't load $module module. Do you have it installed?"
			exit 1
		else
			echo "OK"
		fi
	fi
done

test "$1" = "-l" -o "$1" = "--load" || current=`cat $SG`

case $1 in
	--version|-v) #print the version number
		echo "`basename $0` version "$version
		exit 0;;

	--help|-h) #Display the help screen
		echo "Usage: `basename $0` [OPTION]"
		echo "	-M --maximum		- performance mode (minimum powersavings)"
		echo "	-m --mimimum		- powersave mode (minimum performance)"
		echo "	-a --auto		- ondemand mode (rapid auto performance)"
		echo "	-c --conservative	- conservative mode (gradual auto performance)"
		echo "	-u --userspace FREQ	- user defined CPU frequency"
		echo "	-l --load		- load CPU powersave driver"
		echo "	-n --now		- show current mode"
		echo "	-s --set FREQ		- set maximum CPU frequency"
		echo "	-r --reset		- reset maximum CPU frequency"
		echo "	-v --version		- show application version and exit"
		echo "	-h --help		- show this help and exit"
		exit 0;;

	--load|-l)
		KDRIVER=`echo $DRIVER | sed 's/-/_/g'`
		if [ -z "`lsmod | grep $KDRIVER`" ]; then
			modprobe $DRIVER && echo "CPU powersave driver has been loaded successfully"
		else
			echo "CPU powersave driver is already loaded"
		fi
		exit;;

	--userspace|-u)
		setspeed userspace "$2"
		exit;;

	--conservative|-c)
		setgov conservative
		exit;;

	--minimum|-m)
		setgov powersave
		exit;;

	--maximum|-M)
		setgov performance
		exit;;

	--set|-s)
		setspeed maxfreq "$2"
		exit;;

	--reset|-r)
		getgov
		echo "Resetting maximum frequency ... "
		echo $max0 | tee $lead/cpu*/cpufreq/scaling_max_freq > /dev/null
		cat $lead/cpu*/cpufreq/scaling_max_freq
		exit;;

	--auto|-a)
		setgov ondemand
		exit;;

	--now|-n|*)
		getgov
		for i in `cat $lead/cpu*/cpufreq/scaling_cur_freq`; do
			hz2mhz "$i"
		done

		# Check if maximum CPU frequences are mixed or maxed out
		for i in `cat $lead/cpu*/cpufreq/scaling_max_freq`; do
			this=$i
			test "$max0" != "$i" && notmaxed=1
			test "$next" != "$this" -a -n "$vin" && nonuni=1 # vin - do not run on a first loop invocation
			next=$this
			vin=1
		done

		if [ -z "$notmaxed" ]; then
			echo "No frequency limit is enforced."
		else
			if [ -n "$nonuni" ]; then
				echo "Maximum CPU frequency per CPU is :"
				for i in `cat $lead/cpu*/cpufreq/scaling_max_freq`; do
					hz2mhz "$i"
				done
			else
				echo "Maximum allowed frequency is `echo $lim0 | hz2mhz` (out of `echo $max0 | hz2mhz`)"
			fi
		fi

		exit;;
esac
anonymous
()

Буду удивлен, если найдется больше одного пользователя этого.

anonymous_sama ★★★★★
()

Будь мужиком, зарегься на гитхабе. Здесь это никому нахер не нужно, а кому нужно этого здесь не найдёт.

anonymous
()
Ответ на: комментарий от anonymous

Хорошая идея, кстати, спасибо.

Я подумаю, а пока лень ;-)

По поводу велосипедности - аналога этого скрипта в природе нет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.