様々なマシンをいろいろとベンチマーク。

なんかいろいろとデータを記録しておきます。。。

– Ubuntu Server 12.04LTS amd64, Celeron G540, 8GBDRAM * 2(DDR3-1600、おそらくは1066MHz動作(G540により))、500GBHDD(Seagate)、いわゆるNEC安鯖(Express5800/S70 タイプhf)でメモリを交換しただけ。

root@pikachu:~# uname -a
Linux pikachu 3.2.0-35-generic #55-Ubuntu SMP Wed Dec 5 17:42:16 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

root@pikachu:~# dd if=/dev/zero of=/dev/null bs=1024K count=100000
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB) copied, 7.31511 s, 14.3 GB/s
#↑同じマシンで20.1GB/s出たことがあるのに何故?な値だ。。。
# もしかしてi386かamd64の違いだろうか。
# しかもi386の方が上疑惑。検証しないと。

root@pikachu:~# dd if=/dev/zero of=testfile bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 1.90824 s, 563 MB/s
# メモリ16GBマシンだから相当キャッシュされていて正確な値では無さそう↑

root@pikachu:~# dd if=/dev/zero of=testfile bs=1024 count=5048576
5048576+0 records in
5048576+0 records out
5169741824 bytes (5.2 GB) copied, 37.0371 s, 140 MB/s
# ↑というわけでちょっと増やしてみたら順当に。

root@pikachu:~# modinfo e1000e
filename:       /lib/modules/3.2.0-35-generic/kernel/drivers/net/e1000e/e1000e.ko
version:        2.1.4-NAPI
license:        GPL
description:    Intel(R) PRO/1000 Network Driver

root@pikachu:~# ping -c10 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.025 ms
64 bytes from localhost (127.0.0.1): icmp_req=2 ttl=64 time=0.015 ms
64 bytes from localhost (127.0.0.1): icmp_req=3 ttl=64 time=0.014 ms
64 bytes from localhost (127.0.0.1): icmp_req=4 ttl=64 time=0.016 ms
64 bytes from localhost (127.0.0.1): icmp_req=5 ttl=64 time=0.015 ms
64 bytes from localhost (127.0.0.1): icmp_req=6 ttl=64 time=0.016 ms
64 bytes from localhost (127.0.0.1): icmp_req=7 ttl=64 time=0.015 ms
64 bytes from localhost (127.0.0.1): icmp_req=8 ttl=64 time=0.015 ms
64 bytes from localhost (127.0.0.1): icmp_req=9 ttl=64 time=0.016 ms
64 bytes from localhost (127.0.0.1): icmp_req=10 ttl=64 time=0.016 ms

--- localhost ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 8998ms
rtt min/avg/max/mdev = 0.014/0.016/0.025/0.004 ms

root@pikachu:~# redis-server -v
Redis server version 2.2.12 (00000000:0)

root@pikachu:~# redis-benchmark 
====== PING (inline) ======
  10000 requests completed in 0.08 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
128205.12 requests per second

====== PING ======
  10000 requests completed in 0.07 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
140845.06 requests per second

====== MSET (10 keys) ======
  10000 requests completed in 0.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
90090.09 requests per second

====== SET ======
  10000 requests completed in 0.07 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
142857.14 requests per second

====== GET ======
  10000 requests completed in 0.07 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
142857.14 requests per second

====== INCR ======
  10000 requests completed in 0.07 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
142857.14 requests per second

# incr 14万 req/sec は爆速!


– Ubuntu Server 12.04LTS i386, Celeron G540, 2GBDRAM * 2(DDR3-1333、おそらくは1066MHz動作(G540により))、500GBHDD(Seagate)、いわゆるNEC安鯖(Express5800/S70 タイプhf)でメモリを交換しただけ。↑のマシンとの違いは、i386かamd64か、メモリが4GBか16GBか、です。さらに言えば、Linux Kernelで、3.2.0-35-generic-paeか3.2.0-35-genericかの違いもある。PAEとは、メモリ4GBを超えて扱うための何かのようです。
kawa@kairyu:~$ uname -a
Linux kairyu 3.2.0-35-generic-pae #55-Ubuntu SMP Wed Dec 5 18:04:39 UTC 2012 i686 i686 i386 GNU/Linux

