Kestrel覚書

Kestrel覚書

どうみてもここを参照しました。というかこのまんま。バージョンだけ新しいです。 -> PHP+Kestrel+Supervisorでお手軽タスクキューイング

rootでやってみました。

$ wget http://robey.github.io/kestrel/download/kestrel-2.4.1.zip
$ unzip kestrel-2.4.1.zip
$ cd kestrel-2.4.1
$ mkdir -p /var/log/kestrel
$ mkdir -p /var/spool/kestrel
$ java -jar kestrel_2.9.2-2.4.1.jar

VirtualBoxでDebianを使うときの設定

Debianを使いたくなりました。要求としては、
– Debianは、ハイパーバイザからはアクセスできるけれど外部からは出来ない
– Debianは、外部にアクセス出来る
という感じです。

この設定だと、ハイパーバイザ側のIPアドレスが変わっても(たとえば持ち運びのラップトップにVMを入れるような)、VMは正常にネットに繋げることができます。
—–追記ここから—–
@2013年4月19日

嘘を書きました。
ハイパーバイザのIPアドレスがDHCPにより割り当てられる場合、名前解決ができなくなります。
というわけで親のネットワークが変わった場合は、VM側で、
$ vi /etc/resolve.conf
などして、ハイパーバイザのIPアドレスに書き換えてくださいorz
—–追記ここまで—–

これらリンクを参考にしました↓
[virtualbox][network][tips] VirtualBox を利用する際のネットワーク設定の話
VirtualBox VMに入れたLinuxに、SSHで繋いだよ。

まず、VirtualBox側の設定です。
– VirtualBox -> 環境設定 -> ネットワーク -> 「+」アイコンを押して、vboxnet0を追加
– ↑のvboxnet0をダブルクリックすると設定が開くので、「アダプタ」タブのIPアドレスを覚えておく(例: 192.168.56.1)。ちなみにこの「アダプタ」タブの隣に「DHCP」タブがあるが、それのDHCPサーバーは無効にしておく。

そして、VirualBoxでDebianをインストールしたとします。その初期設定です。

# aptitude update
# aptitude upgrade
# aptitude install vim ufw git locales

# dpkg-reconfigure locales
# ↑ここでja_JP.UTF-8に設定する。

# ufw の設定(ポート22と80を開ける場合)
# ufw reset
# ufw default deny
# ufw allow 22
# ufw allow 80
# ufw enable

# interfaceの設定 (NAT + ホストオンリーアダプタ)
# vi /etc/network/interfaces
-----
auto lo
iface lo inet loopback

allow-hotplug eth0
auto eth0
iface eth0 inet dhcp

allow-hotplug eth1
auto eth1
iface eth1 inet static
address 192.168.56.100
network 192.168.56.0
netmask 255.255.255.0
broadcast 192.168.56.255
-----
# gatewayや、dns-serversは設定しないことが肝心です↑。ここで設定すると、デフォルトゲートウェイが2個になったりします。

# ネットワークのリスタート
# /etc/init.d/networking restart

# デフォルトゲートウェイの確認
# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.2.0        *               255.255.255.0   U     0      0        0 eth0
192.168.56.0    *               255.255.255.0   U     0      0        0 eth1
default         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
# ↑defaultが10.0.x.x系だけならOK。defaultが2個あったりするとうまく行きません。

# 最後にreboot
# reboot

Redisベンチマークを様々なマシンと条件で計測

Redisベンチマークの多くがlocalhostで行われていますが、実運用の際には別のノードになるはずです。となればスイッチやルーターやらを介するわけで環境はいろいろですね。というわけで様々な条件で計測してみます。随時更新予定です。

条件:

# 実機情報
- Redisサーバー側 (MBPとする)
-- redis-2.6.7
-- MacBookPro 2009 Mid
-- MacOS X 10.8 Mountain Lion (Darwin Kernel Version 12.3.0)
-- gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

- クライアント側 (MBとする)
-- redis-2.6.7
-- MacBook 2009 Late
-- MacOS X 10.8 Mountain Lion (Darwin Kernel Version 12.3.0)
-- gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

# ネットワーク・トポロジー
MBP <= GbE => GbE Switching Hub (BUFFALO LSW4-GT-8NS) <= GbE => MB

