web-dev-qa-db-ja.com

CPU周波数スケーリングを無効にしますか?

私のubuntuラップトップでATLASを実行する必要がありますが、CPU周波数スケーリングを無効にしない限り、ソフトウェアは実行できません。私はここからの手順を試しました http://math-atlas.sourceforge.net/atlas_install/node5.html が、私のToshibaラップトップでは動作しません。周波数スケーリングがオンになっていると、ソフトウェアは役に立たなくなります。

誰か助けてもらえますか?

1
Brian

最小周波数と最大周波数を自由に設定できるcpuf GUIを書きました。 Mathアプリの直前で使用して、すべての周波数を最大に設定できます。 Mathアプリを実行した後、周波数を通常の状態にリセットして、バッテリーを長持ちさせ、発熱を抑えることができます。

cpuf-CPU最小/最大周波数を設定するシンプルなBash GUI

デモンストレーション

このデモでは、cpufウィンドウが左側にあり、conkyシステム情報が右側にあります。これがデモの進行方法です。

  • YouTubeビデオがすでに実行されている間にデモが開始されます
  • デフォルトのCPU最小/最大周波数は800/3500です
  • CPUの最小/最大を800/800に上書きすると、CPU使用率が20%に急上昇します
  • CPUの最小/最大値を3500/3500に上書きすると、CPU使用率が10%に低下します
  • デモがループバックして再び開始する

cpuf-demo.gif

3つのモニターを使用すると、cpufは10フィート離れて表示される可能性があるため、パラメーター1 --geometryオプションを使用してconkyの近くに配置します。

Sudo cpuf --geometry="450x450+4720+80" /home/rick/Pictures/icons/cpu-intel-128.svg
  • パラメータ1 --geometryは、ウィンドウの幅x高さ+幅のオフセット+高さのオフセットです
  • パラメータ2は独自のアイコン(この場合はIntel CPUイメージ)にすることができます。それ以外の場合はデフォルトでコンピュータアイコンになります

cpuf Bashスクリプト

このセクションでは、ターミナルを開く必要があります Ctrl+Alt+T

セットアップ方法

機能するためには、cpuf bashスクリプトに以下が必要です。

Sudo apt install yad         # from the repository universe
Sudo apt install coreutils   # installed by default in most distros

cpufスクリプトを検索パス内のルートが所有するディレクトリに配置するのが最も簡単です。例:/usr/local/bin

cpufスクリプトを作成するには、Sudo -H gedit /usr/local/bin/cpufでエディターを開きます。

  • 以下のセクションの行を強調表示します
  • 右クリックして「コピー」を選択します
  • エディターに切り替えます
  • 右クリックして「貼り付け」を選択します
  • エディターメニューから[保存]を選択し、次に[終了]を選択します

Sudo chmod a+x /usr/local/bin/cpufを使用してスクリプトを実行可能にします。

cpufコードをエディターにコピーします

#!/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="/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
1

読者は、それがここで迷惑なATLASであることを理解する必要があります。最新のプロセッサーでは、CPUはそれ自体で周波数をスケールダウンし、アイドル状態の関数として、パフォーマンスモードであっても、ビジー状態ではないときにそれが入ることに注意してください。 CPU周波数を最大に「固定」する場合は、パフォーマンスモードの設定に加えて、すべてのアイドル状態> = 0を無効にします。

注:これにより、プロセッサから大量の廃熱が発生し、システムがそれを処理できることを確認します。

例:

開始条件:

doug@s15:~/idle$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_driver
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
intel_cpufreq
doug@s15:~/idle$ cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
performance
performance
performance
performance
performance
performance
performance
performance

ステップ1:システムにはいくつのアイドル状態がありますか?

doug@s15:~/idle$ ls -l -d /sys/devices/system/cpu/cpu*/cpuidle/state*
drwxr-xr-x 2 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu0/cpuidle/state0
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu0/cpuidle/state1
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu0/cpuidle/state2
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu0/cpuidle/state3
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu0/cpuidle/state4
drwxr-xr-x 2 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu1/cpuidle/state0
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu1/cpuidle/state1
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu1/cpuidle/state2
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu1/cpuidle/state3
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu1/cpuidle/state4
drwxr-xr-x 2 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu2/cpuidle/state0
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu2/cpuidle/state1
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu2/cpuidle/state2
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu2/cpuidle/state3
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu2/cpuidle/state4
drwxr-xr-x 2 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu3/cpuidle/state0
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu3/cpuidle/state1
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu3/cpuidle/state2
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu3/cpuidle/state3
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu3/cpuidle/state4
drwxr-xr-x 2 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu4/cpuidle/state0
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu4/cpuidle/state1
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu4/cpuidle/state2
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu4/cpuidle/state3
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu4/cpuidle/state4
drwxr-xr-x 2 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu5/cpuidle/state0
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu5/cpuidle/state1
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu5/cpuidle/state2
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu5/cpuidle/state3
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu5/cpuidle/state4
drwxr-xr-x 2 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu6/cpuidle/state0
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu6/cpuidle/state1
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu6/cpuidle/state2
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu6/cpuidle/state3
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu6/cpuidle/state4
drwxr-xr-x 2 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu7/cpuidle/state0
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu7/cpuidle/state1
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu7/cpuidle/state2
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu7/cpuidle/state3
drwxr-xr-x 3 root root 0 Jul  3 11:41 /sys/devices/system/cpu/cpu7/cpuidle/state4

