NoSQLとしてのMySQLの動作確認(HandlerSocket)

やったこと

結論

  • データをセットしたらmysqlがぶっ壊れた(環境構築に問題があった?)
  • getだけで"perlからsingle getで"簡単に性能を測ったらそこそこでた(11300 req/sec)
  • pure C/C++で多重度をあげて測れば75万いくかも?

環境

  • CentOS 5.2
  • memory 4G
  • on VM
  • dual core cpu
model name      : QEMU Virtual CPU version 0.12.3
cpu MHz         : 2792.856
cache size      : 4096 KB

MySQL Server セットアップ

% ./configure \
--with-charset=utf8 \
--with-extra-charsets=all \
--with-mysqld-user=mysql \
--with-\innodb \
--\enable-local-infile \
--\with-unix-socket-path=/tmp/mysql.sock
% make
% sudo make install
% sudo /usr/local/mysql/bin/mysql_install_db
% sudo /usr/local/bin/mysqld_safe &
  • あとは文字コードをUTFにしたり、my.cnfのinnodbのパラメータを調節したり
  • 若干はまったけど、割愛

Handler Socket build

% mkdir ~/git ; cd ~/git
% git clone http://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL.git
% cd git/HandlerSocket-Plugin-for-MySQL/
% ./configure --with-mysql-source=/home/satoshi/src/mysql-5.1.51/ \
--with-mysql-bindir=/usr/local/bin

テーブル作成

CREATE TABLE user (
  id INT NOT NULL PRIMARY KEY,
  name char(32)
) ENGINE=INNODB;

参照の動作確認

  • 以下手順
(mysqlのデータ確認)
mysql> select * from user;
+----+---------+
| id | name    |
+----+---------+
|  1 | tanarky |
|  2 | satoshi |
+----+---------+
2 rows in set (0.00 sec)

(telnetで接続してデータを取得する)
% telnet localhost 9998
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

# タブ区切り
# "satoshi" database, "user" table, index=3
REQ% P       3       satoshi user    PRIMARY id,name
RES% 0       1

# 上で指定したINDEX(=3)を使って検索する
# INDEX(3), 等しい, 1(?), PRIMARY=1, 1件, offset=0
REQ% 3       =       1       1       1       0
RES% 0       2       1       tanarky

# 上で指定したINDEX(=3)を使って検索する
# INDEX(3), 等しい, 1(?), PRIMARY=2, 1件, offset=0
REQ% 3       =       1       2       1       0
RES% 0       2       2       satoshi
  • 無事にデータが取得できた
  • 便宜上、telnet接続後のリクエストにはREQ%, レスポンスにRES%,を頭につけている
  • # 行はコメントってことで、リクエストの補足を書いている

更新の確認

  • まずはデータの確認
(mysqlのデータ確認)
mysql> select * from user;
+----+---------+
| id | name    |
+----+---------+
|  1 | tanarky |
|  2 | satoshi |
+----+---------+
2 rows in set (0.00 sec)

mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)
  • データをinsertしてみる by telnet
% telnet localhost 9999
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

# 接続
REQ% P       3       satoshi user    PRIMARY id
RES% 0       1

# id=1を取得(成功)
REQ% 3       =       1       1       1       0
RES% 0       1       1

# id=2を取得(成功)
REQ% 3       =       1       2       1       0
RES% 0       1       2

# id=3を取得(成功、データがないので空)
REQ% 3       =       1       3       1       0
RES% 0       1

# id=3をinsert(失敗?responseにinsertnumがない)
REQ% 3       +       1       3
RES% 0       1
  • mysqlを見てみる
mysql> select * from user;
+----+---------+
| id | name    |
+----+---------+
|  1 | tanarky |
|  2 | satoshi |
+----+---------+
2 rows in set (0.00 sec)

mysql> select count(*) from user;
+----------+
| count(*) |
+----------+
|        3 |
+----------+
1 row in set (0.01 sec)

