Ich habe ein Problem mit einem Chuwi Hi10 Pro. Es tritt unter Linux und Windows auf.
Wenn die Bildschirmhelligkeit zu hoch ist oder die CPU zu 100 % ausgelastet ist, beginnt sich der Akku zu entladen, während das Gerät angeschlossen ist. Bei Verwendung eines USB 3.0-QC-Ladegeräts ist dies ein sehr langsamer Stromverbrauch, aber ich möchte das Tablet ziemlich zuverlässig rund um die Uhr eingeschaltet lassen.
Ich würde gerne wissen, ob es eine einfache Methode gibt, vorzugsweise eine GUI oder ein einfaches Bash-Skript, um die CPU zu drosseln (Energieverwaltung) und in den Hochleistungsmodus zurückzukehren.
Ich möchte es für Dienste wie Kodi verwenden; Es kann die Videowiedergabe nicht durcheinander bringen, wenn sie ein wenig gedrosselt wird.
Nebenfrage, abgesehen von den Akkuinformationen, gibt es eine Möglichkeit, die Stromstärke und Watt von einem Netzteil zu erfahren?
Beste Antwort
cpuf – Einfache Bash-GUI zum Einstellen der minimalen/maximalen CPU-Frequenz
Vorführung
In dieser Demo cpuf
Fenster ist links und conky
Systeminformationen befinden sich auf der rechten Seite. So läuft die Demo ab:
- Demo startet, während YouTube-Video bereits läuft
- Standard-CPU-min/max-Frequenzen sind
800
/3500
- CPU min/max auf
800
überschreiben /800
und die CPU-Auslastung steigt auf 20 % - CPU min/max auf
3500
überschreiben /3500
und die CPU-Auslastung sinkt auf 10 % - Demo kehrt zurück und beginnt erneut
Mit drei Monitoren cpuf
kann in 10 Fuß Entfernung erscheinen, verwenden Sie also Parameter 1 --geometry
Option, um es in die Nähe von conky
zu stellen :
sudo cpuf --geometry="450x450+4720+80" //eadn-wc01-5196795.nxedge.io/home/rick/Pictures/icons/cpu-intel-128.svg
- Parameter 1
--geometry
ist Fensterbreite x Höhe + Breitenversatz + Höhenversatz - Parameter 2 kann Ihr eigenes Symbol sein (in diesem Fall Intel-CPU-Image), andernfalls ist es standardmäßig das Computersymbol
cpuf
Bash-Skript
Dieser Abschnitt erfordert, dass Sie ein Terminal mit Strg öffnen +Alt +T .
Einrichtung
Um zu funktionieren, cpuf
Bash-Skript erfordert:
sudo apt install yad # from the repository universe
sudo apt install coreutils # installed by default in most distros
Am einfachsten ist es, wenn Sie cpuf
platzieren script in ein root-eigenes Verzeichnis innerhalb Ihres Suchpfads. Zum Beispiel:/usr/local/bin
.
Um cpuf
zu erstellen Skript öffnen Sie den Editor mit sudo -H gedit /usr/local/bin/cpuf
.
- Markieren Sie die Zeilen im Abschnitt unten
- Klicken Sie mit der rechten Maustaste und wählen Sie „Kopieren“
- Wechseln Sie zurück zu Ihrem Editor
- Klicken Sie mit der rechten Maustaste und wählen Sie „Einfügen“
- Wählen Sie im Editor-Menü „Speichern“ und dann „Beenden“
Machen Sie das Skript mit sudo chmod a+x /usr/local/bin/cpuf
ausführbar .
cpuf
Code zum Kopieren in Ihren Editor
#!/bin/bash
# NAME: cpuf (Pronounced SEA-PUFF)
# CALL: sudo cpuf
# PARM: $1 = --geometry=WidthxHeight+VertOffset+HorizOffset
# $2 = Optional image icon
# DESC: Simple GUI script to set CPU Min and Max Frequency.
# For Ask Ubuntu Question: https://askubuntu.com/q/1141605/307523
# DATE: May 12, 2019.
# UPDT: No updates yet.
# NOTE: No notes yet.
### Dependancies ###
command -v yad >/dev/null 2>&1 || { echo >&2
"yad package required but it is not installed. Aborting.";
exit 1; }
command -v nproc >/dev/null 2>&1 || { echo >&2
"coreutils package required but it is not installed. Aborting.";
exit 2; }
if [[ $(id -u) != 0 ]]; then # root powers needed to call this script
echo >&2 Must be called with sudo powers
exit 3
fi
# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
notify-send --urgency=critical
"$0 cannot be run from GUI without TERM environment variable."
exit 4
fi
### Program constants ###
## Yad Window parameters
# Hard code Height & Width to suit your screen resolution and scaling factor
GEOMETRY="--width 400 --height 500"
# Pass Parameter 1 with ---geometry="WidxHgt+WidOff+HgtOff" to override
[[ "$1" == --geometry=* ]] && GEOMETRY="$1"
TITLE="cpuf"
TEXT="Set CPU Min/Max Frequencies"
ICON="//eadn-wc01-5196795.nxedge.io/usr/share/icons/Adwaita/48x48/devices/computer.png"
# Pass Parameter 2 with icon for window image
# Intel CPU comes from: https://www.gnome-look.org/p/1107932/
[[ ! -z "$2" ]] && ICON="$2"
## Virtual File System directories
CPU0_DIR=/sys/devices/system/cpu/cpu0/cpufreq
PSTATE_DIR=/sys/devices/system/cpu/intel_pstate
CURR_MIN_FREQ="$CPU0_DIR/scaling_min_freq"
CURR_MAX_FREQ="$CPU0_DIR/scaling_max_freq"
ALLOW_MIN_FREQ="$CPU0_DIR/cpuinfo_min_freq"
ALLOW_MAX_FREQ="$CPU0_DIR/cpuinfo_max_freq"
OLD_IFS=$IFS # Save current Input File Separtor (IFS)
declare -a Arr # Array for YAD Window input
NumCPU=$(nproc --all) # Number of CPUs (nproc from coreutils)
### Error Message Functions ###
Abend () {
# Abnormal Ending - Parameter 1 = message to display, Parameter 2=exit code
yad --image "dialog-error" --image-on-top --title "$TITLE - Fatal Error"
"$GEOMETRY" --button=gtk-ok:0 --text "$1" 2>/dev/null
exit "$2"
} # Abend
ErrMsg () {
# Parmater 1 = message to display
yad --image "dialog-error" --title "$TITLE - Logical Error"
"$GEOMETRY" --button=gtk-ok:0 --text "$1" 2>/dev/null
fErrMsgForceContinue=true
} # ErrMsg
### Initialize Variables ###
InitVars () {
[[ ! -e "$ALLOW_MIN_FREQ" ]] && Abend "$ALLOW_MIN_FREQ not found" 11
AllowMinFreq=$(cat "$ALLOW_MIN_FREQ")
AllowMinFreq="${AllowMinFreq::-3}" # Chop off three decimals at end
[[ ! -e "$ALLOW_MAX_FREQ" ]] && Abend "$ALLOW_MAX_FREQ not found" 12
AllowMaxFreq=$(cat "$ALLOW_MAX_FREQ")
AllowMaxFreq="${AllowMaxFreq::-3}"
[[ ! -e "$CURR_MIN_FREQ" ]] && Abend "$CURR_MIN_FREQ not found" 13
CurrMinFreq=$(cat "$CURR_MIN_FREQ")
CurrMinFreq="${CurrMinFreq::-3}"
NewMinFreq="$CurrMinFreq"
[[ ! -e "$CURR_MAX_FREQ" ]] && Abend "$CURR_MAX_FREQ not found" 14
CurrMaxFreq=$(cat "$CURR_MAX_FREQ")
CurrMaxFreq="${CurrMaxFreq::-3}"
NewMaxFreq="$CurrMaxFreq"
if [[ -e "$PSTATE_DIR" ]] ; then
NumPstates=$(cat "$PSTATE_DIR/num_pstates")
if [[ $(cat "$PSTATE_DIR/no_turbo") -eq 0 ]] ; then
TurboBoost="Enabled"
else
TurboBoost="Disabled"
fi
else
NumPstates="Not found"
TurboBoost="Not found"
fi
if [[ -e "$CPU0_DIR/scaling_governor" ]] ; then
Governor=$(cat "$CPU0_DIR/scaling_governor")
else
Governor="Not found"
fi
if [[ -e "$CPU0_DIR/scaling_cur_freq" ]] ; then
CurrFreq=$(cat "$CPU0_DIR/scaling_cur_freq")
# Chop off three decimals at end
CurrFreq="${CurrFreq::-3}"
else
CurrFreq="Not found"
fi
} # InitVars
### Paint / repaint window and get new frequencies ###
GetParameters () {
# +------------------------------------------+
# | cpuf - Set CPU Min/Max Frequencies |
# +------------------------------------------+
# | |
# | Turbo Boost: Enabled |
# | |
# | Number of pstates: 99 |
# | Speed Governor Used: powersave |
# | Current CPU0 frequency: 9999 Mhz |
# | |
# | Current Minimum Freq.: 9999 Mhz |
# | Current Maximum Freq.: 9999 Mhz |
# | |
# | New Minimum Frequency 9999 |
# | New Maximum Frequency 9999 |
# | |
# +------------------------------------------+
IFS="|"
Arr=($(yad "$GEOMETRY" --form
--title "$TITLE" --text "$TEXT"
--window-icon="$ICON" --image="$ICON"
--field="Turbo Boost:":RO "$TurboBoost"
--field="Number of pstates:":RO "$NumPstates"
--field="Speed Governor:":RO "$Governor"
--field="Current Frequency:":RO "$CurrFreq MHz"
--field="Allowable Minimum Frequency:":RO "$AllowMinFreq MHz"
--field="Allowable Maximum Frequency:":RO "$AllowMaxFreq MHz"
--field="Current Minimum Frequency:":RO "$CurrMinFreq MHz"
--field="Current Maximum Frequency:":RO "$CurrMaxFreq MHz"
--field="New Minimum Frequency" "$NewMinFreq"
--field="New Maximum Frequency" "$NewMaxFreq" 2>/dev/null))
Return="$?"
NewMinFreq="${Arr[8]}"
NewMaxFreq="${Arr[9]}"
} # GetParameters
###################################
# MAINLINE #
###################################
ALL_PREFIX="/sys/devices/system/cpu/cpu"
MIN_SUFFIX="/cpufreq/scaling_min_freq"
MAX_SUFFIX="/cpufreq/scaling_max_freq"
while true ; do
InitVars
GetParameters
[[ ! "$Return" -eq 0 ]] && break ; # Exit on Cancel=1 or Close Window=252
# Sanity checks
fErrMsgForceContinue=false
[[ $NewMinFreq -lt $AllowMinFreq ]] && ErrMsg "Minimum frequency too low"
[[ $NewMaxFreq -gt $AllowMaxFreq ]] && ErrMsg "Maximum frequency too high"
[[ $NewMinFreq -gt $NewMaxFreq ]] && ErrMsg "Minimum frequency greater than Maximum Frequency"
[[ $fErrMsgForceContinue == true ]] && continue
# Set new Min/Max frequencies
for (( i=0 ; i<NumCPU ; i++ )) ; do
# If New Min > Curr Max, set Max first then Min
if [[ $NewMinFreq -gt $CurrMaxFreq ]] ; then
echo "$NewMaxFreq""000" > "$ALL_PREFIX$i$MAX_SUFFIX"
echo "$NewMinFreq""000" > "$ALL_PREFIX$i$MIN_SUFFIX"
else
echo "$NewMinFreq""000" > "$ALL_PREFIX$i$MIN_SUFFIX"
echo "$NewMaxFreq""000" > "$ALL_PREFIX$i$MAX_SUFFIX"
fi
done
done
IFS="$OLD_IFS"
exit 0