OK。私は5つのアイドル状態、0-4を持っています:

手順2:状態1〜4を無効にする(私はSudoとして実行されるスクリプトを使用しています):

doug@s15:~/idle$ cat idle_1-4_disable
#! /bin/bash
echo "idle disable states 1-4:"

/home/doug/idle/idle_state1_disable
/home/doug/idle/idle_state2_disable
/home/doug/idle/idle_state3_disable
/home/doug/idle/idle_state4_disable

doug@s15:~/idle$ cat idle_state1_disable
#! /bin/bash
echo "idle state 1: before:"
cat /sys/devices/system/cpu/cpu*/cpuidle/state1/disable

for file in /sys/devices/system/cpu/cpu*/cpuidle/state1/disable; do echo "1" > $file; done

echo "idle state 1: after:"
cat /sys/devices/system/cpu/cpu*/cpuidle/state1/disable

その結果:

doug@s15:~/idle$ Sudo ./idle_1-4_disable
idle disable states 1-4:
idle state 1: before:
0
0
0
0
0
0
0
0
idle state 1: after:
1
1
1
1
1
1
1
1
idle state 2: before:
0
0
0
0
0
0
0
0
idle state 2: after:
1
1
1
1
1
1
1
1
idle state 3: before:
0
0
0
0
0
0
0
0
idle state 3: after:
1
1
1
1
1
1
1
1
idle state 4: before:
0
0
0
0
0
0
0
0
idle state 4: after:
1
1
1
1
1
1
1
1
doug@s15:~/idle$

そしてこれらすべてをターボスタットで見ると:

doug@s15:~/idle$ Sudo turbostat --quiet --Summary --show Busy%,Bzy_MHz,PkgTmp,PkgWatt,GFXWatt,IRQ --interval 15
Busy%   Bzy_MHz IRQ     PkgTmp  PkgWatt GFXWatt
0.02    2743    438     30      3.75    0.12
0.02    2753    406     29      3.75    0.12
0.02    2806    402     29      3.75    0.12
0.02    2764    436     29      3.75    0.12
58.62   3500    70887   50      30.75   0.12  <<<< ilde state 1-4 disabled
100.00  3500    120240  55      50.39   0.12  <<<< tubostat counts idle state 0 as busy
100.00  3500    120243  58      50.95   0.12  <<<< The system is actually still idle.
100.00  3500    120241  60      51.38   0.12
100.00  3500    120248  62      51.91   0.12
100.00  3500    120241  64      52.58   0.12
100.00  3500    120244  65      52.88   0.12
100.00  3500    120252  67      53.13   0.12
100.00  3500    120251  68      53.29   0.12
100.00  3500    120242  68      53.46   0.12
100.00  3500    120268  68      53.56   0.12
100.00  3500    120260  68      53.63   0.12
100.00  3500    120267  70      53.69   0.12

プロセッサの温度が高くなったら、CPU周波数の上限を制限してください。 Intel Pstateの例:

doug@s15:~/idle$ echo 60 | Sudo tee /sys/devices/system/cpu/intel_pstate/max_perf_pct
60

その結果:

100.00  3500    120267  70      53.96   0.12
100.00  3500    120274  71      53.92   0.12
100.00  3500    120256  70      53.95   0.12
100.00  3500    120277  70      53.93   0.12
100.00  3500    120326  70      53.95   0.12
34.97   3500    42719   48      21.53   0.12
0.02    2712    378     45      4.00    0.12
0.02    2754    396     42      3.96    0.12
0.02    2724    504     40      3.92    0.12
0.02    2816    378     39      3.89    0.12
94.33   3500    113569  60      48.59   0.12
100.00  3500    120242  63      51.88   0.12
100.00  3500    120240  65      52.64   0.12
100.00  3500    120280  68      53.08   0.12
100.00  3500    120333  68      53.32   0.12
100.00  1713    120348  55      20.29   0.12  <<< Had to toggle to powersave governor
100.00  2201    120280  57      26.31   0.12  <<< And then back to performance governor
100.00  2300    120239  56      27.58   0.12  <<< Now new max is in effect.
100.00  2300    120237  56      27.53   0.12  <<< And processor temp is less
100.00  2300    120237  55      27.46   0.12
100.00  2300    120232  54      27.42   0.12
0
Doug Smythies

以下のファイルで、デフォルトのガバナーをパフォーマンスに置き換えます。

/etc/init.d/cpufrequtils

/etc/default/cpufrequtils 

ondemandサービスを無効にする

Sudo update-rc.d ondemand disable

次に実行します

update-initramfs -u -k all 

その後、再起動します

詳細: CPU周波数スケーリングを無効にして、システムをパフォーマンスに設定するにはどうすればよいですか?

https://wiki.debian.org/HowTo/CpuFrequencyScaling

https://wiki.archlinux.org/index.php/CPU_frequency_scaling

0
kenn