h2oを試してみる

最近、高速なサーバーソフトウェアとしてh2oを耳にするので試してみました。

https://github.com/h2o/h2o


結論から言うと高速でした。Ubuntu@Opteron3280で約16万req/sec以上出ています。今まで計測した中で最速で、OpenRestyより早いと思います。計測マシンの方がCPUを使いきって計測しきれませんでしたので、もっと出ると思います。

インストール方法を最初に書いておきます。ubuntuです。

# いろいろとインストール。これだけでは足りないと思います、OpenSSLとか必要かもです、適宜入れて下さい
$ aptitude install cmake make gcc c++ libyaml-dev
$ git clone git clone https://github.com/h2o/h2o
$ cmake .
$ make

# confを編集。コンフィグ例をこの記事の下の方に置いておきました
$ vi examples/h2o/h2o.conf

# index.htmlを編集します
$ echo '<p>Hello, This is h2o!</p>' > examples/doc_root/index.html 

# 動かします
$ ./h2o -c examples/h2o/h2o.conf
h2o server (pid:10204) is ready to serve requests

ベンチマークをしてみます。wrkというベンチマークツールを使います。これのインストール方法や使い方は検索して下さい。

↑のマシン(192.168.1.2とします)と、GbEスイッチングハブで繋いだ別マシンから計測してみます。

トポロジーは、

Ubuntu@Opteron3280 (8コアCPU、IP ADDR: 192.168.1.2)
|
GbEスイッチングハブ
|
Debian@Pentium Dual-Core E5200 (2コアCPU、IP ADDR: 192.168.1.118)

です。

# まずはきちんとアクセス出来るか確認
$ curl http://192.168.1.2:8080/
<p>Hello, This is h2o!</p>

# wrkベンチマーク (同時接続500、10スレッド、10秒間の計測)
$ ./wrk -c 500 -t 10 -d 10 http://192.168.1.2:8080/
Running 10s test @ http://192.168.1.2:8080/
  10 threads and 500 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     9.04ms   63.59ms 661.01ms   98.38%
    Req/Sec    16.41k     5.34k   60.44k    71.39%
  1550171 requests in 10.00s, 362.20MB read
Requests/sec: 155069.87
Transfer/sec:     36.23MB

結果としては、15.5万req/sec、36.23MB/sになりました。高速ですね!ただし、wrkを走らせたマシンはCPUを使いきっている状態でしたので、もっと出るかと思います。h2oを走らせていた方は、CPU使用率が70%程度でしたので余力がありそうです。また、今回index.htmlは短めの文字列ですが、少し長くすればすぐにGbEでは足りなくなりますね。きちんとした計測では、

– より高性能な測定器
– 10GbE環境

が必要だと感じました。

ともかくも、h2oがとても高速であることがよくわかりました。h2oはHTTP/2にも対応しているとのことなので、そちらもいつか試してみたいと思います。

注意点

– 「cowardly refusing to run as root; you can use the `user` directive to set the running user」と怒られる
→ confファイルに、user: rootと書きましょう (下記に高速なconfの例を載せました)

– h2oが1コアしか使ってくれない
→ デフォルトのconfファイルでは、num-threadsが設定されておらずデフォルトの1となるようです。num-threads:8 などとしましょう (下記に高速なconfの例を載せました)

h2o.conf
user: root
http2-max-concurrent-requests-per-connection: 1024
num-threads: 8
listen: 8080
hosts:
  "127.0.0.1.xip.io:8080":
    paths:
      /:
        file.dir: examples/doc_root
↑ userをrootにしないとrootでh2oは動かせません。さらに、num-threadsは指定しないと1なので1コアで動くため、コア数分にするなどが適切かと思います。

【形態素解析】MeCabをCentOSにインストール【辞書追加】

MeCabが必要な感じなのでインストールして動かしてみました。形態素解析ツールは他にもいろいろとあるようですが、開発が盛んな感じなのはやはりMeCabなのでしょう。というわけでMeCabを選択。OSはCentOSです。

mkdir mecab_example
↑ MeCab用の、作業用ディレクトリを作成

