https://yakst.com/ja/tags
Yakst - operating-system
2017-06-18T21:02:16+09:00
Yakst
https://yakst.com/ja/posts/382
2014-07-24T00:47:00+09:00
2017-06-18T21:02:16+09:00
Linuxで、どのプロセスがページングを行っているのか調べるには?
<p>質問に対するストレートな回答は、<strong>調べるのは不可能</strong>、だ。どうしてそうなのかを説明してから、君の知りたい情報を含んでいるであろう、5つの関連する質問に答えよう。</p>
<p>Linuxのような、モダンなOSにおいては、スワップは<strong>システム全体における現象</strong>だ。ある1つのプロセスがスワップに関する責任を持っているわけではない。システムがスワップしているかどうかは、メモリプレッシャの機能による。物理メモリを大量に使おうとすれば、スワップしてしまう。何をスワップアウトするかは、一番少ないページを要求しているのが何かによる。何をスワップインするかは、一番ページを必要としているのが何かによる。プロセスがRAM上に存在しないページを要求した時、そのページはディスク上にあるので、スワップが発生することになる。これが即ページングを起こすプロセスだが、これが全てのプロセスのメモリ消費の総計であるRAM領域の不足の原因となるわけではない。</p>
<p>重要なことなので繰り返して言おう。スワップを発生させる原因となるプロセスは、音楽が止まっても座る椅子がなさそうなヤツのことだ。彼は、君の椅子を全て使ってしまう太った豚かもしれないし、君のシステム上では最も小さなプロセスかも知れない。問題の核心は、君の持っている椅子よりたくさんの椅子が必要だということだ。すなわち、全ての椅子を使ってしまっている巨大なプロセスがいることが問題だ。しかし、もっとよくある簡単な話としては、君のワーキングセット、つまり君が何かするのに必要なメモリの量が、システム上のRAMの大きさを超えている場合だ。だからスワップが発生する。</p>
<p>ふむ、それでは、<strong>プロセスが使っているRAMを確認することで、システムがどのくらいメモリを要求しているのか、雰囲気をつかんでみよう。どうすればよいか?</strong> <code>ps -aux</code>を使って、RSS列を見ればいい。RSSは、各プロセスが使っているRAM(例、磁気メモリ)の量だ。RSSの値が大きいプロセスが、一番RAMを使っているプロセスということになる。</p>
<p><strong>システム全体のメモリの状態を把握するにはどうしたらいいだろう?</strong> <code>free -m</code>コマンドを使えばいい。-/+ buffers/cache行を見よう。これが、I/Oバッファやページキャッシュ分をそれぞれ加減算した後の、システムの使用済みあるいはフリーなメモリの量だ。この行のfreeがゼロに近づいているなら、メモリ要求がRAMのサイズを超えつつあるので、スワップが始まるだろう。</p>
<p><strong>どのくらいスワップを使っているか?</strong> これも<code>free -m</code>を使おう。Swap行のusedを見ればよい。</p>
<p><strong>スワップしたのはいつだろうか?</strong> そういう時は<code>vmstat</code>だ。siとsoの列はそれぞれ秒単位で、ディスクからRAMへ移動したメモリ量、あるいはRAMからディスクへ移動したメモリ量だ。<code>vmstat 1</code>を実行すれば、リアルタイムで情報が見られる。これでスワップの実態を確認できる。</p>
<p><strong>各プロセスは、どのくらいスワップを使っているんだろうか?</strong>これに対しては、以下のスクリプトで、各プロセスがどのくらいディスクにスワップしているかを表示できる。</p>
<pre><code>#! /bin/bash
#
# Page on Page on swap.sh: Shows the swap usage of each process
# Author: Robert Love
swap_total=0
for i in /proc/[0-9]*; do
pid=$(echo $i | sed -e 's/\/proc\///g')
swap_pid=$(cat /proc/$pid/smaps |
awk 'BEGIN{total=0}/^Swap:/{total+=$2}END{print total}')
if [ "$swap_pid" -gt 0 ]; then
name=$(cat /proc/$pid/status | grep ^Name: |
awk '{print $2}')
echo "${name} (${pid}) ${swap_pid} kB"
let swap_total+=$swap_pid
fi
done
echo
echo "Total: ${swap_total} kB"
</code></pre>
<p>自分自身が所有するもの以外のプロセスの情報を見るため、このスクリプトはrootで実行する必要があるだろう。</p>
doublemarket
https://yakst.com/ja/posts/39
2013-08-30T10:59:00+09:00
2013-08-30T12:48:25+09:00
プロセスとスレッドの違いとは?
<p>「プロセスは実行中のプログラムを抽象化したものである」これは私が著書 "Linux Kernel Development" の中で使った比喩だ。バイナリイメージ、仮想メモリ、各種カーネルリソース、関連付けられたセキュリティコンテキストといったものだ。スレッドは、「プロセスの中の実行単位」で、仮想プロセッサやスタック、プログラムの状態だ。言い換えれば、プロセスは実行されるバイナリであり、スレッドはOSのプロセススケジューラがスケジューリングできる最小の実行単位であると言える。</p>
<p>プロセスは1つ以上のスレッドを持っている。シングルスレッドのプロセスでは、1つのプロセスは1つのスレッドしか持っていない。つまり、スレッドはプロセスであると言ってしまえる。実行されるのは何か1つのことだけだ。マルチスレッドのプロセスでは、プロセスは複数のスレッドを持っている。つまり、複数の何かが実行されている。</p>
<p>現代のOSにおける、主な仮想化された抽象化層といえば、仮想メモリと仮想プロセッサだ。どちらも、実行中のプロセスが、マシンのリソースを独り占めしているように見せかける仕組みを提供している。仮想メモリは、プロセスに対して、物理メモリあるいはディスク上のストレージ(スワップ領域)に対してシームレスに、一意なメモリ空間を割り当てる。仮想プロセッサは、実際には複数のプロセスが複数のプロセッサ上でマルチタスクをこなしているにもかかわらず、プロセスがそのシステム上で1つしか動いていないかのように振る舞わせることができる。</p>
<p>仮想メモリは、プロセスに対して関連づいているもので、スレッドに対してではない。そのため、スレッドは同じメモリアドレス空間を共有することになる。逆に言うと、仮想プロセッサは各スレッドに関連づいている。それぞれのスレッドは独立してスケジュールできる要素だ。</p>
<p>それで、何がポイントだろうか? プロセスは明らかに必要なものだ。しかし、なぜスレッドという別のコンセプトが現われ、マルチスレッドのプロセスというのが使えるようになったのか? これは、マルチスレッドの基本的な4つの利点があるからだ。</p>
<ul>
<li><p><strong>プログラミングの抽象化</strong> タスクを分けて、それぞれを実行単位(つまりスレッド)に割り当てるのは、多くの問題において自然なアプローチだ。このアプローチを活用したプログラミングパターンには、reactorやthread-per-connection、thread poolパターンがある。一方でスレッドをアンチパターンだという人もいる。比類なきプログラマ、アラン・コックスは「スレッドはステートマシンを理解できない人のためのものだ」と言っている。</p></li>
<li><p><strong>並列性</strong> プロセッサを複数持つマシンでは、スレッドは <em>真の並列性</em> を実現するための効率的な方法である。各スレッドは自分の仮想プロセッサを持ち、独立してスケジューリング可能な要素であるため、複数のスレッドは同時に複数のプロセッサ上で実行することができ、システムのスループットを上げることが可能になる。スレッドが並列性の実現のために使われているという意味においては、スレッドはプロセッサ数よりも少ない数が実行されているということになる。ここでは、先の「スレッドはステートマシンを理解できない人のためのもの」というのは適用されない。</p></li>
<li><p><strong>I/Oのブロッキング</strong> スレッドなしでは、I/Oのブロッキングによってプロセス全体が止まってしまう。これは、スループットとレイテンシの両方にとって有害だ。マルチスレッドなプロセスでは、それぞれのスレッドがブロックされ、I/O待ちになっても、一方では他のスレッドが処理を先に進める。非同期・ノンブロッキングI/Oは、この問題に対するスレッドに変わる解決法の1つだ。</p></li>
<li><p><strong>メモリの節約</strong> スレッドは、メモリを共有する効率的な方法を提供する一方で、複数の実行単位を最適化する。この意味では、マルチプロセスの代わりであるといえる。</p></li>
</ul>
<p>これらの利点によるコストは、ミューテックスや状態変数のような仕組みを通して同時実行を管理する必要があるという形で複雑性が増すことだ。マルチコアプロセッサやマルチプロセッサのマシンが一般的になる傾向が進むとすると、スレッドはシステムプログラミングに置いてより重要なツールになっていくだろう。</p>
doublemarket