mysql> select * from user where id = 3;
ERROR 1030 (HY000): Got error 134 from storage engine
  • データがぶっ壊れた
  • telnet経由でも値が取れず
  • perl client経由でも、値のセットとゲットができず(同じように壊れる)

性能測定

  • getのみ
  • perl clientから
  • single get
  • 以下がテストコード(test_client.pl)
use strict;
use warnings;
use Data::Dumper;
use Net::HandlerSocket;
my $args = { host => 'localhost', port => 9999 };
my $hs = new Net::HandlerSocket($args);
my $res = $hs->open_index(3, 'satoshi', 'user', 'PRIMARY', 'id,name');
warn Dumper($res);
for(my $i=0;$i<100000;$i++){
    $res = $hs->execute_single(3, '=', [ '1' ], 1, 0);
}
  • 実行結果(8秒後半-12秒弱)
  • portを9998(readonly)にすると、18秒くらいかかったり? 謎
% time perl test_client.pl
$VAR1 = 0;
perl test_client.pl  1.47s user 2.23s system 41% cpu 8.854 total

node.jsを試してみた その1: インストール

node.jsという存在を知ったので、調査+インストールしてみた。

名前だけは聞いたことがあったけど、
勝手にjQueryのようなクライアントサイドJavascriptを想像してました。
完全に間違い。

Evented I/O for V8 JavaScript.
An example of a web server written in Node which responds with "Hello World" for every request.
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
To run the server, put the code into a file example.js and execute it with the node program:
% node example.js
Server running at http://127.0.0.1:8124/
なんと、たった6行のJavascriptでHTTPサーバを作れるっつー話だからビックリ。

早速公式サイトからダウンロード。
今回試したバージョンは、
http://nodejs.org/dist/node-v0.2.3.tar.gz

$ http://nodejs.org/dist/node-v0.2.3.tar.gz
$ tar xvzf node*tar.gz
$ cd node-v0.2.3
$ configure
$ make
'build' finished successfully (5m41.814s)

コードが多いからか、コンパイルに時間がかかる。
コンパイルに使ったのは、Thinpad x100e memory 2G。
ちなみに、HP 2133だと14分、Mac miniだと3分25秒かかった。

あとは、公式サイトにあるhttpdコードを起動して動作確認。

/Users/satoshi% cat httpd.js 
var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');
/Users/satoshi% node httpd.js 
Server running at http://127.0.0.1:8124/

これで起動OK。あとはブラウザからhttp://localhost:8124/にアクセスすれば
ちゃんと動作していることがわかる。

で、性能測定してみると、こんな感じ。
 This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)


Server Software:      
Server Hostname:        localhost
Server Port:            8124

Document Path:          /
Document Length:        12 bytes

Concurrency Level:      20
Time taken for tests:   0.886 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      76000 bytes
HTML transferred:       12000 bytes
Requests per second:    1128.29 [#/sec] (mean)
Time per request:       17.726 [ms] (mean)
Time per request:       0.886 [ms] (mean, across all concurrent requests)
Transfer rate:          83.74 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.4      0       9
Processing:     3   17   9.6     16      59
Waiting:        3   17   9.6     16      57
Total:          3   17   9.7     16      59

Percentage of the requests served within a certain time (ms)
  50%     16
  66%     20
  75%     22
  80%     24
  90%     28
  95%     36
  98%     48
  99%     51
 100%     59 (longest request)
比較のために、同様の出力をするapache2+php5.3.2 on Ubuntuだと
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)


Server Software:        Apache/2.2.14
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        177 bytes