kawa@kairyu:~$ dd if=/dev/zero of=/dev/null bs=1024K count=100000
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB) copied, 5.23128 s, 20.0 GB/s
# うーん、やはり20GB/s出た。
# i386の方がmemory bandwidthが広い感じ。。。なぜか分からない。
# amd64の方はなぜ14GB/s程度しか出ないのだろう。

kawa@kairyu:~$ dd if=/dev/zero of=testfile bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 6.72893 s, 160 MB/s
# こちらはごく普通。

kawa@kairyu:~$ dd if=/dev/zero of=testfile bs=1024 count=5048576
5048576+0 records in
5048576+0 records out
5169741824 bytes (5.2 GB) copied, 35.8888 s, 144 MB/s
# やはり140MB/sのようで。

kawa@kairyu:~$ modinfo e1000e
filename:       /lib/modules/3.2.0-35-generic-pae/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
version:        1.5.1-k
license:        GPL
description:    Intel(R) PRO/1000 Network Driver
# 古いNICのversionのまま。

kawa@kairyu:~$ ping -c10 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.029 ms
64 bytes from localhost (127.0.0.1): icmp_req=2 ttl=64 time=0.015 ms
64 bytes from localhost (127.0.0.1): icmp_req=3 ttl=64 time=0.014 ms
64 bytes from localhost (127.0.0.1): icmp_req=4 ttl=64 time=0.019 ms
64 bytes from localhost (127.0.0.1): icmp_req=5 ttl=64 time=0.017 ms
64 bytes from localhost (127.0.0.1): icmp_req=6 ttl=64 time=0.017 ms
64 bytes from localhost (127.0.0.1): icmp_req=7 ttl=64 time=0.017 ms
64 bytes from localhost (127.0.0.1): icmp_req=8 ttl=64 time=0.016 ms
64 bytes from localhost (127.0.0.1): icmp_req=9 ttl=64 time=0.016 ms
64 bytes from localhost (127.0.0.1): icmp_req=10 ttl=64 time=0.016 ms

--- localhost ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 8997ms
rtt min/avg/max/mdev = 0.014/0.017/0.029/0.006 ms

root@kairyu:~# redis-server -v
Redis server version 2.2.12 (00000000:0)

root@kairyu:~# redis-benchmark 
====== PING (inline) ======
  10000 requests completed in 0.08 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1
123456.79 requests per second

====== PING ======
  10000 requests completed in 0.08 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1
128205.12 requests per second

====== MSET (10 keys) ======
  10000 requests completed in 0.13 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

99.41% <= 1 milliseconds
100.00% <= 1 milliseconds
76335.88 requests per second

====== SET ======
  10000 requests completed in 0.08 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1
131578.95 requests per second

====== GET ======
  10000 requests completed in 0.08 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
128205.12 requests per second

====== INCR ======
  10000 requests completed in 0.08 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1
131578.95 requests per second
# redis-benchmarkで12万req/secを超えてくるとか凄まじいですね。


– CentOS 6.3(final) x86_64, Celeron G540, 2GBDRAM * 2(DDR3-1333、おそらくは1066MHz動作(G540により))、500GBHDD(Seagate)、いわゆるNEC安鯖(Express5800/S70 タイプhf)でメモリを交換しただけ。
[root@piyo ~]# uname -a
Linux piyo.local 2.6.32-279.19.1.el6.x86_64 #1 SMP Wed Dec 19 07:05:20 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
# CentOSだけあって、Linux Kernelが古い。。。安定性重視だから仕方ないか(´・ω・`)

[root@piyo ~]# cat /etc/redhat-release 
CentOS release 6.3 (Final)

[root@piyo ~]# dd if=/dev/zero of=/dev/null bs=1024K count=100000
100000+0 records in
100000+0 records out
104857600000 bytes (105 GB) copied, 7.20392 s, 14.6 GB/s
# amd64系は14GB/sぐらいの帯域になるものなのだろうか?CentOSでも、i386なら20GB/s出るのだろうか?

