View
723
Download
1
Category
Preview:
DESCRIPTION
Working With Unix Processes の残りを読んだ。 社内自グループでの勉強会で使用。 本書は Ruby で解説してある中、多少 Python ではどうよと触れるなど。
Citation preview
Working With Unix Processes の残りを読んだよ
Katsuji Ishikawa <katsuji.ishikawa@gmail.com>
前回
Orphaned Processesの章まで
続き
menu
• (再)Working With Unix Processes てなに
• 各チャプターまとめ
Working With Unix Processes てなに
• http://workingwithunixprocesses.com/
• What a file descriptor is and how it works.
• When you need a daemon process, and when you don't.
• Creating new processes with fork(2).
• 4 different ways to exit a process.
• The real world concerns of spawning shell commands and how to avoid them.
• High level discussion about the costs and pitfalls of creating processes.
• Defining signal handlers that don't steal from other developers.
• Internals of Resque and Unicorn and how they use this stuff.
• Lots more! It's 130 pages packed with guidelines, sample code, and best practices.
各チャプターまとめ
Processes Are Friendly
• fork(2) は親プロセスのコピー
• メモリ全てまるっと
• かなりオーバーヘッドがある
• モダーンな *nix ではcopy-on-write(CoW)
が採用されている
Processes Are Friendly(cont.)
• (その名の通り)書き換える必要があるまでコピーを遅らせる
• リソース節約♡
• でも・・・
Processes Are Friendly(cont.)
• MRI(~1.8.x) (と Rubinius) は CoW サポートしてない
• GC 周りが CoW に向いてなかったらしい
• なので Ruby Enterprise Edition (REE)作られたり
• Twitter は REE に手を加えた kiji 作ったり
• その後改善されて REE は\(^o^)/オワタ
• http://www.infoq.com/jp/news/2012/03/ruby-eee-eol
Processes Are Friendly(cont.)
• じゃ、Python の GC はどうなのよ
• reference counting / mark-and-sweep らしいけどよくわからん><
Processes Can Wait
• まてるよ
• サンプルコードども
• Process.wait
• pid を返す
Processes Can Wait(cont.)
• Process.wait は pid を返す
• Process.wait2 というのもあるよ
• Process.wait2 は pid と status を返す
• サンプルコード
Processes Can Wait(cont.)
• Process.waitpid, Process.waitpid2 というのもある
• Process.wait, Process.wait2 と実体は同じ。”特定の” pid の子を待つ
Processes Can Wait(cont.)
• 競合問題 - 大丈夫だ、問題ない
• サンプルコード
• *nix プログラミングでは一般的な方法
• babysitting processes
• master/worker
• preforking
• などと呼ぶ
Processes Can Wait(cont.)
• unicorn
• (python なら gunicorn)
• fork した子プロセスがリクエストを捌く
• 応答してるか親がチェック
• 並行性と信頼性の両立
• Ruby の Process.wait は waitpid(2)
Zombie Processes
• (略)m(_ _)m
Processes Can Get Signals
• シグナル
• SIGCHLD をトラップしてみる
• サンプルコード
• シグナルの配送は信頼できない><
Processes Can Get Signals(cont.)
• どれかの動作をする
• 無視する
• 指定のアクションを実行
• デフォルトのアクションを実行
Processes Can Get Signals(cont.)
• シグナルはどこからくるの
• カーネルによって送られる
• ほげプロセス <=> カーネル <=> ふがプロセス
• irb 実行したターミナルを2つ起動してみる
• INT, TERM, KILL
Processes Can Get Signals(cont.)
• シグナルを再定義
• シグナルの無視
• ほか - kill コマンド
Processes Can Get Signals(cont.)
• unicorn だと
• INT で即座に終了
• USR2 でダウンタイムなしの再起動
• TTIN で ワーカーを増やす
• Ruby の Process.kill は kill(2)
Processes Can Communicate
• プロセス間通信
• パイプ
• 一方通行
• irb で試してみる
• IO.pipe は pipe(2)
Daemon Processes
• バックグラウンドで動き続けるプロセス
• Webサーバ、DBサーバ
• GUI ならウィンドウシステムだったり
• いろいろ
• Rack をみてみる (server.rb)
Daemon Processes (cont.)
• 1.9 以降なら Process.daemon だけで済む..
• なにをしてるか追って見る
• Process.setsid は setsid(2), Process.getpgrp
は getpgrp(2), など
Spawing Terminal Processes
• fork + exec
• プロセスを置き換える
• fork でプロセス作成(コピー), exec で変身
• Kernel#system は system(3), Kernel#exec は
execve(2)など
Ending
• 2つ
• 抽象化
• 通信
• ネットワークは別の書籍に..
• Appendix も読もう
• Resque, Unicorn, Prefork サーバについて
Recommended