forkとファイルハンドル UNIX系のOSでは、複数のプログラムが、それぞれプロセスという単位で動作しています。forkというシステムコール[1]が呼び出されると呼び出したプロセスの複製がOSによって作成され、複製されたプロセス(子プロセス)がexecveというシステムコールを使って別のプログラムにすり替わる、というしくみでさまざまな処理を実行するようになっています。 「複製」と言っても、全部の情報が複製されるわけではありません。プロセスのメモリイメージが複製される[2]一方で、プロセスが開いている「オープンファイル記述」(open file description)(注3)は複製されません。forkのあとは、親プロセスと子プロセスの両者が、単一のオープンファイル記述を指す「ファイル記述子」(file descriptor)(注4)を持つことになります(図2)。 図2 for
内容(3行) memoryの使用量を監視している所からアラートが来て調査した アプリケーションのheap使用率は高くなく、top等を見ても他に怪しいプロセスが存在しない /proc/meminfoからslab領域の肥大を確認、slabtopでdentry_cacheが肥大化している事がわかったので、echo 2 > /proc/sys/vm/drop_caches を実施した 何があったのか 運用中のとあるサーバーのmemoryが残り20%を切ったとアラートが来たため、調査を行った。 当初は何かしらのプロセスがメモリリークしているか何かだろうとあたりをつけていた。 freeで現状確認 キャプチャとるの忘れた… が、一旦確かにfree(buffers, cahceを足したもの)がtotalの20%を切っていることを確認。 topで確認する アプリケーションプロセスにメモリを大量消費しているプ
しばらくLinuxネタが続く・・。 近いうちに最近出たJava8ネタを書いてみようと思います。が、もう少しLinuxネタにお付き合いください。 前回はsshdを対象に親プロセスをkillした場合の動作を確認した。 killされたプロセスの子プロセスは孤児プロセスとなり、カーネルによって自動的にinitプロセスの子として扱われる事を説明した。(この動作を「リペアレンティング」と呼ぶ) 今回はこの続き。 Linuxで作業していてCtrl+Cしてプロセスを終了した場合、フォアグラウンドのプロセスやその子プロセスも一緒に終了する。 ということは、子プロセスは孤児として扱われず、リペアレンティングされていないことになる。 今回の記事ではこの振る舞いの違い(リペアレンティングされるか否か)に着目し、kill -SIGINTコマンドとCtrl+Cの違いについて考えていく。 そもそもkillコマンドやCt
「Linuxのしくみを学ぶ - プロセス管理とスケジューリング」公開ページ こちらのページはSoftware Design誌 2009年12月号の記事「Linuxのしくみを学ぶ - プロセス管理とスケジューリング」の公開ページです。 「ハイパーバイザの作り方」も公開中ですので、こちらも是非ご覧ください。 公開中の記事 HTML PDF ePub mobi Kindle 原稿データ 全ての原稿データはgithub上で公開されています。 Pull RequestやIssuesを通じて文章の誤り訂正や解説の追記、各フォーマットの表示の改善などのコントリビューションを受け付けています。 改善された記事は随時このページにアップロードしていきます。 記事に関するご質問 記事を読んで何かわからなかった点があったり、疑問に思ったことがあれば以下の連絡先に問い合わせてください。 Twitter: @syuu
October 21, 2013 サラサラ〜っと読んで放置していた 「なるほどUnixプロセス ― Rubyで学ぶUnixの基礎」を読みました。 週末手を動かしながら読めたのでよかった。 fork(2)周りの所作とpipe(2)、socket(2)も簡単に試せてよかった。 daemon化するために孫プロセスで動かすとか古典的な感じだった。 本書は簡単に書きながら試せる。っていうのが最高に最高だと思います。 何で放置していたものを手に取ったかは なるほどUnixプロセス読んだ - デーモン化のためのdouble fork - はこべブログ ♨ このはこべさんのエントリー読んだのがきっかけでした。 親プロセスは2度死ぬ - デーモン化に使うダブルforkの謎 - 睡眠不足?! そしてこちらのエントリーへ行って、詳解UNIXプログラミングに行きあたり いい加減読むか〜って思って色々見ていたら 『
プロセス置き換えとか、名前付きパイプとか、とても便利な機能なのだけど、その仕組みはどうなっているのだろう?断片的な知識ばかりでは、その核心にはなかなか辿り着けない。サンプルコードの真似はできるけど、それ以上の発想はできない...。もっと根本的なところからちゃんと理解しておかないと、いつまでたってもコマンドの使い方の本質が理解できないと感じた。プロセスとは何か?パイプとは何か?リダイレクションとは何か?ファイルディスクリプタとは何か?可能な限りその本質を探ってみようと思う。 UNIXのプロセス UNIXでは、複数のユーザーがログインした状態で、同時に複数の処理を依頼される状況が多々ある。 ところが、どんなに高性能なCPUであっても、ある瞬間に処理できるのはたった1つの処理だけである。 そんな時OSは、それぞれの処理に必要なメモリ領域を割り当てて、CPUをタイミングよく切り替えながら同時並行的
すでに販売している書籍の更新も地味に行なっております。 なるほどUnixプロセス ― Rubyで学ぶUnixの基礎【電子書籍】Jesse Storimer, 島田浩二(翻訳), 角谷信太郎(翻訳) 達人出版会 発行日: 2013-04-25 対応フォーマット: EPUB, PDF, ZIP 詳細を見る スッキリわかるJava入門【電子書籍】中山清喬, 国本大悟 インプレスジャパン 発行日: 2013-03-08 対応フォーマット: PDF 詳細を見る 『なるほどUnixプロセス』はv0.9.2になりました。まだβ版ですが、修正点はそれなりにあります。詳しくは下記をどうぞ。 https://github.com/tatsu-zine/naruhounix/issues?milestone=2&page=1&state=closed また、『スッキリわかるJava入門』については、元の書籍が第
なるほどUnixプロセス ― Rubyで学ぶUnixの基礎を読みました。UNIXプロセスの話、特に実用的なforkの利用方法についての話がコンパクトにまとまっていてわかりやすかったです。あまり詳細に踏みこんでいるという感じではないけど、とっかかりにこの本にあるような知識があるのは良いと思いました。(シェルスクリプトから"foreman start"したときにCtrl-Cで終了できない現象の解説 - はこべブログ ♨ではまる前に読んでおいたら、もっとはやく問題解決できたと思います。) 第18章 デーモンプロセスに関係して二回目のforkについていろいろ調べたので、せっかくなのでメモを残しておきます。*1 第18章 デーモンプロセス では、プロセスをデーモン化するために必要な手順が丁寧に説明されています。その中で、プロセスを制御端末から切り離す手順として以下のようなコードが紹介されていました。
Perl:forkしたプロセス間でのメモリ領域の共有 (Link: 遅レス。 - Apache + mod_perl - MaxClients の値に注意) 遅レス。 - Apache + mod_perl - MaxClients の値に注意 共有されてるメモリ領域は/proc/$pid/smapsで取れます。Linux::Smapsを使うとプロセス全体での合計が見れたりして便利です。 Linux::Smapsの例を見るとLinuxのcopy on writeで共有されている様子が分かりやすいです。Apache + mod_perlやFastCGIで大量にforkするときには注意が必要ですね。 大雑把に言うと以下のようになります。 forkする前に確保したメモリ領域は共有される→shared_dirtyになる forkした後にその領域に書き込みを行うとコピーされる→private_dir
随分久々の Linux ネタです。以前にロードアベレージに関する考察などの記事も書きましたが、多くのサーバーサイドエンジニアはサーバ負荷と日々戦っていることかと思います。過去多くの場合、負荷の原因特定はおおよそ下記のような手順で分析をしていたことかと思います。※詳しい手順は別エントリとして記載予定。 top をみて上位に張り付いているプロセスを確認しつつ CPU or I/O のどちらが原因か判別 ps を使ってプロセスの状態を確認して(T),(D)の状態から CPU or I/O のどちらが原因か判別 vmstat で procs の r, b の数、swap の si, so の状態、I/O の bi, bo の状態を確認 iostat を使って disk の read/write の状態をさらに詳しく確認 sar を使って os の状態をさらに詳しく確認 おおよその原因特定から設定を
シグナルと trap コマンド シグナル シグナルとは? シグナルとは、実行中のプロセスに対して、さまざまなイベントを通知するために送出されるものである。 よく使用される、プロセスを終了するためのシグナルである SIGTERM や SIGKILL などのほかにも、数十種類のシグナルが存在する。 使用可能なシグナルの一覧は、コマンドラインから kill -l を実行することで参照可能である。 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19)
KLab Advent Calendar 2011 「DSAS for Social を支える技術」の7日目です。 @methane の新シリーズは Apache+php のチューニングです。 今日のお題は、タイトルのとおり、phpのプロセス数(=並列数)を減らすことです。 これはチューニンガソンでも人気のチューニングだったのですが、 今日はそのメリットをまとめます。 ロードアベレージが下がる プロセス数をコア数+α程度に抑えると、ロードアベレージがコア数の数倍〜 数十倍になることがなくなります。 例えばロードアベレージがコア数の100倍になると、1リクエストの処理に かかる時間は100倍以上に増え、せっかく処理したのにクライアント側が タイムアウトしていて完全に無駄骨になったり、最悪では再リクエストが来て さらに負荷が上がる負のスパイラルに陥る可能性があります。 たくさん一気に処理しよう
ゾンビ状態とはpsコマンド上では実際にはプロセスは終了しているが、プロセスが完全にクリアされていない状態を指します。具体的にどのような場合に起こり、どのような状態になっているのかが問題です。この問題をとく鍵がプロセスのライフサイクルにあります。 Linuxではexit()でプロセスが終了するとき、すぐにリソースを解放するのではなく、いったんゾンビ状態(TASK_ZOMBIE)に遷移します。これは親プロセスがwait()システムコールを呼び、その子プロセスの終了状態を得られるような仕組みを提供しているからです。 つまりプロセスはゾンビ状態を経て、親プロセスのwait()が終了すると完全に破棄されます。このことから親プロセスのwait()が実行される前に子プロセスが終了している場合、子プロセスはゾンビプロセスであるといえます。 例えば意図的にゾンビ状態を作るプログラムを考えてみます。 //
また Linux カーネルの話です。 Linux では fork によるマルチプロセスと、pthread によるマルチスレッドでの並行処理を比較した場合、後者の方がコストが低く高速と言われます。「スレッドはメモリ空間を共有するので、マルチプロセスとは異なりコンテキストスイッチ時にメモリ空間の切り替えを省略できる。切り替えに伴うオーバーヘッドが少ない。」というのが FAQ の答えかと思います。 が「オーバーヘッドが少ない」と一言にいわれても具体的にどういうことなのかがイメージできません。そこで Linux のスレッド周りの実装を見て見ようじゃないか、というのが今回のテーマです。 3分でわかる(?) マルチプロセスとマルチスレッド まずはうんちく。マルチプロセスとマルチスレッドの違いの図。以前に社内で勉強会をしたときに作った資料にちょうど良いのがあったので掲載します。Pthreadsプログラミ
php + apache のメモリ量をおさえる(2) workerを使ってみる(チューニング)
php + apache のメモリ量をおさえる(2) workerを使ってみる
バッチのまとめTOPへ bash 初級者は,簡単なコマンドが並んだだけの小さなスクリプトを書くことができる。 しかしシェルの動作原理をよく理解しておらず, 一歩進んだことをやろうとするとつまずく。 シェルスクリプトの中級者になるためには, Linux上でシェルが動作する仕組みを体系的に理解しておく必要がある。 (1) シェルとコマンドについて (1−1) シェルとは,OSに命令を出すために,OSを包んでいる外膜である。 (1−2) Linuxログイン時には,そのユーザ用のログインシェルが起動する。 (1−3) ユーザが打ち込んだコマンドは,実行前に,bashによって整形される。 (1−4) コマンドの先頭の文字列は,実行可能ファイルか,またはbashの組み込みコマンドである。 (2) コマンド間の連携について (2−1) コマンド呼び出しとは,サブプロセスの生成である。 (2−2) 親プロ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く