UnixBenchで仮想サーバのベンチマークを行なう

Updated:

Linux/Unixの性能を比較するのに、UnixBenchというベンチマークテストがよく使われます。このエントリは、Ubuntuで、UnixBenchを実行する手順のメモです。

UnixBenchを実行するには、makeとgccが必要です。それぞれ同名のパッケージをインストールします。

$ sudo apt-get install make gcc

UnixBenchのソースファイルをダウンロード、展開します。2014/5/11時点では、最新版はバージョン5.1.3です。

$ wget https://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
$ tar xvzf UnixBench5.1.3.tgz

ソースはUnixBenchというディレクトリに展開されるので、そこにcdして、ベンチマークを実行します。実行には結構時間がかかります。

$ cd UnixBench/
$ ./Run

実行結果は標準出力に表示されます。次の例は、さくらVPS 2G(3 CPU、メモリ: 2GByte、HDD)の実行結果です。

スコアは2344.6(150行目)。マルチCPUの場合には、1CPUのスコア858.7も表示されます(117行目)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
UnixBench実行結果

さくらVPS 2G

1CPU   858.7
3CPU  2344.6

----------------------------------------------------------------------
   #    #  #    #  #  #    #          #####   ######  #    #   ####   #    #
   #    #  ##   #  #   #  #           #    #  #       ##   #  #    #  #    #
   #    #  # #  #  #    ##            #####   #####   # #  #  #       ######
   #    #  #  # #  #    ##            #    #  #       #  # #  #       #    #
   #    #  #   ##  #   #  #           #    #  #       #   ##  #    #  #    #
    ####   #    #  #  #    #          #####   ######  #    #   ####   #    #

   Version 5.1.3                      Based on the Byte Magazine Unix Benchmark

   Multi-CPU version                  Version 5 revisions by Ian Smith,
                                      Sunnyvale, CA, USA
   January 13, 2011                   johantheghost at yahoo period com


1 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput  1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

1 x File Copy 256 bufsize 500 maxblocks  1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

1 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

1 x Process Creation  1 2 3

1 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent)  1 2 3

1 x Shell Scripts (8 concurrent)  1 2 3

3 x Dhrystone 2 using register variables  1 2 3 4 5 6 7 8 9 10

3 x Double-Precision Whetstone  1 2 3 4 5 6 7 8 9 10

3 x Execl Throughput  1 2 3

3 x File Copy 1024 bufsize 2000 maxblocks  1 2 3

3 x File Copy 256 bufsize 500 maxblocks  1 2 3

3 x File Copy 4096 bufsize 8000 maxblocks  1 2 3

3 x Pipe Throughput  1 2 3 4 5 6 7 8 9 10

3 x Pipe-based Context Switching  1 2 3 4 5 6 7 8 9 10

3 x Process Creation  1 2 3

3 x System Call Overhead  1 2 3 4 5 6 7 8 9 10

3 x Shell Scripts (1 concurrent)  1 2 3