wget http://mecab.googlecode.com/files/mecab-0.994.tar.gz
↑ MeCab 最新版(2012年9月28日20:50:43(JST)の時点で)をダウンロード。

tar xzvf mecab-0.994.tar.gz 
↑ 解凍する

cd mecab-0.994
↑ 移動する

./configure
↑ configure する。libiconv が必要と言われるかも知れません。そのときは、それをインストールします。

make
↑ make する

make install
↑ make install する。ターミナルでmecabコマンドを有効にするため

cd ..
↑ 先ほど作ったmecab_exampleに戻る

wget http://jaist.dl.sourceforge.jp/naist-jdic/53500/mecab-naist-jdic-0.6.3b-20111013.tar.gz
↑ 辞書をインストール。辞書はいろいろとあるみたいですがとりあえずnaist-jdicを。とは言え1年近く前の辞書なんですか…。

tar xzvf mecab-naist-jdic-0.6.3b-20111013.tar.gz 
↑ 解凍。

cd mecab-naist-jdic-0.6.3b-20111013
↑ 移動。

./configure --with-charset=utf8
↑ utf-8でconfigure

ldconfig
↑ 先にインストールしたmecabの共有ライブラリが参照されていない場合があるのでldconfigします。

make
↑ makeします。

make install
↑ make install します。

nano /usr/local/etc/mecabrc
↑辞書の場所をMeCabに教える必要がありますので、MeCabの設定ファイルを開きます。

mecabrc↓
;
; Configuration file of MeCab
;
; $Id: mecabrc.in,v 1.3 2006/05/29 15:36:08 taku-ku Exp $;
;
;dicdir =  /usr/local/lib/mecab/dic/ipadic
;デフォルトでは、↑のように書いていますが、↓のように書き換えます。

dicdir = /usr/local/lib/mecab/dic/naist-jdic

; userdic = /home/foo/bar/user.dic

; output-format-type = wakati
; input-buffer-size = 8192

; node-format = %m\n
; bos-format = %S\n
; eos-format = EOS\n

さて、これで終わりです。実験してみましょう。↓。
echo 吾輩は猫である。名前はまだ無い。 | mecab
吾輩	名詞,代名詞,一般,*,*,*,吾輩,ワガハイ,ワガハイ,,
は	助詞,係助詞,*,*,*,*,は,ハ,ワ,,
猫	名詞,一般,*,*,*,*,猫,ネコ,ネコ,,
で	助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ,,
ある	助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル,,
。	記号,句点,*,*,*,*,。,。,。,,
名前	名詞,一般,*,*,*,*,名前,ナマエ,ナマエ,,
は	助詞,係助詞,*,*,*,*,は,ハ,ワ,,
まだ	副詞,助詞類接続,*,*,*,*,まだ,マダ,マダ,,
無い	形容詞,自立,*,*,形容詞・アウオ段,基本形,無い,ナイ,ナイ,ない/無い,
。	記号,句点,*,*,*,*,。,。,。,,
EOS

↑これはすごい。かなりの解析度ですね。

ToDo:
自分で辞書を追加する。名詞だけでも追加できると良い感じ…!

Git を使ってみた

最近、コードを書いていてバージョン管理の必要性を感じてきました。プロジェクト名の後ろに日付を付けて管理していますが馬鹿みたいです。どこかの通信社では、Git で記事管理をしているそうです。世界的ですもんね、乗るしかない、このビッグウェーブに。

「当初、Git っていろんな用語があって訳分からん、検索してみて出てきたページを読んでもさっぱり…」という感じて手が出ませんでしたが、実際に動かしてみると何となく分かってきたし少なくとも使えるようにはなったので、理解する前にとりあえずやってみるといいと思います。

というわけでやってみました。Git についてあまり理解していないのでおかしなことを書いているかも知れません。

GitHub は嫌いではないのですが、自分でサーバーを持っているので、それを使おうと思います。

>せっかちな人のための git 入門 – git をインストールし、共同で開発できる環境を整えるまで
>http://blog.champierre.com/670


したことは、↑ほとんどこれをなぞったような感じです。

まず、自宅鯖(debian)に Git をインストールして、リモートレポジトリを作ります。

自宅鯖の操作↓

cat /etc/debian_version
6.0.5

