2015年5月30日土曜日

CentOS7 の CPU 省電力機能について

先日、古い core2 世代のマシンで、CentOS 7 を動かしたのですが、CPU 温度がやけに高い現象に遭遇しました。
[root@hoge ~]# cat /etc/centos-release
CentOS Linux release 7.1.1503 (Core) 
[root@hoge ~]# uname -a
Linux hoge 3.10.0-229.4.2.el7.x86_64 #1 SMP Wed May 13 10:06:09 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@hoge ~]# dmidecode -s processor-version
Intel(R) Core(TM)2 CPU         X6800  @ 2.93GHz
[root@hoge ~]# sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +69.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:       +69.0°C  (high = +86.0°C, crit = +100.0°C)
これは、もしや省電力機能が働いていないのではと思って見てみると。
[root@hoge ~]# cpupower frequency-info
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 10.0 us.
  hardware limits: 1.60 GHz - 2.93 GHz
  available frequency steps: 2.93 GHz, 2.13 GHz, 1.60 GHz
  available cpufreq governors: conservative, userspace, powersave, ondemand, performance
  current policy: frequency should be within 1.60 GHz and 2.93 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency is 2.93 GHz (asserted by call to hardware).
  cpufreq stats: 2.93 GHz:100.00%, 2.13 GHz:0.00%, 1.60 GHz:0.00%  (24)
  boost state support:
    Supported: no
    Active: no
確かに常時最高周波数になっているようでした。調べてみると、cpupower.service というものがあり、これが CentOS 7 では、デフォルトでは disable になっているようです。
[root@hoge ~]# systemctl list-unit-files | grep cpupower
cpupower.service                            disabled
というわけで、このサービスを起動したら解決しました。温度下がりました(周波数下がりました)。
[root@hoge ~]# systemctl start cpupower.service
[root@hoge ~]# systemctl status cpupower.service 
cpupower.service - Configure CPU power related settings
   Loaded: loaded (/usr/lib/systemd/system/cpupower.service; enabled)
   Active: active (exited) since Tue 2015-05-26 08:49:07 JST; 21min ago
 Main PID: 22330 (code=exited, status=0/SUCCESS)

May 26 08:49:07 hoge cpupower[22330]: Setting cpu: 0
May 26 08:49:07 hoge cpupower[22330]: Setting cpu: 1
May 26 08:49:07 hoge systemd[1]: Started Configure CPU power related settings.

※しばらく時間を置いて温度を確認

[root@hoge ~]# sensors
coretemp-isa-0000
Adapter: ISA adapter
Core 0:       +59.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:       +59.0°C  (high = +86.0°C, crit = +100.0°C)

[root@hoge ~]# cpupower frequency-info
analyzing CPU 0:
  driver: acpi-cpufreq
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 10.0 us.
  hardware limits: 1.60 GHz - 2.93 GHz
  available frequency steps: 2.93 GHz, 2.13 GHz, 1.60 GHz
  available cpufreq governors: conservative, userspace, powersave, ondemand, performance
  current policy: frequency should be within 1.60 GHz and 2.93 GHz.
                  The governor "ondemand" may decide which speed to use
                  within this range.
  current CPU frequency is 1.60 GHz (asserted by call to hardware).
  cpufreq stats: 2.93 GHz:63.15%, 2.13 GHz:0.98%, 1.60 GHz:35.87%  (631)
  boost state support:
    Supported: no
    Active: no
なお、最近のマシン(Core i 世代)だと、cpupower.service が起動していなくても、省電力になるようです(つまり、RHEL7/CentOS7 のデフォルトで最適な状態になっている)。
気になる方は、cpupower コマンドや turbostat コマンドで確認してみては。


2016-10-01追記
手持ちの Core i7 (ThinkPad W520) だと、こんな感じ。何もしなくても、デフォルトで良い感じです。
[root@w520 ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@w520 ~]# uname -a
Linux w520 3.10.0-327.36.1.el7.x86_64 #1 SMP Sun Sep 18 13:04:29 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@w520 ~]# dmidecode -s processor-version
Intel(R) Core(TM) i7-2960XM CPU @ 2.70GHz
[root@w520 ~]# systemctl status cpupower.service
* cpupower.service - Configure CPU power related settings
   Loaded: loaded (/usr/lib/systemd/system/cpupower.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@w520 ~]# sensors coretemp-isa-0000