# Round-trip time
- MBPのlocalhostのping
-> min/avg/max/stddev = 0.052/0.078/0.090/0.014 ms

- MBP -> MBのping
-> min/avg/max/stddev = 0.417/0.514/0.607/0.057 ms

- MBのlocalhostのping
-> min/avg/max/stddev = 0.054/0.095/0.139/0.028 ms

- MB -> MBPのping
-> min/avg/max/stddev = 0.322/0.510/0.719/0.105 ms

# ネットワーク帯域
- MBP(iperf -c 10.10.10.3) -> MB(iperf -s)
-> 936 Mbits/sec

- MB(iperf -s) -> MBP(iperf -c 10.10.10.2)
-> 935 Mbits/sec

# redis-benchmark
- MB (10.10.10.3, $redis-benchmark) -> MBP (10.10.10.2, $redis-server)
$ ./src/redis-benchmark -h 10.10.10.2 -p 6379 -q -k 1 -c 100 -n 50000
PING_INLINE: 43516.10 requests per second
PING_BULK: 43668.12 requests per second
SET: 43140.64 requests per second
GET: 44326.24 requests per second
INCR: 43290.04 requests per second
LPUSH: 45167.12 requests per second
LPOP: 44523.60 requests per second
SADD: 43744.53 requests per second
SPOP: 45045.04 requests per second
LPUSH (needed to benchmark LRANGE): 45413.26 requests per second
LRANGE_100 (first 100 elements): 15605.49 requests per second
LRANGE_300 (first 300 elements): 6567.71 requests per second
LRANGE_500 (first 450 elements): 4553.73 requests per second
LRANGE_600 (first 600 elements): 3505.33 requests per second
MSET (10 keys): 31705.77 requests per second

- MBP (10.10.10.2, $redis-benchmark) -> MB (10.10.10.3, $redis-server)
$ ./src/redis-benchmark -h 10.10.10.2 -p 6379 -q -k 1 -c 100 -n 50000
PING_INLINE: 44762.76 requests per second
PING_BULK: 47258.98 requests per second
SET: 29394.47 requests per second
GET: 35285.81 requests per second
INCR: 38080.73 requests per second
LPUSH: 36205.65 requests per second
LPOP: 35997.12 requests per second
SADD: 42052.14 requests per second
SPOP: 45829.52 requests per second
LPUSH (needed to benchmark LRANGE): 43066.32 requests per second
LRANGE_100 (first 100 elements): 18375.60 requests per second
LRANGE_300 (first 300 elements): 7327.08 requests per second
LRANGE_500 (first 450 elements): 5070.48 requests per second
LRANGE_600 (first 600 elements): 3846.15 requests per second
MSET (10 keys): 25316.46 requests per second

- MB単独(redisはlocalhost)
$ ./src/redis-benchmark -p 16379 -q -k 1 -c 100 -n 50000
PING_INLINE: 30487.80 requests per second
PING_BULK: 31191.52 requests per second
SET: 28735.63 requests per second
GET: 30229.75 requests per second
INCR: 29850.75 requests per second
LPUSH: 29761.91 requests per second
LPOP: 29325.51 requests per second
SADD: 29691.21 requests per second
SPOP: 29886.43 requests per second
LPUSH (needed to benchmark LRANGE): 29655.99 requests per second
LRANGE_100 (first 100 elements): 11859.58 requests per second
LRANGE_300 (first 300 elements): 5748.45 requests per second
LRANGE_500 (first 450 elements): 4584.21 requests per second
LRANGE_600 (first 600 elements): 3455.66 requests per second
MSET (10 keys): 19960.08 requests per second

- MBP単独(redisはlocalhost)
PING_INLINE: 33003.30 requests per second
PING_BULK: 33244.68 requests per second
SET: 31152.65 requests per second
GET: 32320.62 requests per second
INCR: 31806.62 requests per second
LPUSH: 32030.75 requests per second
LPOP: 31486.14 requests per second
SADD: 30731.41 requests per second
SPOP: 33090.67 requests per second
LPUSH (needed to benchmark LRANGE): 31152.65 requests per second
LRANGE_100 (first 100 elements): 13873.47 requests per second
LRANGE_300 (first 300 elements): 6301.99 requests per second
LRANGE_500 (first 450 elements): 4816.03 requests per second
LRANGE_600 (first 600 elements): 3673.77 requests per second
MSET (10 keys): 21542.44 requests per second


