web-dev-qa-db-ja.com

lscpuの出力は、間接的に呼び出された場合に異なりますか?

私が使う lscpu | grep 'MHz'クロック速度を取得します。このコマンドを呼び出しているメソッドに基づいて、異なる結果が得られます。

方法1:端末に入力する
CPU MHz: 1200.000

方法2:test.shというスクリプトにカプセル化する
スクリプトコード:

#! /bin/bash
cpu=$(lscpu | grep 'MHz')
echo $cpu

次に、ターミナルで

$ chmod +x test.sh
$ ./test.sh

出力:
CPU MHz: 1200.000

ここまでは順調ですね。しかし今、方法3:test.shのGeanyで「runor viewcurrentfile」を押す。出力:
CPU MHz: 2200.000

方法4:test.shを呼び出すtest.pyというpythonスクリプトを作成します。
Pythonスクリプトコード:

#! /usr/bin/python
import subprocess

def test():
    subprocess.call("./test.sh")

if __name__ == '__main__':
    test()

次に、ターミナルで:
$ python test.py

出力:
CPU MHz: 2200.000

pythonとpython3の両方を試しました。どちらも同じ(誤った)結果になります。

lscpuを間接的に実行すると、なぜ別の出力が表示されるのですか?そして、どうすればこれを修正/回避できますか?私のコードに何か問題がありますか?それだけの価値があるので、私はUbuntu 13.10を実行しています。

ありがとう:-)。

1
Gx1sptDTDa

これは偶然です。システムが現在のCPU周波数を変更しているのです。

端末で次のコマンドを使用して確認します。

watch -n 0 "lscpu | grep 'MHz'"

システムのCPU周波数が切り替わっていることがわかります(少し待っているとき)。

次のコマンドを使用して、現在のCPU周波数を取得することもできます。

cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq

そして、それらの最大/最小CPU周波数:

cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

動作を変更しますか?CPUガバナーは、使用する頻度を決定します。 Linuxカーネルの ドキュメント を参照して、CPUガバナーが最適であるかどうかを判断してください。

  • 知事を取得します:cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
  • ガバナーを変更します:echo "powersave" >/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
3
chaos

最近のほとんどのCPUは、クロック周波数を調整できます。 Linuxのデフォルトのガバナーは「オンデマンド」であり、アイドル時に電力を節約するためにクロック速度を低く保ち、必要なときに作業を行うために速度を上げます。

https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt を参照してください。

0
Sylvain Pineau