IIJ Technical WEEK 2012 Day1 #iij_tw2012
- IIJ_doumae
- 9178
- 0
- 10
- 25
軽量スレッドの軽量の定義は10万個起動しても大丈夫という意味 #iij_tw2012
2012-11-14 16:49:41なぜHaskellか?Haskellのスレッドは軽量・安全。ここで軽量とは「10万個起動しても大丈夫」というイメージ。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 16:49:52カーネルによるコンテキストスイッチではなく、ユーザプログラムがコンテキストスイッチを起こすものを「軽量」と呼びたい。軽量プロセス→Erlang、軽量スレッド→Haskellで実現されている。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 16:51:34「関数型言語だから軽量スレッド・プロセスがつくれるのか?」去年質問されて1年間考えた。結局関数型プログラミングには破壊的代入がないので、実現できたのではないかと考えている。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 16:52:35ネイティブスレッド。複数スレッドを作っておけばカーネルが勝手にコアに割り振ってくれる。ただしコンテキストスイッチが発生するので性能が出ない。そこで最近はイベント駆動に注目が集まっている。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 16:55:11イベント駆動はコアあたりの性能は出るが、複数のコアを有効に活用できない。(コアの数だけプロセス上げればいいとも言うが…)イベントハンドラのせいでコードの見通しも悪くなる。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 16:56:10Haskellの軽量スレッド使うとイベント駆動の上に軽量スレッドのせられるのでコードの見通しが良いのか。こうみるといい感じだな。 #iij_tw2012
2012-11-14 16:56:48非同期例外。他のスレッドにとって自分が殺される。それを補足したい。Haskellでは魔法のようなTimeout関数を使うことで「タイムアウトしたら失敗」を検知できる。他の言語よりも実現しやすい。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 16:59:21プールされたプロセスとスレッドの差ってTLBのフラッシュの差とかでコンテキストスイッチの処理に差がでるけど、軽量プロセスと軽量スレッドの差は資源を共有するかどうかの差だけ? #iij_tw2012
2012-11-14 16:59:43高速化のためにやったこと。システムコールを呼ぶとすべての軽量スレッドが止まるので、最小限に。汎用的な思いライブラリを書き換えて高速化。知らないうちにロックされていることがあるので、それを回避する。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:00:26Warpのアーキテクチャ。システムコールがなるべく発生しないようにしている。もしファイルがキャッシュに乗っていれば、3つのシステムコールで応答を返せる。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:02:33nginxみたいにマルチプロセスにイベント駆動のせてイベントハンドラ登録させるとコードの見通しが悪いってのを考えると、erlangの軽量プロセスとHaskellの軽量スレッドめっちゃ良い気がしてきた。しかし、これのデメリットはなんなんだろう? #iij_tw2012
2012-11-14 17:03:12Linuxではstraceでシステムコールを観測できる。年中眺めていると無駄なcallが見つかる。連続してstatを投げているなど。1回にまとめて例外を捕まえる方が効率的。知らないうちにfutex()つかてったり #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:04:11accept4はノンブロッキングなacceptですね。apache2.4のeventはこの部分がブロッキングだった #iij_tw2012
2012-11-14 17:04:58nginxのstraceをよく眺めている。知らないシステムコールを見つけることも。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:05:38ベンチマークツール。Apache Bench(ab)不安定。httperfメモリ管理がまずい。ベンチマークツール側が負けてしまうこともある。いまのところweighttpがおすすめ。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:06:47「ベンチマークツールはabはおすすめしない。httperfもabもselect使ってるから、サーバ側が早くなるとベンチ側が先にダメになる。」確か、selectは監視するfdの数が1024で、シーケンシャルに舐めるからかなり遅いんだったかな? #iij_tw2012
2012-11-14 17:08:00ベンチマークツールを駆使していると突然パフォーマンスが出ないケースに出くわすことも。1コネクションに制限するとスループットが出ない。1000コネクションで見ていると気づかない。1コネクションだと気づけた。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:08:16haskellのコンパイラ。GHC(Glasgow Haskell Compiler)プロファイリングオプションがある。フォワグラウンドで、1プロセスの時しかプロファイルがとれない。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:10:56webサーバのベンチマークはweighttpを使いましょう。epoll使っててオススメ。 #iij_tw2012
2012-11-14 17:13:40HaskellのDate.Timeは汎用的な代わりに非効率。HTTPでは日付の書式が決まっているので、29文字限定でGMTでの表記に特化したライブラリを書いた。ログはstrftime()へのラッパーを経由して書く。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:13:54.@IIJ_doumae すいません。資料にタイポがありました。「Date.Time」→ 「Data.Time」 #iij_tw2012
2012-11-14 18:06:33ロックの調査。Haskellではeventlogをとるツールがある。プログラムにログを出力するコードを挿入。出てきた結果をThreadScopeで可視化。これでロックの利用状況を把握。 #iij_tw2012 http://t.co/p3V6q3dq
2012-11-14 17:16:39