aptitude install git
↑git をインストール

mkdir -p  /var/git/myapp.git
↑リモートレポジトリ用のディレクトリを作ります。
-p は、parent の意味(たぶん…)で、/var/ 以下の git ディレクトリと
myapp.git ディレクトリをふたつ一気に作ります。

cd /var/git/myapp.git/
↑そのディレクトリに移動します。

git --bare init
↑初期化します。git のレポジトリとして登録する感じです
(注: 適当に書きました)

次に、手持ちの MacBook (以下、MB1と表記)での操作↓
sudo port install git-core
↑ macports でインストールします。
git は git-core って名前みたいです(2012年9月8日においては)。

cd
↑ ホームに戻ります

mkdir myapp
↑ git で管理したいディレクトリを作ります

cd myapp

git init
↑ ローカルレポジトリを作成しているみたいです。

echo "Hello, Git." > hello_git.txt
↑ Hello, Git. と書かれたファイル(hello_git.txt)を作ってみました。
これを他のマシンでも取り扱えるようにしたいわけです。

git add .
↑ ディレクトリ内の全てを add します。
具体的にどこに add しているのか僕にはよくわかりません。
.git ディレクトリにされているのでしょうか。
インデックスに登録するイメージでしょうかね…?

git commit -m "first commiting"
↑ コミットします。一体何をコミットしているのでしょう。
そもそもコミットってなんでしょう。
さっきの add とまとめたらいいのではとか思ってしまいます。

git push ssh://yoshi/var/git/myapp.git master
↑ 先ほど作ったdebian鯖にアップロードします。push = アップロードって意味らしいです。
なんでわざわざ push なんて言葉を使うのでしょう。upload でいいじゃん…。さて、次の文字、
「ssh://yoshi/var/git/myapp.git」ですが、私は ~/.ssh/config で、
yoshi という名前で自分の鯖に入れるようになっています("ssh yoshi" で接続できる)、
それを活用しました。
秘密鍵を使い分けたい人なんかはこういうのが便利かと思います。省略記法を使わないなら、
"ssh://root@192.168.0.200:34522/var/git/myapp.git" と書けばいいと思います。
ここでの鍵の指定方は知りません。最後の、masterってのは、
デフォルトの開発ブランチを意味していて、
ブランチとはアクティブな開発ラインをさすみたいです。
ちなみに、ssh://yoshi/var/git/myapp.git と打つのはだるいので、
git remote add origin ssh://yoshi/var/git/myapp.git
として、
git push origin master
とすることも可能です。origin = ssh://yoshi/var/git/myapp.git であり、
つまりはエイリアスのようです。

さて、これ↑で MB1 で作ったデータを、remote の debian 鯖に反映させることができました。
次は、この debian 鯖のデータを他のマシンで引っ張ってくることが必要です。
MacBookProを用意します(以下MB2と表記)。

MB2での操作↓
cd
↑ ユーザーディレクトリに戻ります。

git clone ssh://yoshi/var/git/myapp.git
↑リモートのdebian鯖からデータを取って来ます。myapp というディレクトリが作成されます。
ちなみにこの MB2 でも MB1 同様に、/.ssh/config を書いていますので 
ssh://yoshi/var/git/myapp.git のような記述をしています。
そうでない場合は、先の MB1 の項目を参照してください。

cd myapp
↑ myapp に移動します。

ls -all
↑ きちんとデータを取ってこれたか確認してください。できているはずです。

echo "Hey, Git" > heygit.txt
↑ こちらでもデータを作ってみます。

git add .
git commit -m "added heygit.txt"
git push ssh://yoshi/var/git/myapp.git master
↑この操作は MB1 と同じですので詳細は書きません。

さて、↑の操作で、Debian 鯖の レポジトリをコピーして、
さらに編集してコミットして Debian 鯖に反映させました。
次に、先の MB1 に戻って、最新データを反映させてみましょう。

