忍者ブログ

開発者ブログ

忍者ブログの元開発者が送る愛と感動と涙のスペクタクル。プログラムの開発日誌やタダの日記です。

RTMPとRTMFPとKamaitachi

こんにちは。水野です。

今日はRTMPとRTMFPとKamaitachiに触れてみました。
社内のツール用にRTMPを使いたいなと思ったのが発端。

Alu君曰く、RTMFPというものがあるという話。
簡単?にp2pがFlash Player上で出来てしまうらしい。

早速調べてみたのです。
参考にしたのはこの辺

blog.katsuma.tv
Stratus Sample Application

うん。なんか面白そうなのです。
・・・でも、今のところp2pよりもクライアントサーバータイプが良かったので、一通り遊んでから次へ。

まずはサーバーをどうしようと思って探していたところ、KAYACさんがperlで動作するKamaitachiなるものを出しているらしい。

Kamaitachi

Perlを触るのは実に4,5年振りなのです。
さっぱり意味が解らないまま必要な物をCPANからバシバシっと入れて、なんとか実装。

実際に動かしてみました。
出来ることはこんなこと。

同時接続通信(チャットとか)
ストリーミング(ライブ映像とか音声とか)

 

b519e0ca.jpgいいですね。Kamaitachi。
ソースもシンプルで素敵なのです。
サンプルだけでお腹いっぱいになっちゃいました。

これを使ってあんなことやこんなことが出来ちゃうといいなーって思いました。
まずはPerlを勉強しなくちゃ。

拍手[2回]

PR

tokyo tyrantを使ってみた(東京タイラントって書く?)

こんにちは。misneyです。

昨日は初めてtokyo tyrantを使ってみました。
tokyo tyrantは、tokyo cabinetを使って上手い具合にレプリケーションしてくれるような物らしいです。
memcachedみたいに、落ちたら消えるってのは嫌!でも高速キャッシュを使いたいなんて場合に使うんですかね?

tokyo cabinetはハッシュ表・Btree・固定長の3種類の構造を選べるDBMのようなライブラリです。
こんな具合に高速らしい。

今回、僕はハッシュ表を使いました。tchですね。tcb、tcf、*の4種類から選べるみたい。
実際早いのはtcf(fixed)らしいけど・・・今回はハッシュで。

tokyo tyrantはmemcachedプロトコルを実装しているので、memcached系のクラスを使うことが出来ます。
<?php
$obj = new Memcache();
$obj->connect('localhost',1978);
echo $obj->get('key');
?>

こんな風に。
とても楽チンなのです。

以下、覚書。

1.tokyo cabinetをインストール
     wget http://tokyocabinet.sourceforge.net/tokyocabinet-1.3.15.tar.gz (最新版はここ)
     tar -zxvf ./tokyocabinet-1.3.15.tar.gz
     cd ./tokyocabinet-1.3.15
     ./configure #ここで失敗。zlibとbzipがなかった。
   yum install zlib-devel bzip2-devel bzip2-libs
     ./configure && make && make install

2.tokyo tyrantをインストール
  wget http://tokyocabinet.sourceforge.net/tyrantpkg/tokyotyrant-1.1.7.tar.gz (最新版はここ)
  tar -zxvf ./tokyotyrant-1.1.7.tar.gz
     cd ./tokyotyrant-1.1.7
     ./configure && make && make install

3.ホットスタンバイで動かす
  詳しい説明は平林さんがここで書いてます。
  ttserver -dmn -log /path/to/tta.log -port 1978 -ulog /path/to/ulog -sid 1 -mhost localhost -mport 1979 -rts /path/to/mastera.rts /path/to/mastera.tch

    ttserver -dmn -log /path/to/ttb.log -port 1979 -ulog /path/to/ulog -sid 2 -mhost localhost -mport 1978 -rts /path/to/masterb.rts /path/to/masterb.tch

4.PHPで繋ぐ

 <?php
       $obj = new Memcache();
       if(!$obj->connect('localhost', 1978)) {
    if ($obj->connect('localhost', 1979)) {
               error('繋がらんよ');
           }
       }
       $obj->set('key', 'データだお');
    echo $obj->get('key');
   ?>