Concurrency Level:      20
Time taken for tests:   1.104 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      389000 bytes
HTML transferred:       177000 bytes
Requests per second:    906.07 [#/sec] (mean)
Time per request:       22.073 [ms] (mean)
Time per request:       1.104 [ms] (mean, across all concurrent requests)
Transfer rate:          344.20 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    3   2.5      2      18
Processing:    11   18   9.7     17      96
Waiting:        9   16   9.3     14      89
Total:         14   21  11.5     18     113

Percentage of the requests served within a certain time (ms)
  50%     18
  66%     20
  75%     20
  80%     20
  90%     21
  95%     35
  98%     81
  99%     98
 100%    113 (longest request)
となる。

比較としては公平とはいえないかもしれないけど、PHPよりも早いことがわかる。
これからもう少し詳しく調べてみる。

PHPいらない疑惑?


旭山動物園おみやげ 白クマ塩ラーメンを喰らう

今年も旭山動物園にいったので、去年とは違うお土産を買ってみた。

買ったのは、白クマ塩ラーメン。
人気のお土産らしい。

シロクマラーメン
シロクマラーメン2

白クマっていうくらいだから、勝手に白濁スープを想像してたけど、
透き通ったスープ。

味は、インスタントだと思ってバカにしてたけど、
意外と本格的(?)でおいしかった。

Yahoo!ショッピングでも買えるみたいなので、興味がある人はぜひ。

下の写真は、はじっこで固まってうごかないカピバラと、
めっちゃ近くまでよってきたペンギンの写真。
カピバラ
ペンギン

CentOS 5.5 に PHP 5.3 をinstall

CentOS に PHP 5.3 系をinstallしたときの備忘録。

とりあえず、
sudo yum install httpd php
としてみたが、バージョンが5.1.3という古さだったので、
せっかくなので、5.2じゃなくて、5.3系にバージョンアップしてみた

参考:
CentOS 5.3 に PHP 5.3 をインストールする - 総天然色頁
CentOS5.3にphp5.3をインストール - プログラマー某の外部記憶

実際に実行した手順は以下のとおり。
$ wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
$ sudo rpm -Uvh remi-release-5.rpm
$ sudo yum --enablerepo=remi info php
## 5.3 系であることを確認
$ sudo yum --enablerepo=remi install php
## エラーがでてこの時点では有効にならない
$ sudo yum --enablerepo=remi,epel update mysql\*
$ sudo /etc/init.d/httpd restart
## phpinfo() で 5.3系が起動していることを確認

やっぱり、めんどうだと思ってしまうCentOS。
自分が無知なだけだと理解することにする。

CentOS 5 に emacs23 を install したときのメモ

CentOS 5 に emacs23 を install したときのメモ

$ sudo yum install -y gcc texinfo
$ wget http://ftp.gnu.org/pub/gnu/emacs/emacs-23.2.tar.gz
$ tar xvzf emacs-23.2.tar.gz
$ cd emacs-23.2
$ configure --without-x
$ make
$ src/emacs -q
$ sudo make install
$ emacs --version 
GNU Emacs 23.2.1
Copyright (C) 2010 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.

以前installしたときは、大分はまった記憶だが、今回はすんなりできた。
Ubuntuだと、sudo aptitude install emacs23-nox で終了なんだけどなぁ。

参考: Emacs 23.1 on CentOS - speg03の日記

Thinkpad x100e セットアップメモ

新しいノートパソコンとして、Thinkpad x100eを購入したので、
あっさりとWindows7を消して、Ubuntu 10.04をクリーンセットアップしたときのメモ。
  1. driver update(自動でタスクトレイ的なところに表示されるはず)
  2. フォルダ名を日本語に(先にディレクトリを作っておく)
/home/satoshi% cat .config/user-dirs.dirs
# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Downloads"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Musics"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"
  1. パッケージを最新に(sudo apt-get update)
  2. 無線LAN設定
  3. dropbox install
  4. システム>自動で起動するアプリ でマウススクロールを有効に
  1. 必要なrcなどを移動
mv ~/Dropbox/devel/screenrc ~/Dropbox/devel/emacs.el ~/
  1. flash player install + firefox restart
sudo aptitude install flashplugin-installer
  1. ibus setting(ctrl+space -> shift+space)
  2. 必須apt package install
sudo aptitude install -y \
git-core python-docutils mysql-server-5.1 \
apache2 apache2-dev php5 php5-cli php5-mysql