総評:
MacBookとMacBookProをスイッチングハブで繋いで計測してみました。
ローカルで動かすより、クライアントとサーバーに分けたほうが高速ですね。意外です。
ローカルが遅い要因としては、
ベンチマークを取ること自体がけっこうなCPU負荷
↓
redisサーバーの性能を損ねている
のでしょうかね。


@2013年5月3日
久々の更新。Atom N2800でやってみました。また、公式ドキュメントを読みますと、

It depends on the platform, but unix domain sockets can achieve around 50% more throughput than the TCP/IP loopback (on Linux for instance)


と書いてありましたので、tcp/ipとunix domain socketを比較してみました。確かに後者の方が倍近く高速でした。

ところで、Atom N2800という、1.8GHz、2cores、L3Cache 1MB、TDP 6.5WのCPUで、tcp/ipで20K req/sec出るのですからたいしたものです。

# uname -a
Linux yoshi 2.6.32-358.2.1.el6.i686 #1 SMP Tue Mar 12 21:42:46 UTC 2013 i686 i686 i386 GNU/Linux

# cat /etc/redhat-release 
CentOS release 6.4 (Final)

# Memory Bandwidthらしきもの (これ、遅すぎませんかね。。。)
# dd if=/dev/zero of=/dev/null bs=1M count=10000
10000+0 records in
10000+0 records out
10485760000 bytes (10 GB) copied, 6.00944 s, 1.7 GB/s

# N2800内で計測。unix domain socket。なんと 40K req/ sec!
[root@yoshi: ~/my_repos/redis-2.6.7]
# ./src/redis-benchmark -q -n 10000 -s /tmp/redis.sock -d 128
PING_INLINE: 42016.81 requests per second
PING_BULK: 42194.09 requests per second
SET: 42735.04 requests per second
GET: 40485.83 requests per second
INCR: 43103.45 requests per second
LPUSH: 42553.19 requests per second
LPOP: 40322.58 requests per second
SADD: 43668.12 requests per second
SPOP: 42918.45 requests per second
LPUSH (needed to benchmark LRANGE): 42735.04 requests per second
LRANGE_100 (first 100 elements): 7047.22 requests per second
LRANGE_300 (first 300 elements): 2205.56 requests per second
LRANGE_500 (first 450 elements): 1341.38 requests per second
LRANGE_600 (first 600 elements): 992.85 requests per second
MSET (10 keys): 18315.02 requests per second

# N2800単体で計測。tcp/ip使用。20K req/sec程度。
[root@yoshi: ~/my_repos/redis-2.6.7]
# ./src/redis-benchmark -h 192.168.0.200 -p 6379 -q -n 10000 -d 128
PING_INLINE: 20703.93 requests per second
PING_BULK: 20833.33 requests per second
SET: 21008.40 requests per second
GET: 19960.08 requests per second
INCR: 21186.44 requests per second
LPUSH: 20964.36 requests per second
LPOP: 20161.29 requests per second
SADD: 21008.40 requests per second
SPOP: 20833.33 requests per second
LPUSH (needed to benchmark LRANGE): 21097.05 requests per second
LRANGE_100 (first 100 elements): 5757.05 requests per second
LRANGE_300 (first 300 elements): 1949.70 requests per second
LRANGE_500 (first 450 elements): 1328.73 requests per second
LRANGE_600 (first 600 elements): 949.22 requests per second
MSET (10 keys): 13550.14 requests per second

# MacBook 2009 lateをクライアント(redis-benchmark)、N2800をサーバーとしたとき。
# ほぼ↑と変わらないですね。ちなみにGbEルーターを1個挟んで計測しています。
$ ./src/redis-benchmark -h 192.168.0.200 -p 6379 -q -n 10000 -d 128
PING_INLINE: 20120.72 requests per second
PING_BULK: 20408.16 requests per second
SET: 17761.99 requests per second
GET: 18450.19 requests per second
INCR: 18214.94 requests per second
LPUSH: 17301.04 requests per second
LPOP: 17857.14 requests per second
SADD: 18939.39 requests per second
SPOP: 19569.47 requests per second
LPUSH (needed to benchmark LRANGE): 17761.99 requests per second
LRANGE_100 (first 100 elements): 5122.95 requests per second
LRANGE_300 (first 300 elements): 1691.19 requests per second
LRANGE_500 (first 450 elements): 1101.20 requests per second
LRANGE_600 (first 600 elements): 827.13 requests per second
MSET (10 keys): 9578.54 requests per second

