/procによるLinuxチューニング [前編]
〜 /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
08049000-0804a000 rw-p 00000000 16:44 66267    /home/foo/a.out
40000000-40016000 r-xp 00000000 16:42 442401   /lib/ld-2.2.4.so
40016000-40017000 rw-p 00015000 16:42 442401   /lib/ld-2.2.4.so
40017000-40019000 rw-p 00000000 00:00 0
40033000-40166000 r-xp 00000000 16:42 327696   /lib/i686/libc-2.2.4.so
40166000-4016b000 rw-p 00132000 16:42 327696   /lib/i686/libc-2.2.4.so
4016b000-4016f000 rw-p 00000000 00:00 0
bfffe000-c0000000 rwxp fffff000 00:00 0

 0x8048000から0x8049000(0x8048fff)までの4Kbytesにa.outのプログラムテキストが、0x8049000から0x804a000(0x8049fff)までの4Kbytesの領域にデータが置かれていることが分かります。また、少し離れて0x40000000からlibcなどの共有ライブラリが、ユーザー空間の末尾にスタックが置かれていることが分かります。mapsを参照することで、プログラムのリンク状態や実際のデータの配置などをチェックできます。チューニングには直接役立たないかもしれませんが、自分の相手にしているプロセスがどのような構成の空間で動いているのかを知っておくと、意外なところで役に立ちます。

 mountsを読み出すと、そのプロセスの名前空間にマウントされているファイルシステムを読み出すことができます。

 statusとstatは、そのプロセスの状態を示す最も情報量豊かな/procファイルといってよいでしょう。statusには、プロセス(実行形式)名、プロセス状態、プロセスIDなどの識別子、仮想メモリの使用量、シグナル状態などが表示されます。

Name:   tcsh
State:  S (sleeping)
Tgid:   22884
Pid:    22884
PPid:   22882
TracerPid:      0
Uid:    500     500     500     500
Gid:    500     500     500     500
FDSize: 32
Groups: 500
VmSize:     3528 kB
VmLck:         0 kB
VmRSS:      1424 kB
VmData:      724 kB
VmStk:       112 kB
VmExe:       268 kB
VmLib:      1424 kB
SigPnd: 0000000000000000
SigBlk: 0000000200000002
SigIgn: 8000000000384004
SigCgt: 0000000009812003
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000

 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
cpu 1653518 273804 195678 9327980
cpu0 885437 140793 98340 4600920
cpu1 768081 133011 97338 4727060
page 2140947 893577
swap 153 2437
intr 7443435 5725490 75214 0 47 4 475216 6 0 0 0 0 0 110784 0 826884 229790 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
disk_io: (3,0):(15499,14865,14951,634,61459)
ctxt 30698664
btime 1036365929
processes 6961

 これは、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:
Mem:  527839232 518279168  9560064        0 63332352 306401280
Swap: 534634496 21557248 513077248
以下略

 上の 2 行が、システム全体の総合的なメモリ使用状態を示します。「total」の欄が総メモリ量、「used」は使用中のメモリ量、「free」が空きメモリ量となります。

 注意しなければならないのは、ファイルの読み書きに伴って「キャッシュ」として利用されている分も「使用中」に含まれていることです。すなわち、Linuxは空いているメモリすべてをファイルの内容の一時保管所として使用し、それによってファイルアクセスの性能を稼いでいるのですが、そのキャッシュ分も「使用中」としてカウントされるのです。「cached」に示されているのが、キャッシュとして使用されているメモリの量です。キャッシュとして使われているメモリは(それがファイルの内容と一致している限りは)そのまま「捨てて」別の用途に転用可能ですから、実際には空きメモリと同じと考えて構いません。

 起動後しばらく動作した後のシステムにおいては、「空き」メモリは大抵「0」に近くなってしまいますが、「メモリがない!」といって慌てる必要はありません。上の例では512Mbytesのメモリのうち、空きメモリが95Mbytesしかないように見えますが、本当はキャッシュの306Mbytes分を含めて400Mbytes近く空いている計算になります。

 meminfoと同様の働きをするものとしてfreeコマンドがありますが、freeコマンドはこのファイルの内容を見て空きメモリ情報を表示しています。

 2行目の「Swap」は、それぞれ総スワップ量、使用中のスワップ量、空きスワップ量を示しており、スワップへの負荷の掛かり方の目安となります。

 slabinfoは、スラブキャッシュ(小さなメモリ片を管理するための機構)の状態を示します。

slabinfo - version: 1.1
kmem_cache            63     72    108    2    2    1
urb_priv               0      0     64    0    0    1
ip_conntrack           8     36    320    3    3    1
tcp_tw_bucket          1     30    128    1    1    1
tcp_bind_bucket       19    112     32    1    1    1

 カーネル内には、用途ごとにさまざまな大きさのスラブキャッシュが用意されており、このファイルはそれぞれのスラブキャッシュの状態を表示します。スラブキャッシュの名前、アクティブなオブジェクト(メモリ片)の数、確保されている総オブジェクト数、オブジェクトの大きさ、アクティブなスラブ数、確保されている総スラブ数(「スラブ数」はページ数と考えてもよいでしょう)などが表示されます。

 スラブキャッシュごとに使われ方が変わってくるので一概にはいえませんが、特定の種類のスラブが大量に使われている場合は、そのスラブキャッシュを使用するコンポーネントに問題がある可能性があります。

後編は12/17公開予定!

後編では、/proc/sys配下のファイル群とパラメータについて解説します。また、これらのパラメータを利用したチューニング例も紹介します。

2/2

Index
/procによるLinuxチューニング [前編]
 〜 /procで理解するOSの状態 〜
  Page 1
/procファイルシステムとは
 /proc導入の経緯
 Linuxと商用UNIXの/proc
/procの設定方法
 /procの読み書き
 sysctlによる設定
  Page 2
/procディレクトリ配下のファイルとディレクトリ
 プロセスIDディレクトリによる状態確認
 /proc直下のファイル群

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カーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間