3 x Shell Scripts (8 concurrent)  1 2 3

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: crewe: GNU/Linux
   OS: GNU/Linux -- 3.2.0-24-generic -- #39-Ubuntu SMP Mon May 21 16:52:17 UTC 2012
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Westmere E56xx/L56xx/X56xx (Nehalem-C) (4800.2 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSCALL/SYSRET
   CPU 1: Westmere E56xx/L56xx/X56xx (Nehalem-C) (4800.2 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSCALL/SYSRET
   CPU 2: Westmere E56xx/L56xx/X56xx (Nehalem-C) (4800.2 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSCALL/SYSRET
   11:01:51 up 28 days, 23:04,  2 users,  load average: 0.39, 0.17, 0.11; runlevel 2

------------------------------------------------------------------------
Benchmark Run: Sun May 11 2014 11:01:51 - 11:29:58
3 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       23048603.3 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     2922.5 MWIPS (10.0 s, 7 samples)
Execl Throughput                               1750.2 lps   (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        711947.7 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          204926.8 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1440846.8 KBps  (30.0 s, 2 samples)
Pipe Throughput                             1707528.4 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  12367.7 lps   (10.0 s, 7 samples)
Process Creation                               3317.0 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   5002.2 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1527.1 lpm   (60.0 s, 2 samples)
System Call Overhead                        3041492.1 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   23048603.3   1975.0
Double-Precision Whetstone                       55.0       2922.5    531.4
Execl Throughput                                 43.0       1750.2    407.0
File Copy 1024 bufsize 2000 maxblocks          3960.0     711947.7   1797.8
File Copy 256 bufsize 500 maxblocks            1655.0     204926.8   1238.2
File Copy 4096 bufsize 8000 maxblocks          5800.0    1440846.8   2484.2
Pipe Throughput                               12440.0    1707528.4   1372.6
Pipe-based Context Switching                   4000.0      12367.7     30.9
Process Creation                                126.0       3317.0    263.3
Shell Scripts (1 concurrent)                     42.4       5002.2   1179.8
Shell Scripts (8 concurrent)                      6.0       1527.1   2545.1
System Call Overhead                          15000.0    3041492.1   2027.7
                                                                   ========
System Benchmarks Index Score                                         858.7

------------------------------------------------------------------------
Benchmark Run: Sun May 11 2014 11:29:58 - 11:58:14
3 CPUs in system; running 3 parallel copies of tests

Dhrystone 2 using register variables       61617995.0 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     8639.3 MWIPS (9.7 s, 7 samples)
Execl Throughput                               7591.2 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        751724.9 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          203754.0 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1624047.6 KBps  (30.0 s, 2 samples)
Pipe Throughput                             4786270.2 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 554642.7 lps   (10.0 s, 7 samples)
Process Creation                              20066.9 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  11306.3 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   1731.6 lpm   (60.1 s, 2 samples)
System Call Overhead                        6606973.4 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   61617995.0   5280.0
Double-Precision Whetstone                       55.0       8639.3   1570.8
Execl Throughput                                 43.0       7591.2   1765.4
File Copy 1024 bufsize 2000 maxblocks          3960.0     751724.9   1898.3
File Copy 256 bufsize 500 maxblocks            1655.0     203754.0   1231.1
File Copy 4096 bufsize 8000 maxblocks          5800.0    1624047.6   2800.1
Pipe Throughput                               12440.0    4786270.2   3847.5
Pipe-based Context Switching                   4000.0     554642.7   1386.6
Process Creation                                126.0      20066.9   1592.6
Shell Scripts (1 concurrent)                     42.4      11306.3   2666.6
Shell Scripts (8 concurrent)                      6.0       1731.6   2886.0
System Call Overhead                          15000.0    6606973.4   4404.6
                                                                   ========
System Benchmarks Index Score                                        2344.6

npmでパッケージインストール時に、依存パッケージが見つからないというエラーを回避する

Updated:

npmでパッケージをインストールしている際に、依存パッケージが見つからずにエラーになってしまうことがあります。

次の例では、generator-marionetteパッケージをインストールしている際に、colorsパッケージのバージョン0.3.0がインストールできずにエラーになっています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
cond@derby:marionette-x$ npm install generator-marionette
npm http GET https://registry.npmjs.org/generator-marionette
npm http 200 https://registry.npmjs.org/generator-marionette
npm http GET https://registry.npmjs.org/generator-marionette/-/generator-marionette-0.1.5.tgz
npm http 200 https://registry.npmjs.org/generator-marionette/-/generator-marionette-0.1.5.tgz
npm http GET https://registry.npmjs.org/generator-buster
npm http GET https://registry.npmjs.org/underscore.string
 
......
 
npm http GET http://packages:5984/colors/-/colors-0.3.0.tgz
npm ERR! fetch failed http://packages:5984/colors/-/colors-0.3.0.tgz
npm ERR! network getaddrinfo ENOTFOUND
npm ERR! network This is most likely not a problem with npm itself
npm ERR! network and is related to network connectivity.
npm ERR! network In most cases you are behind a proxy or have bad network settings.
npm ERR! network
npm ERR! network If you are behind a proxy, please make sure that the
npm ERR! network 'proxy' config is set properly.  See: 'npm help config'
 
npm ERR! System Linux 3.2.0-58-generic
npm ERR! command "/home/cond/nvm/v0.10.25/bin/node" "/home/cond/nvm/v0.10.25/bin/npm" "install" "generator-marionette"
npm ERR! cwd /home/cond/tmp/marionette-x
npm ERR! node -v v0.10.25
npm ERR! npm -v 1.3.24
npm ERR! syscall getaddrinfo
npm ERR! code ENOTFOUND
npm ERR! errno ENOTFOUND
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /home/cond/tmp/marionette-x/npm-debug.log
npm ERR! not ok code 0
cond@derby:marionette-x$

これは、リポジトリ(?)に記録されているcolorsパッケージのURLのホスト名が間違っているのが原因です。

対症療法ですが、あらかじめ単独でcolors@0.3.0をインストールしておけば、問題なくインストールできます。

具体的には、11行目に示されているURL

http://packages:5984/colors/-/colors-0.3.0.tgz

の「packages:5984」という部分を「registry.npmjs.org」に置き換えたURLを指定して、npm installを実行します。

つまり、コマンド

$ npm install http://registry.npmjs.org/colors/-/colors-0.3.0.tgz

を実行すれば、colorパッケージのバージョン0.3.0がインストールされます。

cond@derby:marionette-x$ npm install http://registry.npmjs.org/colors/-/colors-0.3.0.tgz
npm http GET http://registry.npmjs.org/colors/-/colors-0.3.0.tgz
npm http 200 http://registry.npmjs.org/colors/-/colors-0.3.0.tgz
colors@0.3.0 node_modules/colors
cond@derby:marionette-x$

これでcolors@0.3.0がインストールできました。もう1度次のコマンドを実行してやれば、今度は失敗せずにgenerator-marionetteパッケージがインストールされます。

$ npm install generator-marionette

Android端末のCPUの動作状況を表示するツールCPU Spy

Updated:

Androidに限らずモバイル機能は、バッテリー消費を抑えるために、CPUの動作周波数を自動的に変更するようになっています。動作周波数が高いと、きびきびと動作しますが、その代わりに電力をたくさん使います。ですから、CPUが行なう処理が少なくなると、動作周波数を低くして消費電力を抑えてバッテリーを長持ちさせようとします。

どんな感じで周波数の切り替えが行なわれているのかを知りたいと思うのが人情です。調べてみると、CPU Spyというソフトを使えば、各周波数での実行時間の割合を表示することができることがわかりました。

そこで、このCPU Spyをインストールしてみました。

CPU Spy(Google Play)

使い方は簡単で、CPU Spyを起動すると、各周波数での動作時間の割合がグラフで表示されます。

私はAndroid端末を2つ持っています。1つはスマートフォンGalaxy S III Progre、もう1つは7インチタブレットASUS MEMO Pad HD7です。

Galaxy S IIIではこんな感じです。

ASUS MEMO Padではこんな感じです。

Total State Timeが、電源ONあるいはリセット(再起動)からの総経過時間です。

Deep SleepというのはCPUがスリープしている状態で、どちらの端末も約85%の時間はこのモードになっていることがわかります。

Galaxyの方が周波数の段階数が多く、きめ細かく制御しているようです。一方、ASUS MEMO Padは、周波数が4段階しかありません。

また、一番良く使われている周波数は、Galaxyが384MHz(最も低い周波数)であるのに対して、ASUS MEMO Padは1209MHz(最も高い周波数)となっています。(どちらの端末も省電力モードにしています。)

おそらく、7インチタブレットであるASUS MEMO Padの方が、バッテリー容量が大きいので、その分速い周波数で動作させる余裕があるのでしょう。

CPU Spyは3つ設定項目があり、メニューから選択できます。

  • Refreshは、表示する情報を更新します。
  • Reset Timersは、すべての表示項目をゼロにリセットします。つまり、この時点から測定を開始します。
  • Restore Timersは、Reset Timersでリセットした後に、以前に表示したいたデータに戻します。

Emacsにanything.elを導入しました

Updated:

いまさらながらですが、Emacs 23.3.1にanything.elをインストールしたので、手順をメモしておきます。

1. パッケージをインストールする

M-x auto-install-batchを実行して、パッケージ名としてanythingを入力するとanything.elに必要なファイル(複数)をダウンロードしてくれます。あとはダウンロードしたファイル名が次々と表示されるので、C-c C-cでバイトコンパイルすればインストールされます。

2. .emacsに設定を追加する

次の1行を~/.emacsに追加すると、anything.elが有効になります。

(require 'anything-startup)

3. anythingを起動するキーを設定する

M-x anythingとタイプすると、anything.elを起動されます。しかし、毎回M-x anythingとタイプするのは面倒なので、キーを割り当てましょう。

自分はC-x C-aに割り当ててみました。次の1行を~/.emacsに追加します。

(define-key global-map (kbd "C-x C-a") 'anything)

これでC-x C-aとタイプするとanythingが起動されるようになりました。

とりあえずは特に設定は行なわずに、デフォルトの状態で使っています。この状態では、バッファとファイル(最近使ったファイル、カレントディレクトリのファイル)をサーチするだけですが、これだけでもなかなか便利です。

そのうちanything.elの機能を調べて、いろいろとカスタマイズしていきたいと思います。

YAPC::Asia Tokyo 2013に参加しました

Updated:


9/20から9/21に開催されたYAPC::Asia Tokyo 2013に参加しました。会場は、慶應義塾大学日吉キャンパスの協生館でした。協生館は名前は古風ですが、新しいモダンな建物で、全席に電源が用意されている素晴らしい会場でした。HUBという名前のパブもあり、さすが慶應という感じです。

1日目(9/20)には次のセッションを聞きました。

1日目は、貧乏性なので、ほぼ1日中セッションに参加していました。本当はセッションはほどほどにして、ウダウダするのも良いですが。

「大規模Perl初心者研修を支える技術」はDeNAで71人の新卒エンジニアの研修をどのように進めたかという話でした。非常に参考になりました。DeNAは人材育成にすごく注力していますね。

「僕の考えたFuture Perl」は、Perl 6の歴史と実装の話が面白かったです。Perl 6にはさまざまな(不完全な)実装があってややこしいのですが、かなりクリアになりました。またPerl5上で、Perl6の構文を扱えるようにするSeisの紹介がありました。

1日目夜の懇親会にも参加しましたが、料理とお酒がふんだんに用意されていました。スポンサーのDeNAさんには大感謝です。

2日目(9/21)は、午前中に用事があり、会場には14時過ぎに到着しました。まずPerl入学式@YAPCを見学させてもらいました。熱気が溢れていました。

2日目は次のセッションに参加しました。

「p2」は、Perl5とPerl6の両方に対応したVMの話でした。高速化のためにいろいろと工夫しているとのこと。私は言語処理系が好きなので、p2の話は興味深いものでした。

また言語処理系関連では、「これからのPerlプロダクトのかたち」をぜひ聞きたかったのですが、午前中だったので聞けませんでした。残念。

ライトニングトークでは、竹迫さんのPerlクイズで、最後の問題(特殊変数$^Fに関するもの)に答えて、竹迫さんの訳書「ECMA-262 Edition 5.1を読む」を賞品としていただきました。

ちなみに、出題された特殊変数は$[、$]、$^Fの3つで、「何てマニアックな出題なんだ!!」と思いました。Perlを使いこなしている人でもこんなの知らないです、普通(笑)。

クロージングでは、長年にわたってYAPC::Asiaの運営をされてきた櫛井さん(@941)と牧さん(@lestrrat)のコンビが今回限りで引退することが発表されました。長い間、ありがとうございました。

近藤は今回はトークは無しで、まったくの参加者モードで参加しました。多くのセッションを聞き、いろんな人と話をして、やる気がフル充填されました。スタッフのみなさん、発表者のみなさん、そして参加者のみなさん、素晴らしいYAPC::Asia 2013をありがとうございました!