# 総評
Linuxでmemorybandwidthを測るtoolとして、streamってのがあるのですが↓の結果でした@N2800。
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:            2301.3     0.069570     0.069526     0.069645
うーん、2.3GB/sですか。。。ddで簡易計測した結果よりは高速ですが、なんだか遅いですね。


@2013年5月7日
半ば趣味と化しているベンチマーク。。。ラボのマシンでやってみました。
– i7-3820
– DDR3-1600 8GB * 4 (4-channelになっているはず。。。たぶん)
– SSD 480GB (Intel SSD 520 Series)
– DX79SR
– Ubuntu 12.04 Server AMD64

追記@2015-04-23
↓で、$ numactl -C 6 ./src/redis-benchmark -q -n 100000 -s /tmp/redis.sock -d 128 としていますが、そもそもこのマシンはシングルソケット(CPUひとつ)であり、numactlは無駄な行為でした。


$ uname -a
Linux elab-i7-3820 3.5.0-23-generic #35~precise1-Ubuntu SMP Fri Jan 25 17:13:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"

# メモリ帯域らしきもの。しかしi7-3820はインテル公式に51.2GB/sって書いてあるのです。。。遅すぎませんかね。
$ dd if=/dev/zero of=/dev/null bs=100K count=100000
100000+0 records in
100000+0 records out
10240000000 bytes (10 GB) copied, 0.437345 s, 23.4 GB/s

# virginia大学のstreamというmemory bandwidth測定
$ wget http://www.cs.virginia.edu/stream/FTP/Code/stream.c
$ gcc -O stream.c -o stream
$ ./stream
-----
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:           16272.0     0.009850     0.009833     0.009874
Scale:          15801.1     0.010151     0.010126     0.010166
Add:            18248.0     0.013172     0.013152     0.013193
Triad:          17784.4     0.013512     0.013495     0.013552
-----

# 一台のマシンでredis-server/clientともに動作。Unix Domain Socket で計測。220K req/sec!
$ ./src/redis-benchmark -q -n 100000 -s /tmp/redis.sock -d 128
PING_INLINE: 219298.25 requests per second
PING_BULK: 222717.16 requests per second
SET: 224719.11 requests per second
GET: 222222.23 requests per second
INCR: 226244.34 requests per second
LPUSH: 227790.42 requests per second
LPOP: 220264.31 requests per second
SADD: 227790.42 requests per second
SPOP: 227790.42 requests per second
LPUSH (needed to benchmark LRANGE): 228832.95 requests per second
LRANGE_100 (first 100 elements): 61576.36 requests per second
LRANGE_300 (first 300 elements): 23245.00 requests per second
LRANGE_500 (first 450 elements): 13787.40 requests per second
LRANGE_600 (first 600 elements): 10295.48 requests per second
MSET (10 keys): 148148.14 requests per second

# ↑と同じ条件。差分はnumactlかどうか。↓はnumactlで動作させている。しかし結果は変わらず。
$ numactl -C 6 ./src/redis-benchmark -q -n 100000 -s /tmp/redis.sock -d 128
PING_INLINE: 222222.23 requests per second
PING_BULK: 222717.16 requests per second
SET: 226757.36 requests per second
GET: 222717.16 requests per second
INCR: 227790.42 requests per second
LPUSH: 229885.06 requests per second
LPOP: 222717.16 requests per second
SADD: 227790.42 requests per second
SPOP: 227790.42 requests per second
LPUSH (needed to benchmark LRANGE): 228832.95 requests per second
LRANGE_100 (first 100 elements): 62111.80 requests per second
LRANGE_300 (first 300 elements): 23408.24 requests per second
LRANGE_500 (first 450 elements): 13962.58 requests per second
LRANGE_600 (first 600 elements): 10214.50 requests per second
MSET (10 keys): 146842.88 requests per second

