working with unix processes の残りを読んだよ

Post on 20-Jun-2015

720 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

Working With Unix Processes の残りを読んだ。 社内自グループでの勉強会で使用。 本書は Ruby で解説してある中、多少 Python ではどうよと触れるなど。

TRANSCRIPT

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 サーバについて

top related