coretemp-isa-0000
Adapter: ISA adapter
Physical id 0:  +61.0°C  (high = +86.0°C, crit = +100.0°C)
Core 0:         +58.0°C  (high = +86.0°C, crit = +100.0°C)
Core 1:         +58.0°C  (high = +86.0°C, crit = +100.0°C)
Core 2:         +55.0°C  (high = +86.0°C, crit = +100.0°C)
Core 3:         +61.0°C  (high = +86.0°C, crit = +100.0°C)

[root@w520 ~]# cpupower frequency-info
analyzing CPU 0:
  driver: intel_pstate
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 0.97 ms.
  hardware limits: 800 MHz - 3.70 GHz
  available cpufreq governors: performance, powersave
  current policy: frequency should be within 800 MHz and 3.70 GHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency is 862 MHz (asserted by call to hardware).
  boost state support:
    Supported: yes
    Active: yes
    3400 MHz max turbo 4 active cores
    3400 MHz max turbo 3 active cores
    3600 MHz max turbo 2 active cores
    3700 MHz max turbo 1 active cores

2015年5月27日水曜日

お手軽なベンチマークあれこれ

Linux で、マシン(CPU)の相対性能を比較したい場合に、自分で使っているベンチマークについて、備忘録として書いてみたいと思います。

(1) bashで100万回ループ
[root@hoge ~]# cat /etc/centos-release
CentOS Linux release 7.1.1503 (Core) 
[root@hoge ~]# dmidecode -s processor-version
Intel(R) Core(TM) i7-2960XM CPU @ 2.70GHz
[root@hoge ~]# echo $LANG
ja_JP.UTF-8
[root@hoge ~]# time for ((i=0;++i<1000000;))
> do
> :
> done

real 0m4.035s
user 0m3.857s
sys 0m0.184s
何もインストールする必要がなく、簡単に測定できますが、一つ注意点があります。
なんと!ロケールが影響します。なので、条件を揃えるため、常に LANG=C に設定してから計測したほうが良いかと思います。
次が、同じマシンで LANG=C にした場合の結果です。
[root@hoge ~]# LANG=C
[root@hoge ~]# echo $LANG
C
[root@hoge ~]# time for ((i=0;++i<1000000;))
> do
> :
> done

real 0m3.212s
user 0m3.045s
sys 0m0.171s
ってことは、場合によっては、スクリプトの冒頭で。。。ですね。せこい最適化の前にやることはあるでしょうけど。

(2) sysbench
[root@hoge ~]# sysbench --test=cpu run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000


Test execution summary:
    total time:                          9.1036s
    total number of events:              10000
    total time taken by event execution: 9.1029
    per-request statistics:
         min:                                  0.88ms
         avg:                                  0.91ms
         max:                                  1.07ms
         approx.  95 percentile:               0.93ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   9.1029/0.00
このベンチは、EPEL に収録されているので、RHEL/CentOS なら、簡単にインストールできます。操作も簡単です。
テストの種類はいろいろと用意されていますが、--test=cpu と --test=memory をよく使います。簡単なので。

(3) 姫野ベンチ
[root@hoge ~]# ./bmt
mimax = 129 mjmax = 129 mkmax = 257
imax = 128 jmax = 128 kmax =256
 Start rehearsal measurement process.
 Measure the performance in 3 times.

 MFLOPS: 1898.971870 time(s): 0.216599 1.733593e-03

 Now, start the actual measurement process.
 The loop will be excuted in 831 times
 This will take about one minute.
 Wait for a while

 Loop executed for 831 times
 Gosa : 8.213920e-04 
 MFLOPS measured : 1959.001846 cpu : 58.159398
 Score based on Pentium III 600MHz : 23.890266
理研が公開しているベンチマークです。こちらはコンパイルが必要ですが、make 一発なので、容易だと思います。
上の結果は、C, static allocate version M のものです。
C, dynamic allocate version というのも用意されています。下が実行例です。
[root@hoge ~]# ./hime
For example: 
 Grid-size= XS (32x32x64)
     S  (64x64x128)
     M  (128x128x256)
     L  (256x256x512)
     XL (512x512x1024)