こんな感じだったと思います。

ちなみに、ファイルシステムはext3でnoatimeとwritebackモードに設定。
orderedモードよりwritebackの方が早いらしいのと、それほどクリティカルなサービスではないのでwritebackにしてみました。

そういえば、ハッシュDBで、早そうなのがありました。
memstored
こちらもいつか使ってみたいところです。

引用ページ
mixi->{engineers_blog}様 http://alpha.mixi.co.jp/blog/
古橋定之の日記様 http://d.hatena.ne.jp/viver/
Drk7.jp様 http://www.drk7.jp/MT/

拍手[1回]

apacheのKeepAlive

こんばんわ。misneyです。

今回はApacheのKeepAliveについて書こうと思います。
前もって書いておきますが、私の妄想的なapache(prefork)の動きを書きます。
色々と間違った点があると思うので、鵜呑みにしないでくださいね。

KeepAliveというのは、HTTP1.1がどうのこうの・・・ということで、ステートレスがアレっていう設定です。

日本語で書くと、一度に多くの情報が得られちゃうよってな機能だと思います。

私が思うKeepAlive

現在のWebページでは、色々なHTTPセッションを必要とするわけです。

・画像
・Javascript
・Flash
・動画/音楽
・CSS

1つのHTMLに100以上のファイルが存在するような場合もあり、その数だけHTTPセッションが張られるなんてことになります。

そこで「1回で全部やっちゃえばいいじゃーん」っと登場したのがKeepAliveだと思います。きっと。

何が一回かというと、こんなのです。

1. apache君「なんかリクエストが来たよ。どいつに任せようかな?」
2. apache君「よーし。ここはいっちょプロセス番号10000君に任せよう。」
3. プロセス番号10000君「はーい。このpathにある画像を送っちゃいます。」
4. プロセス番号10000君「はい。送りました。これで僕の仕事はおーわり。」

これが一回です。
KeepAliveはこの次に「まだ次があるからちょっと待っとけ!」ってな動きをするんだと思います。(妄想ですが。)

KeepAliveがあると、1と2の動作をしないで済むんだと思うんですよね。
厳密には他にも「プロセス足りないからまた作るかー」とか「こいつ働きすぎたから休憩させよう。」とか色々働くわけです。apacheさんが。

そして、TCPセッションも1回で済んでしまう。
色々とお得な機能なんです。

ですが、KeepAliveには欠点もあります。
それは、apacheさんが「まっとけ」と待たせているプロセスさん、待ってる間は何もしないんです。
俺がapacheさんなら「仕事しながら待っとけ」と言う所です。

つまり、プロセスは待っている間他のリクエストを受け付けることが出来ないんですね。
その結果、プロセス数がmax値まで行ってしまったり、無駄なメモリを使ったりするという状態になる可能性があります。

KeepAliveの利点

・Webページの表示が速くなる
・オーバーヘッドを軽減する

KeepAliveの欠点

・必ず設定したTimeout分無駄なプロセス時間を使用する

こんな感じです。
つまり、URLに対するオーバーヘッドの軽減の方がTimeout分の無駄なプロセス時間よりも大きければサーバーコストを削減することが出来るってな仕組みだと思います。

KeepAliveの個人的な感想

KeepAliveについて書かれているページを見ると、サーバーコストを前提に書かれているところが多いのです。サーバー管理者さんが良く書かれているからなのかな?って思うのですが。
実際にはKeepAliveの恩恵はその表示スピードの早さにあると僕は思ってます。

最近のWebページでは、一つのURLで非常に多くの画像やCSSファイルを必要としたりしています。
これをKeepAlive Off で表示すると、結構重いと思うのです。
体感出来るほどにKeepAlive Onの方が断然早い。

なので、ある程度のサーバーコストがかかったとしても、KeepAliveをOnにするだけの価値はあるんじゃないかなーって思うんですよね。

もちろんコンテンツの状態によってはOffにした方がいい場合もあると思います。

理想の設定は?