[root@piyo ~]# dd if=/dev/zero of=testfile bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes (1.1 GB) copied, 4.8601 s, 221 MB/s

[root@piyo ~]# dd if=/dev/zero of=testfile bs=1024 count=5048576
dd: writing `testfile': No space left on device
3041201+0 records in
3041200+0 records out
3114188800 bytes (3.1 GB) copied, 33.8949 s, 91.9 MB/s
# なんかトロいですね。。。

[root@piyo ~]# hdparm -tT /dev/sda
/dev/sda:
 Timing cached reads:   7836 MB in  2.00 seconds = 3919.63 MB/sec
 Timing buffered disk reads:  430 MB in  3.01 seconds = 142.83 MB/sec
# 気になってhdparmしてみました↑。これだと普通。

[root@piyo ~]# modinfo e1000e
filename:       /lib/modules/2.6.32-279.19.1.el6.x86_64/kernel/drivers/net/e1000e/e1000e.ko
version:        1.9.5-k
license:        GPL
description:    Intel(R) PRO/1000 Network Driver

[root@piyo ~]# ping -c10 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.026 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.021 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.019 ms
64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.023 ms
64 bytes from localhost (127.0.0.1): icmp_seq=6 ttl=64 time=0.021 ms
64 bytes from localhost (127.0.0.1): icmp_seq=7 ttl=64 time=0.022 ms
64 bytes from localhost (127.0.0.1): icmp_seq=8 ttl=64 time=0.022 ms
64 bytes from localhost (127.0.0.1): icmp_seq=9 ttl=64 time=0.023 ms
64 bytes from localhost (127.0.0.1): icmp_seq=10 ttl=64 time=0.021 ms

--- localhost ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 8999ms
rtt min/avg/max/mdev = 0.019/0.022/0.026/0.002 ms
# pingが少々トロい!常に0.02msecは切って欲しい!なぜ遅いのでしょう。

[piyo@piyo redis-2.6.9]$ ./src/redis-server -v
Redis server v=2.6.9 sha=00000000:0 malloc=jemalloc-3.2.0 bits=64

[piyo@piyo redis-2.6.9]$ ./src/redis-benchmark 
====== PING_INLINE ======
  10000 requests completed in 0.09 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
108695.65 requests per second

====== PING_BULK ======
  10000 requests completed in 0.09 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
111111.11 requests per second

====== SET ======
  10000 requests completed in 0.09 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
112359.55 requests per second

====== GET ======
  10000 requests completed in 0.09 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
111111.11 requests per second

====== INCR ======
  10000 requests completed in 0.09 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

100.00% <= 0 milliseconds
114942.53 requests per second
# 同じマシンのubuntu 12.04 server amd64だと14万req/secなのですがこちらは遅いですね。
# linux kernelが2.6系と古いからでしょうか。
# それとgccが(比較的)古い影響もありそうです。

– Ubuntu 12.04.2(i386), G530, DRAM 4GB * 2, 250GBHDD(2.5inch, Seagate), H67M-D2-B3
# lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 12.04.2 LTS
Release:	12.04
Codename:	precise

# uname -a
Linux g530 3.5.0-26-generic #42~precise1-Ubuntu SMP Mon Mar 11 22:19:42 UTC 2013 i686 i686 i386 GNU/Linux

# dd if=/dev/zero of=/dev/null bs=1024K count=100000
100000+0 レコード入力
100000+0 レコード出力
104857600000 バイト (105 GB) コピーされました、 5.28435 秒、 19.8 GB/秒

# dd if=/dev/zero of=testfile bs=1024 count=5048576
5048576+0 レコード入力
5048576+0 レコード出力
5169741824 バイト (5.2 GB) コピーされました、 68.057 秒、 76.0 MB/秒

# ↓(redis2.6.12)
# ./src/redis-benchmark -q
PING_INLINE: 91743.12 requests per second
PING_BULK: 98039.22 requests per second
SET: 98039.22 requests per second
GET: 98039.22 requests per second
INCR: 99009.90 requests per second
LPUSH: 99009.90 requests per second
LPOP: 98039.22 requests per second
SADD: 100000.00 requests per second
SPOP: 100000.00 requests per second
LPUSH (needed to benchmark LRANGE): 100000.00 requests per second
LRANGE_100 (first 100 elements): 38910.50 requests per second
LRANGE_300 (first 300 elements): 14992.50 requests per second
LRANGE_500 (first 450 elements): 10515.25 requests per second
LRANGE_600 (first 600 elements): 8169.93 requests per second
MSET (10 keys): 70422.54 requests per second
↑、redisの速度があまり伸びませんね。。。10万を軽く超えて欲しいものですが。組んだ直後にやってみたときは10万を超えていたのですが、IPアドレスやらupdateやら設定していたらこの速度に。。。

Linux、Mac、FreeBSDでMemoryの帯域やストレージの速度を計測

計測したくなるときはありますね。。。

Mac メモリ帯域↓

$ dd if=/dev/zero of=/dev/null bs=1024*1024 count=100000
100000+0 records in
100000+0 records out
104857600000 bytes transferred in 11.528902 secs (9095193932 bytes/sec)

# GBに変換
$ php -r 'echo 9095193932 / 1024 / 1024 / 1024 . " GB/s\n";'
8.4705594293773 GB/s
# ↑少々怪しいコマンドみたいです。メモリ速度が適切に計測されているかどうかは微妙とのこと。。。

Mac ストレージ速度↓
$ dd if=/dev/zero of=testfile bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes transferred in 5.993834 secs (179141067 bytes/sec)

# MBに変換(SSD(Intel SSD330)なので早いです)
$ php -r 'echo 179141067 /1024 / 1024 . " MB/s\n";'
170.84223461151 MB/s

# 作ったファイルを消しておきます
$ rm testfile

Linux メモリ帯域↓
$ dd if=/dev/zero of=/dev/null bs=1024K count=100000
100000+0 レコード入力
100000+0 レコード出力
104857600000 バイト (105 GB) コピーされました、 14.7641 秒、 7.1 GB/秒

Linux HDD速度↓
$ dd if=/dev/zero of=testfile bs=1024 count=1048576
1048576+0 レコード入力
1048576+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 8.01213 秒、 134 MB/秒
↑ これはVM上のLinuxなのですが、かなり速度が出ていますね。生の最近のHDDのシーケンシャルが150MB/sぐらいですが、ハイパーバイザーは優秀なんですね。ちなみにこのコマンドを、別の物理マシン(ThinkPad T400sデフォルト設定、確か1.8inch HDD搭載)でやってみたら、42.0MB/sだったので、正しいコマンドだと思います。

FreeBSDの結果↓
# Memory Bandwidth
root@freebsd9: $ dd if=/dev/zero of=/dev/null bs=1024K count=100000
100000+0 records in
100000+0 records out
104857600000 bytes transferred in 4.923636 secs (21296781659 bytes/sec)
root@freebsd9: $ php -r 'echo 21296781659 / 1024 / 1024 / 1024 . " GB/s\n";'
19.834173525684 GB/s

# HDD
root@freebsd9: $ dd if=/dev/zero of=testfile bs=1024 count=1048576
1048576+0 records in
1048576+0 records out
1073741824 bytes transferred in 7.307232 secs (146942345 bytes/sec)
root@freebsd9: $ php -r 'echo 146942345 / 1024 / 1024 . " MB/s\n";'
140.13514041901 MB/s

蛇足、↑のFreeBSDのスペック:
– NEC Express5800/S70 タイプhf NP8100-9023PS03(メモリのみ増設)
– Celeron G540 (2C/2.50GHz/2M)
– DDR3-1066 Sumsung DRAM 2GB * 2
– C216チップセット
– Seagate 500GBHDD
メモリ帯域がやたらと大きいので驚きました。ちなみにこのマシンでLinuxを入れて測定した時もそのぐらい出ていました。G540のメモリ帯域は、Intel公式によると 17 GB/s なのですがね。超えてますね。ワークステーション向けチップセットが関係しているのかなと思いましたが、昨今のCPUはメモリーコントローラ内蔵ですのであまり関係なさそうですね。ちなみに何度かやってみると、20GB/sを超えることすらありました。不思議です。