Grid-size = M

mimax = 128 mjmax = 128 mkmax = 256
imax = 127 jmax = 127 kmax =255
 Start rehearsal measurement process.
 Measure the performance in 3 times.

 MFLOPS: 322.654502 time(s): 1.249692 1.733593e-03

 Now, start the actual measurement process.
 The loop will be excuted in 144 times
 This will take about one minute.
 Wait for a while

 Loop executed for 144 times
 Gosa : 1.308934e-03 
 MFLOPS measured : 331.831996 cpu : 58.326202
 Score based on Pentium III 600MHz using Fortran 77: 4.046732

(4) memtest86+
これは、ベンチマークが主目的ではないですが、メモリ性能の確認にも使います。

2016-01-17追記
手持ちマシン等のデータを集めてみようと思います。随時追加していくつもり。
CPU (1) 100万回
ループ
(2) sysbench
CPU
(3) 姫野ベンチ
bmt
備考
x y z u v
Pentium 4 3.06GHz 10.2 31.1 415 2002年発表
CentOS6(i686)で計測
Core 2 Duo L7100 1.20GHz 9.5 (107%) 34.0 (91%) 519 (125%) 2007年発表
CentOS7(x86_64)で計測
Pentium D 950 3.40GHz 8.9 (115%) 20.6 (151%) 890 (214%) 2006年Q1
Core 2 X6800 2.93GHz 4.3 (237%) 16.0 (194%) 1025 (247%) 2006年Q3
Core 2 QX6800 2.93GHz 4.3 (237%) 16.0 (194%) 1037 (250%) 2007年Q2
Core i7 620M 2.67GHz 3.7 (276%) 8.7 (359%) 1368 (330%) 2010年Q1
Core i7 2960XM 2.70GHz 3.2 (319%) 9.1 (342%) 2516 (606%) 2011年Q4
Core i5 4670 3.40GHz 2.6 (392%) 8.1 (384%) 2945 (710%) 2013年Q2
Core i7 7500U 2.70GHz 3.4 (300%) 8.3 (374%) 4090 (985%) 2016年Q3 2019.11追記
Core i7 8565U 1.80GHz 1.6 (637%) 6.9 (450%) 7110 (1713%) 2018年Q3 2019.12追記
CentOS8(x86_64)で計測
括弧内%は、Pentium 4 3.06GHz を基準にした性能比です。
また、マルチコアは考慮されていません。
sysbench であれば、コマンドラインオプションとして --num-threads=コア数 を付与すれば、マルチコアを使ったベンチができます。そのうち計測してみたいと思ってます。

2016-02-03追記
sysbench --num-threads=T --test=cpu run を計測した値。
CPU コア数 スレッド数 sysbench
CPU
備考
x c T S v
Pentium 4 3.06GHz 1 2 25.3 2002年発表
Core 2 Duo L7100 1.20GHz 2 2 20.0 (126%) 2007年
Pentium D 950 3.40GHz 2 2 10.6 (239%) 2006年Q1
Core 2 X6800 2.93GHz 2 2 8.1 (312%) 2006年Q3
Core 2 QX6800 2.93GHz 4 4 4.1 (617%) 2007年Q2
Core i7 620M 2.67GHz 2 4 3.5 (723%) 2010年Q1
Xeon E3-1270 3.40GHz 4 8 1.4 (1807%) 2011年Q2
Core i7 2960XM 2.70GHz 4 8 1.5 (1687%) 2011年Q4
Core i5 4670 3.40GHz 4 4 2.2 (1150%) 2013年Q2
Core i7 7500U 2.70GHz 2 4 2.33 (1086%) 2016年Q3 2019.11追記
Core i7 8565U 1.80GHz 4 8 1.33 (1902%) 2018年Q3 2019.12追記
括弧内%は、Pentium 4 3.06GHz を基準にした性能比です。技術の進歩を感じますね。


■関連記事
Linux 上でメモリ帯域幅をベンチマーク


人気ブログランキングへ にほんブログ村 IT技術ブログへ