さて、利点と欠点があるので理想の設定は一つではないと思うのですが、一般的にはどんな設定がいいんでしょうね。

私は今のところ、以下のような設定がいいんじゃないかなーって思います。

  KeepAlive On
  MaxKeepAliveRequests 一番多く使われているセッション数
  KeepAliveTimeout 1

こんなの。
KeepAliveTimeoutの値ですが、0.5とか入力したいところですが、1が最小値。ちょっと書き換えればいいだけだとは思いますが。

KeepAliveTimeoutについては、面白い論文があります。
リクエスト間隔を考慮したウェブサーバのkeep-alive時間の自動設定

こんな実験してみたいなーと思いつつ。
妄想で色々設定している自分が恥ずかしくなったり。

実測テスト

さて、上記の設定で KeepAlive On の時と Offの時の表示スピードを測ってみます。
一度に表示される画像の数が62個あるページを、FirefoxのプラグインFirebugで計測したものです。

KeepAlive Off
表示スピード: 1200~1500/msec

KeepAlive On
表示スピード: 200~680/msec

こんな結果になりました。
大体2~6倍ほど早くなるってな結果ですね。

最後に

瞬間のアクセス数が多いとTimeout 1ってのは致命的な数字になってしまう場合もあると思います。
この設定も、状況に応じて色々な方法があると思います。
また、KeepAliveについては人それぞれ持論があったり、考え方があると思うので、色々調べてみると良いんじゃないかなって思います。

拍手[1回]

mod_cacheとかmod_disk_cacheとかmod_mem_cacheとか

こんばんわ。misneyです。

土曜日はお休みでした。
金曜日にGさんとЯYUさん、Big Buddhaさん、aluさん、J2xCさんらと飲みに行き、結構遅くまで飲んでいたせいか夕方まで寝てました。

さて、この間の休みもそうだったんですが寝すぎで寝れません。
この時間に寝れないと暇で仕方ないのです。

と、いうことで今日はキャッシュについて話したいと思います。

キャッシュが大好きな件

僕はこのキャッシュと言うのが大好きです。
プログラムで扱うキャッシュも、給料日後に増えるキャッシュも。

普段プログラムを書く時に、なるべく効率の良いキャッシュを考えながら作るのです。

・クライアントサイドのキャッシュ
 訪問者のPCにデータを保存させていただく
・ページキャッシュ
 URL毎に生成されるHTMLデータを保存しておく
・コンテンツキャッシュ
 HTMLのブロックごとにHTMLデータを保存しておく
・クエリキャッシュ
 データベースから取得した結果を保存しておく

こんな感じのキャッシュが存在するのかな?と思います。

この辺のどれを使うかを、コンテンツの内容や色々な場面に応じて考えます。
mod_cacheはページキャッシュになると思うので、ページキャッシュのお話になります。


mod_cacheについて

httpdは基本的にapacheを使用しています。
apacheは非常に多くのモジュールが存在していて、いろんな機能を使うことが出来ます。

その中の mod_cacheについて書いてみたいと思います。

mod_cacheは、動的に生成されるページなどをキャッシュしてそれを表示してくれるような機能を持っています。

キャッシュの仕組み

絵に書くとこんな感じ。すいません。絵心が無くて。

言葉で説明すると、下のようになるんです。

 ・訪問者がHTTPリクエストを送る
 ・mod_cacheがキャッシュの有無やリクエストヘッダを見て、キャッシュを使うか判断
 ・キャッシュを使っちゃおう!の場合はキャッシュデータを送り返す
 ・キャッシュは使わない って時は動的にページを作成

要は表示スピードが早くなるんです。
サーバーコストを下げることが出来る ⇒ ランニングコストが安くなる!
こんな恩恵が頂けるのです。

このキャッシュは以下のような場合に使えます。

 ・PHPやperlなど、動的に作成されるページ
 ・更新頻度が低い、もしくは一定時間ごとに更新される
 ・他のページとの整合性を取らなくても良さそう

例えば、リアルタイムにページの情報が更新されるような場合にはあまり使えないということ。
HTMLなど静的な場所にはあまり使えないということ。
(memoryを使えば少し恩恵がいただけるかも)