# TCP/IPで計測。だいぶ落ちました。
$ ./src/redis-benchmark -q -n 100000 -h 127.0.0.1 -p 6379 -d 128
PING_INLINE: 125786.16 requests per second
PING_BULK: 127388.53 requests per second
SET: 127388.53 requests per second
GET: 124843.95 requests per second
INCR: 128700.12 requests per second
LPUSH: 128369.71 requests per second
LPOP: 125470.52 requests per second
SADD: 128205.13 requests per second
SPOP: 127877.23 requests per second
LPUSH (needed to benchmark LRANGE): 128534.70 requests per second
LRANGE_100 (first 100 elements): 49900.20 requests per second
LRANGE_300 (first 300 elements): 21159.54 requests per second
LRANGE_500 (first 450 elements): 13497.10 requests per second
LRANGE_600 (first 600 elements): 10025.06 requests per second
MSET (10 keys): 99800.40 requests per second


@2013年5月10日
AM3マシン
– Sempron 145
– DDR3-1600 4GB * 2
– HDD 1TB (Hitachi HDT72101)
– Ubuntu 12.04 Server AMD64

# uname -a
Linux ratta 3.2.0-41-generic #66-Ubuntu SMP Thu Apr 25 03:27:11 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

#↑なぜかLinux Kernelが古いですね。今だと3.5系になるはずなのですが。。。
# もちろん、update, upgradeはしているのですがなぜでしょう。CPUが古いからですかね。

# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"

# dd if=/dev/zero of=/dev/null bs=100K count=100000
100000+0 records in
100000+0 records out
10240000000 bytes (10 GB) copied, 1.52631 s, 6.7 GB/s

# wget http://www.cs.virginia.edu/stream/FTP/Code/stream.c
# gcc -O stream.c -o stream
# ./stream
Function    Best Rate MB/s  Avg time     Min time     Max time
Copy:            4628.8     0.034586     0.034566     0.034623
Scale:           4625.2     0.034638     0.034593     0.034706
Add:             5091.5     0.047214     0.047137     0.047401
Triad:           5111.4     0.046989     0.046954     0.047020

# dd if=/dev/zero of=deleteme bs=32M count=100
100+0 records in
100+0 records out
3355443200 bytes (3.4 GB) copied, 30.4661 s, 110 MB/s

# ./src/redis-benchmark -q -n 100000 -s /tmp/redis.sock -d 128
PING_INLINE: 133868.81 requests per second
PING_BULK: 135135.14 requests per second
SET: 149476.83 requests per second
GET: 134952.77 requests per second
INCR: 150829.56 requests per second
LPUSH: 135869.56 requests per second
LPOP: 141242.94 requests per second
SADD: 150829.56 requests per second
SPOP: 143266.47 requests per second
LPUSH (needed to benchmark LRANGE): 136425.66 requests per second
LRANGE_100 (first 100 elements): 17670.97 requests per second
LRANGE_300 (first 300 elements): 4924.41 requests per second
LRANGE_500 (first 450 elements): 2820.48 requests per second
LRANGE_600 (first 600 elements): 2031.36 requests per second
MSET (10 keys): 54347.82 requests per second

# ./src/redis-benchmark -q -n 100000 -h 127.0.0.1 -p 6379 -d 128
PING_INLINE: 80775.45 requests per second
PING_BULK: 80840.74 requests per second
SET: 83612.04 requests per second
GET: 79872.20 requests per second
INCR: 86281.27 requests per second
LPUSH: 84459.46 requests per second
LPOP: 82850.04 requests per second
SADD: 85616.44 requests per second
SPOP: 83056.48 requests per second
LPUSH (needed to benchmark LRANGE): 82918.74 requests per second
LRANGE_100 (first 100 elements): 14880.95 requests per second
LRANGE_300 (first 300 elements): 4412.09 requests per second
LRANGE_500 (first 450 elements): 2690.20 requests per second
LRANGE_600 (first 600 elements): 1871.47 requests per second
MSET (10 keys): 37850.11 requests per second