MB1 での操作↓
git pull ssh://yoshi/var/git/myapp.git master
↑先程は、git push ssh://yoshi/var/git/myapp.git master としましたが、
今度は pull です。引っ張ってくるって感じですかね。push と pull なわけです。
ちなみに、やはり"git remote add origin ssh://yoshi/var/git/myapp.git" を打って、
origin = ssh://yoshi/var/git/myapp.git な状態にしておいた方が良いかと思います。
git pull origin master って書けますので。さて、このコマンド後、先ほど MB2 で作った、
heygit.txt が反映されているはずです。

ls -all
↑ 確認してみましょう。

ひとまず以上です。まだ Git 使い始めて1時間の人間なのであまり良く分かっていませんが、備忘録+チートシート的に書いておきました。

ToDo:
– コメントの見方を調べる
– 日付と時刻ごとの表示のさせ方を調べる
– add がよく分からないので調べる
– 複数人で使うときはどうすればいいのか調べる(特にssh周りとか…。複数人皆がgit鯖にsshで入れる状態にしているってわけじゃない気がするのだがどうなのでしょう)
– 個々人開発の場合の一般的な Git サーバーの構成について調べる(バックアップも兼ねてここに置いておいてね、的なサーバーを用意するとして、具体的にどう管理するのか。それぞれユーザーを作って、そのユーザーディレクトリに好き勝手置いてもらえばいいのか)
– その他書き加える

MySQL や DB の勉強におすすめの本

最近、Database の勉強に迫られており、当方全くDBについて知らないのでとりあえず MySQL を扱えるようにしようということで(この WordPress だって、MySQL が裏で動いているし…。この書いている言葉は MySQL さんが保存しているはず)、いろいろと本を探してみた(たぶん将来的には Apache Cassandra を使うけれど)。

ちなみに Web で学べるじゃん、というのが最近の風潮ではあり、それを否定するつもりはないが、体系的に学びたい時にはまだまだ本という形式は有効だと思う。最近では、本というものは不揮発性の極めて薄いモニタを重ねたものと解釈していて、それはそれで使えるのである(そのうち電子書籍やモニタとかと比較表を作る予定^^;)。

でまあ、いろいろと調べてみたら、基礎からのMySQL 改訂版 by 西沢 夢路 がお勧め。現在50ページほど読み終えたけれど良い感じ。実際に実行できる短いサンプルコードが多数掲載され、それを学習者が打ってみて勉強する形式になっている。それと、語り口がいい。たとえば、↓こんなん(p43)。

実行すると、「Database changed」(データベースが変わったよ)と表示されました。もともと何も選択していなかったのに changed というのも変ですが、気にする必要はありません。


と書いてある。このように、「changed って書いてあるけどなんだろう?」と読者が感じる疑問に答えている。こういったちょっとしたことほど気になるものだ。

↓こちらです。


[追記@2012-08-08]
やっとこの本の MySQL の部分は終えて、SQL 文とはどういうものかなど分かった。ところでこの本、ほんとうに丁寧である。一部抜粋してみる↓。

たとえば「insert into tb1 values (‘A101′, …)」というSQL文を発行するときは、どのように記述すればよいでしょうか? SQL文は文字列データなので、「’ ‘」で囲むとします。「’ ‘」が使われているSQL文をさらに「’ ‘」で囲ったとすれば、これはエラーになってしまいます。

mysql_query(‘insert into tb1 values(‘A101′, …)’)
↑「’ ‘」を「’ ‘」で囲むとエラー

この場合、「\」でエスケープするか、あるいは次のように、内側の「’」を文字として扱うために外側を「” “」で囲むなどの対策が必要となります。

mysql_query(“insert into tb1 values(‘A101′, …)”)
↑「’ ‘」を「” “」で囲めばOK

あるいは、内側の「”」を文字として扱うために外側を「’ ‘」で囲むこともできます。

PHP + MySQL の利用時に最初につまづくのは、こうした「’」や「”」の使い方であることも珍しくありません。mysql_query関数については以降で勉強しますが、ここでは「’」の文字を「’ ‘」で、あるいは「”」の文字を「” “」で囲うのは御法度!ということを覚えておいてください。


↑このような細やかな気遣いは助かる。何度も同じ事を書いていて冗長だと言う意見は却下である、なぜなら混乱するよりは冗長であるほうがずっと良いからである。このような意見を言う者は、紙が貴重だった時代の価値観で止まっている老害と言わざるをえない。