mod_cacheはmod_disk_cacheとmod_mem_cacheのいずれかの方法を選ぶことが出来ます。
名前のまんまですが、HDDを使うかmemoryを使うかって話ですね。

余談ですが、私はメモリを使ったキャッシュが大好きです。
memcachedを始めとして、色々と使っています。
最近はtmpfsを使うのが自分の流行です。

mod_disk_cacheとmod_mem_cache

さて、mod_disk_cacheとmod_mem_cacheのどちらが良いかというと、好みの分かれるところだと思います。

mod_mem_cacheで検索をかけて見つけたなんとなく@さんのページを拝見すると、どうもプロセス毎にキャッシュを生成するとのこと。
マルチスレッド MPMを使うといいんじゃない?ってなことが書かれていますが、PHPを使っていると、あまりworkerは使わない気がします。
非推奨とされているからですね。

私としては通常はmod_disk_cache。リバースプロクシとして使う場合はmod_mem_cacheかなーって考えてます。

mod_disk_cacheの動き

さて、mod_disk_cacheを使うと、以下のような2つのファイルがCacheDirLevels で設定した階層の下に作成されます。

hA.header
hA.data

これらはURLからキーを生成して自動的に作成されます。
2回目以降はこのファイルを使ってくれて、プログラムには渡されないって動きになります。

headerには応答ヘッダが、dataの方にHTMLデータが入っています。

プログラムが動かないから早いんですよ!って動きなのです。

動作検証
実際どれくらい早さが違うかをabを使って調べてみます。

mod_disk_cacheを使った場合
Requests per second: 745.71 [#/sec] (mean)

Smartyのキャッシュ機能を使った場合
Requests per second: 223.36 [#/sec] (mean)

何も使わない場合
Requests per second: 32.82 [#/sec] (mean)

大体こんな感じの結果でした。
Requests per secondは、1秒間に何回のリクエストを受け付けられるかって感じの数字です。確か。
なので、数字が大きいほど良いってことになります。

何も使わない場合の20倍。Smartyキャッシュの3倍ほど早いってことですかね。

ちなみに、何も使わない場合でも、コンテンツキャッシュを使っている状態です。データベースへの接続や計算などが無い状態ですね。
それだけ高速化されるということなのです。

キャッシュの選び方?
場面においてはmod_disk_cacheを使った方がいいってな結果だと思います。

Smartyのキャッシュもとても便利な物で、場面次第ではmod_disk_cacheより使い勝手が良いかも知れません。
任意に削除が出来る点が良いですね。

ただ、Smarty自体が重いのが懸念点で、独自にキャッシュシステムを作ってしまったり、常にLastModifiedを出したりした方が良いのかなーって思います。

mod_disk_cacheも場面によっては・・・ということに気をつけないといけません。
例えば1日一回の更新を行う様な場合はとっても簡単。
更新したら全てのキャッシュファイルを削除してしまえば良いのです。

逆にコメントを送信することが出来るページなど、いつ更新されるか解らないページにはあまり使えません。

コメントを送信した後もキャッシュされた情報(古い情報)を表示してしまう為、投稿したはずのコメントが表示されない。なんて問題が発生してしまう為です。

下手をすると逆にオーバーヘッドになってしまったり、おかしな動作をしてしまうキャッシュですが、上手く使えるように日々精進したいと思います。

最後に

私は良く間違ったことを書きます。
参考程度に読んでいただければと思います。

また、間違いなどがあったらご指摘を頂けると幸いです!

拍手[2回]

おまとめボタン

忍者カウンター

忍者ビジター

忍者アド

ブログ内検索

最新コメント

プロフィール

HN:
mizuno
年齢:
43
HP:
性別:
男性
誕生日:
1974/02/13
職業:
主に侍などを少々
趣味:
SEO(「申し訳ございません」や「指ぱっちん」「指定したサイトへは接続できませんでした」でググルと上位に。)
自己紹介:
母子手帳の仮死と書かれてる場所に丸されてます。

フリーエリア

忍者ツールズプロフィール

忍者ツールズプロフィールは終了しました