# Unixbenchをしてみた↓
# ./Run
========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: ratta: GNU/Linux
   OS: GNU/Linux -- 3.2.0-41-generic -- #66-Ubuntu SMP Thu Apr 25 03:27:11 UTC 2013
   Machine: x86_64 (x86_64)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: AMD Sempron(tm) 145 Processor (5599.9 bogomips)
          x86-64, MMX, AMD MMX, Physical Address Ext, SYSENTER/SYSEXIT, AMD virtualization, SYSCALL/SYSRET
   20:28:11 up 24 min,  2 users,  load average: 0.09, 0.31, 0.30; runlevel 2

------------------------------------------------------------------------
Benchmark Run: Fri May 10 2013 20:28:11 - 20:56:22
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       25729274.3 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3325.0 MWIPS (9.8 s, 7 samples)
Execl Throughput                               5119.4 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        707818.7 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          272546.2 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1289156.4 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2044534.2 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 335636.0 lps   (10.0 s, 7 samples)
Process Creation                              15599.8 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   7070.5 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    897.2 lpm   (60.1 s, 2 samples)
System Call Overhead                        3348462.8 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   25729274.3   2204.7
Double-Precision Whetstone                       55.0       3325.0    604.5
Execl Throughput                                 43.0       5119.4   1190.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     707818.7   1787.4
File Copy 256 bufsize 500 maxblocks            1655.0     272546.2   1646.8
File Copy 4096 bufsize 8000 maxblocks          5800.0    1289156.4   2222.7
Pipe Throughput                               12440.0    2044534.2   1643.5
Pipe-based Context Switching                   4000.0     335636.0    839.1
Process Creation                                126.0      15599.8   1238.1
Shell Scripts (1 concurrent)                     42.4       7070.5   1667.6
Shell Scripts (8 concurrent)                      6.0        897.2   1495.3
System Call Overhead                          15000.0    3348462.8   2232.3
                                                                   ========
System Benchmarks Index Score                                        1466.2
-----


@2013年5月14日
富士通安鯖
- Opteron 3280
- DDR3-1600 8GB * 2
- HDD 1TB (Hitachi HDT72101)
- Ubuntu 12.04 Desktop AMD64

# uname -a
Linux zaik-PRIMERGY-MX130-S2 3.5.0-28-generic #48~precise1-Ubuntu SMP Wed Apr 24 21:42:24 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"

# ./src/redis-benchmark -q -n 100000
PING_INLINE: 68352.70 requests per second
PING_BULK: 68493.15 requests per second
SET: 68166.33 requests per second
GET: 66755.67 requests per second
INCR: 68587.11 requests per second
LPUSH: 67204.30 requests per second
LPOP: 67842.61 requests per second
SADD: 69204.15 requests per second
SPOP: 68212.83 requests per second
LPUSH (needed to benchmark LRANGE): 69735.01 requests per second
LRANGE_100 (first 100 elements): 37243.95 requests per second
LRANGE_300 (first 300 elements): 15890.67 requests per second
LRANGE_500 (first 450 elements): 11384.33 requests per second
LRANGE_600 (first 600 elements): 9067.00 requests per second
MSET (10 keys): 52603.89 requests per second

# 総評
なんかUbuntuのDesktop版ってServer版より遅い気がします。
Server版だと、INCR8万程度出ていたような。。。

@2013年5月25日
NEC薄毛鯖。ふと、PIPELINEを使ったらどうなるかと思いまして。まさかのincr 1M req/secです。PIPELINEは強力ですね。

ここまで来るとメモリを直接叩いているが如しなのでは。。。たとえばCでintを1から100万までforでカウントアップしたときにどれぐらい掛かるのでしょうね。とは言えCだとレジスタで処理してくれそうなので、メモリの比ではない速度が期待できそうではありますが。。。ちなみにPHPでやってみたところ、100万までのカウントアップは0.1secだったので、さすがにincr 1M req/secと言ってもメモリを直接叩くほどではなさそうです。
- Celeron G540 (G530だったかもです)
- DDR3-1600 8GB * 2
- 500GB HDD
- Ubuntu 12.04 AMD64

# cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04.2 LTS"

# uname -a
Linux pikachu 3.2.0-44-generic #69-Ubuntu SMP Thu May 16 17:35:01 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

