〜 /procで理解するOSの状態 〜
遠田 耕平
2002/12/10
/procディレクトリ直下のファイルとディレクトリ
/proc配下のファイル群は大きく、
- プロセスごとの状態表示を行うもの
- システム全体にかかわるもの
に分けられます。
■プロセスIDディレクトリによる状態確認
初めに、プロセスごとの状態表示を見てみましょう。/proc/プロセスID/の下にプロセスごとの状態が表示され、(最近の)psはこの値を見てプロセス状態を表示します。手近なプロセスについて見ると、以下のようなファイルがあることが分かります。いずれも書き換えはできませんが、プロセスの状態についての重要な情報が得られます。
ファイル名
|
内容例
|
|
cmdline | bash | |
cwd | /home2/tmp(シンボリックリンクに見える) | |
exe | /bin/bash(シンボリックリンクに見える) | |
root | /(シンボリックリンクに見える) | |
environ | 環境変数 | |
fd/ | ファイル記述子 | |
cpu | 各cpuでのCPUタイム(ユーザー/システム)とその総計 | |
maps | プロセスのアドレス空間の状態 | |
mem | プロセスのアドレス空間の内容 | |
mounts | マウント状態 | |
stat | プロセス状態 (旧) | |
status | プロセス状態 | |
statm | プロセスのページ割り当て状態 |
cmdline、cwd、exe、rootなどを見ることで、そのプロセスのコマンドライン引数、その実行形式やカレントワーキングディレクトリ、ルートディレクトリなどが分かります。environからは、そのプロセスの環境変数を読み出すことができます。環境変数に影響されてプロセスの動作がおかしくなっているのではないか、といった場合にチェックします。
fd配下には、そのプロセスのオープンしているファイル記述子が見えるようになっています。fd配下のファイル記述子(番号)に対応するファイルを開くと、そのプロセスがオープンしている記述子と同じものがオープンされます。
cpuは、各cpuでのCPUタイム(ユーザー/システム)とその総計を表示します。シングルCPUではあまり意味がありませんが、マルチプロセッサシステムではプロセスがどのCPUでどれだけ実行したかを調べることが可能です。
mapsは、プロセスのアドレス空間にどのような情報が配置されているかを示します。
08048000-08049000 r-xp 00000000 16:44 66267 /home/foo/a.out |
0x8048000から0x8049000(0x8048fff)までの4Kbytesにa.outのプログラムテキストが、0x8049000から0x804a000(0x8049fff)までの4Kbytesの領域にデータが置かれていることが分かります。また、少し離れて0x40000000からlibcなどの共有ライブラリが、ユーザー空間の末尾にスタックが置かれていることが分かります。mapsを参照することで、プログラムのリンク状態や実際のデータの配置などをチェックできます。チューニングには直接役立たないかもしれませんが、自分の相手にしているプロセスがどのような構成の空間で動いているのかを知っておくと、意外なところで役に立ちます。
mountsを読み出すと、そのプロセスの名前空間にマウントされているファイルシステムを読み出すことができます。
statusとstatは、そのプロセスの状態を示す最も情報量豊かな/procファイルといってよいでしょう。statusには、プロセス(実行形式)名、プロセス状態、プロセスIDなどの識別子、仮想メモリの使用量、シグナル状態などが表示されます。
Name: tcsh |
statも意味合いはstatusとほぼ同様ですが、ページフォルト回数や消費したCPUタイムなどの統計情報、いくつかのレジスタ値などが表示されます。
statmはページの使用状態を示しており、その内容を見ると無愛想に7組の数値が並んでいます。
79 79 66 2 0 77 13 |
先頭から順に、総ページ数、メモリ中に駐在しているページ数、共有されているページ数、自分自身のテキストのページ数、データ/スタックのページ数、ダーティなページ数となります。メモリ資源はプロセスの動作に大きく影響を与えるので、この値からもプロセスの動作状態をある程度判断できます。
■/proc直下のファイル群
次に、/proc/直下に置かれているファイル群を見ておきましょう。
ファイル名
|
内容
|
|
cmdline | システムのブートパラメータ | |
version | カーネルバージョン | |
cpuinfo | CPU情報 | |
uptime | システム動作時間 | |
devices | デバイスとメジャー番号の対応 | |
partitions | 認識されたパーティション一覧 | |
filesystems | サポートするファイルシステムタイプ | |
interrupts | プロセッサへの割り込み要因のリスト | |
pci、ioports、iomem、interrupts | 認識しているハードウェア情報 | |
swaps | スワップファイル一覧 | |
locks | ファイルロックのリスト | |
loadavg | ロードアベレージ | |
stat | システム状態 | |
meminfo | 空きメモリ情報 | |
slabinfo | スラブキャッシュの状態 |
cmdline、version、cpuinfoなどから、システムのブートパラメータ(注)やカーネルのバージョン、CPUの種類などをチェックできます。
注:システム全体にかかわる、一般には起動時にしか変更できないようなパラメータです。LILOなどのブートローダで指定します。 |
uptimeは、システムの稼働時間を示します。
devices、partitions、filesystemsは、それぞれ認識されているデバイスとそのメジャー番号の対応、認識されているパーティションとそのサイズ、メジャー番号/マイナー番号の対応、サポートしているファイルシステムタイプの一覧が表示されます。
pci、ioports、iomem、interruptsなどは、システムに接続されているPCIデバイスの一覧やデバイスが使用しているI/Oポート、メモリマップドI/O、割り込み要因とその要因に割り込んだ回数などの割り込み情報が表示されます。
swapsには、システムが使用しているスワップパーティションとスワップファイルの一覧が表示されます。
locksは、システム中のflockやlockf(fcntl)で取られているファイルロックの一覧を表示します。
loadavg、stat、meminfoは、システムの負荷を示すという点で興味深いファイルです。loadavgはその名のとおり、いわゆるロードアベレージを表示します。ロードアベレージとは、大ざっぱにいうとCPUの利用率のことで、CPU上で動作しているプロセスの数の累計といってもよいでしょう。
loadavgは、以下のように5つの値から構成されています。
0.11 0.27 0.23 2/91
21684 |
前の3つがいわゆるロードアベレージで、過去1分間(上記の「0.11」)、過去5分間(同「0.27」)、過去15分間(同「0.23」)のCPU使用率を示します
statは、システムの全体的な動作状況を表示します。
$ cat /proc/stat |
これは、2CPUのシステムの/proc/statの例です。
cpu、cpu0、cpu1の行は、ユーザー時間、nice時間(nice値が正、すなわちプライオリティの低いプロセスの動作時間)、システム時間、総tick数となります(いずれも単位はtick)。
pageの行は、ページイン回数、ページアウト回数、swapの行はスワップイン、スワップアウト回数をそれぞれ示します。
intrの行は、割り込みの回数を示します。数値がたくさん並んでいますが、それぞれ、割り込み要因番号に対応する割り込み回数を示します。最初の数値は、総割り込み回数です。
上の例のシステムでは、/proc/interruptsは、
CPU0 CPU1
0: 2825726 2899763 IO-APIC-edge timer
1: 38308 36906 IO-APIC-edge keyboard
2: 0 0 XT-PIC cascade
5: 236432 238784 IO-APIC-edge NE2000
12: 54148 56636 IO-APIC-edge PS/2 Mouse
14: 413658 413226 IO-APIC-edge ide0
15: 112150 117640 IO-APIC-edge ide1
19: 0 0 IO-APIC-level usb-uhciのようになっているので、7443435の次の5725490が0:のタイマ割り込み(2825726+2899763)、その次の75214がキーボード割り込み(38308+36906)となり、対応していることが分かります。どのような外部デバイスからどの程度割り込みが入っているかは、システムの負荷を考えるうえで重要な情報となります。
次のdisk_ioは読んで字のごとく、ディスクI/O回数を示します。最初の(3,0)はメジャー番号とマイナー番号の組で、後ろの(15499,14865,14951,634,61459)は、それぞれドライブ全体のI/O、読み込みI/O回数、読み込みブロック数、書き込みI/O数、書き込みブロック数となります(1度のI/Oで複数のブロックが読み書きされることがあるため)。
ctxtは、コンテキストスイッチ回数(プロセスの切り替え回数)を示します。
btimeは、システムの起動時刻を1970/1/1からの経過時間(秒数)で表示します。
meminfoは読んで字のごとく、メモリ使用量を示します。
total: used: free: shared: buffers: cached: |
上の 2 行が、システム全体の総合的なメモリ使用状態を示します。「total」の欄が総メモリ量、「used」は使用中のメモリ量、「free」が空きメモリ量となります。
注意しなければならないのは、ファイルの読み書きに伴って「キャッシュ」として利用されている分も「使用中」に含まれていることです。すなわち、Linuxは空いているメモリすべてをファイルの内容の一時保管所として使用し、それによってファイルアクセスの性能を稼いでいるのですが、そのキャッシュ分も「使用中」としてカウントされるのです。「cached」に示されているのが、キャッシュとして使用されているメモリの量です。キャッシュとして使われているメモリは(それがファイルの内容と一致している限りは)そのまま「捨てて」別の用途に転用可能ですから、実際には空きメモリと同じと考えて構いません。
起動後しばらく動作した後のシステムにおいては、「空き」メモリは大抵「0」に近くなってしまいますが、「メモリがない!」といって慌てる必要はありません。上の例では512Mbytesのメモリのうち、空きメモリが95Mbytesしかないように見えますが、本当はキャッシュの306Mbytes分を含めて400Mbytes近く空いている計算になります。
meminfoと同様の働きをするものとしてfreeコマンドがありますが、freeコマンドはこのファイルの内容を見て空きメモリ情報を表示しています。
2行目の「Swap」は、それぞれ総スワップ量、使用中のスワップ量、空きスワップ量を示しており、スワップへの負荷の掛かり方の目安となります。
slabinfoは、スラブキャッシュ(小さなメモリ片を管理するための機構)の状態を示します。
slabinfo - version: 1.1 |
カーネル内には、用途ごとにさまざまな大きさのスラブキャッシュが用意されており、このファイルはそれぞれのスラブキャッシュの状態を表示します。スラブキャッシュの名前、アクティブなオブジェクト(メモリ片)の数、確保されている総オブジェクト数、オブジェクトの大きさ、アクティブなスラブ数、確保されている総スラブ数(「スラブ数」はページ数と考えてもよいでしょう)などが表示されます。
スラブキャッシュごとに使われ方が変わってくるので一概にはいえませんが、特定の種類のスラブが大量に使われている場合は、そのスラブキャッシュを使用するコンポーネントに問題がある可能性があります。
後編は12/17公開予定! 後編では、/proc/sys配下のファイル群とパラメータについて解説します。また、これらのパラメータを利用したチューニング例も紹介します。 |
2/2
|
|
||||
|
Linux Square全記事インデックス |
Linux Squareフォーラム Linuxカーネル関連記事 |
連載:Linux Kernel Watch(連載中) Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします |
|
連載:Linuxファイルシステム技術解説 ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する |
|
特集:全貌を現したLinuxカーネル2.6[第1章] エンタープライズ向けに刷新されたカーネル・コア ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する |
|
特集:/procによるLinuxチューニング[前編] /procで理解するOSの状態 Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する |
|
特集:仮想OS「User
Mode Linux」活用法 Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説 |
|
Linuxのカーネルメンテナは柔軟なシステム カーネルメンテナが語るコミュニティとIA-64 Linux IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|