# UNIX domain socket使用、Pipeline使用
root@pikachu:~/my_repos/redis-2.6.13# ./src/redis-benchmark -q -k 1 -n 1000000 -s /tmp/redis.sock -c 50 -P 50
PING_INLINE: 2004008.00 requests per second
PING_BULK: 2207505.50 requests per second
SET: 1022494.88 requests per second
GET: 1308900.50 requests per second
INCR: 1043841.31 requests per second
LPUSH: 1062699.25 requests per second
LPOP: 1039501.00 requests per second
SADD: 1103752.75 requests per second
SPOP: 1536098.25 requests per second
LPUSH (needed to benchmark LRANGE): 1058201.12 requests per second
LRANGE_100 (first 100 elements): 63492.06 requests per second
LRANGE_300 (first 300 elements): 12944.48 requests per second
LRANGE_500 (first 450 elements): 9785.50 requests per second
LRANGE_600 (first 600 elements): 7872.65 requests per second
MSET (10 keys): 171556.02 requests per second

PHPにおける、文字列と整数のメモリ使用量比較

PHPにおいて、文字列と整数はどのぐらいメモリ使用量が異なるのか比較してみました。

基本的にUTF-8なら文字は2bytesで、整数はエンコーディングなど関係なく1byteのはずなので、N文字の文字と、N桁の整数では、文字は整数の2倍のバイトを使うはずです。でも一応検証してみました。

13文字の文字列と、13桁の整数をたくさん作って比較です。

環境:

$ uname -a
Darwin kawabook.local 12.3.0 Darwin Kernel Version 12.3.0: Sun Jan  6 22:37:10 PST 2013; root:xnu-2050.22.13~1/RELEASE_X86_64 x86_64

$ php -v
PHP 5.4.13 (cli) (built: Mar 16 2013 13:38:08) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

結果:
$ time php comparison.php 
===== Memory Usage comparison between Integer and String ====

Unique ID (ex: 5167efcc8a6e9) contains 13 characters.
So, let's compare memory usages between 13-character-string and 13-digit-number.
(
String example: 5167efcc8a71c
Number example: 7614422837737
)

--- start to generate 100000 strings and numbers each other ---
Strings: 24.25 MB
Numbers: 14.65 MB

real	0m1.239s
user	0m0.649s
sys	0m0.283s

総評:
13文字の文字列を10000個だけ作った場合のメモリ使用量: 24.25MB、13桁の整数を10000個だけ作った場合のメモリ使用量: 14.65MBでした。文字が整数の2倍程度と、予想通りの結果となりました。

展望
PHPだけでなくJava等の比較だとどうなるか見てみたいです。

用いたコード
<?php

echo "===== Memory Usage comparison between Integer and String ====\n\n";
echo "Unique ID (ex: " . uniqid() . ") contains " . strlen(uniqid()) . " characters.\n";
echo "So, let's compare memory usages between 13-character-string and 13-digit-number.\n";

$string_array = array();
$number_array = array();

$max_contents = 100000;

echo "(\nString example: " . uniqid() . "\nNumber example: " . rand(1000000000000, 9999999999999) . "\n)\n";


echo "\n--- start to generate " . $max_contents . " strings and numbers each other ---\n";

$before = memory_get_usage();
for ($i = 0; $i < $max_contents; $i++) {
	$string_array[] = uniqid();
}
$after = memory_get_usage();
printf("Strings: %.2f MB\n", ($after - $before) / 1000 / 1000);

$before = memory_get_usage();
for ($i = 0; $i < $max_contents; $i++) {
	$number_array[] = rand(1000000000000, 9999999999999);
}
$after = memory_get_usage();
printf("Numbers: %.2f MB\n", ($after - $before) / 1000 / 1000);
?>

Crontabの使い方

なんか忘れるので。。。↓は、10minに一度、phpであるスクリプトを走らせています。一度cdして移動しています。phpのスクリプトで相対的なrequireが入っているのでどこで実行するかが重要だからです。(PHPでスクリプト中に絶対pathのディレクトリを定めることが出来た気がしますが。。。)

# エディット
$ crontab -e
HELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
*/10 * * * * cd /Users/mk/my_repos/Buzz/Batch; /opt/local/bin/php54 /Users/mk/my_repos/Buzz/Batch/delete_unactivated_account.php 1>>/Users/mk/my_repos/Buzz/Batch/log.txt 2>>/Users/mk/my_repos/Buzz/Batch/error_log.txt

# 確認
$ crontab -l

# 削除
$ crontab -r