〜 /procで理解するOSの状態 〜
Linuxの状態確認や挙動の変更で重要な役割を担うのが/procファイルシステムである。前編では/procの概念や/procを利用したOSの状態確認方法を理解していただきたい。(編集局)
遠田 耕平
2002/12/10
本稿では、/procファイルシステムによるカーネルチューニングを紹介します。カーネル2.4.19をベースに説明していきますが、カーネルのバージョンによって内容が異なる場合があります。また、ディストリビュータが独自の拡張を施しているものもあります。従って、これから説明する内容がすべて当てはまるとは限りません(端的にいうと説明の対象が存在しなかったり、説明されていない機能が追加されていることがあります)。
/procファイルシステムとは
/procは、Linuxシステムの/(ルート)に「ディレクトリ」として現れますが、このディレクトリは普通にLinuxを使っている分にはあまりなじみのないものかもしれません。水道の元栓のようなもので、「あることは知っているが、使おうと思うと使い方が分からない」というたぐいの存在といえるでしょう。
■/proc導入の経緯
/procはもともと、(「/proc」という名前が表しているように)「プロセスファイルシステム」として商用OSで導入されました。/procの目的は、プロセスとのインタラクションをファイルという一貫したインターフェイスで実現することでした。よく知られているように、UNIXのプロセスがシステムに対して行う操作はファイルという概念をベースに抽象化されています。普通のファイルはもちろん、デバイスのような一見ファイルに見えないものについても、UNIXにおいてはファイルとして抽象化されています。
/proc導入以前は、あるプロセスが別のプロセスに対して何か操作を行ったり、ほかのプロセスから情報を受け取ったりするには、シグナルなどの非同期通知を使ったり、アプリケーション同士が合意のうえで通信を(パイプなりファイルなりを介して)行う必要がありました。すなわち、「プロセス」という存在に対して、抽象化された共通のアクセス方法はなかったのです(注)。例えば、デバッガやpsコマンドなどの実装は、システム依存のシステムコールやバイナリイメージを直接読み出すなど、アドホックな手法で実装されていました。
注:データに対するアクセスが「ファイル」として高度に抽象化されているのとは対照的です。 |
そこで、プロセスというものに対する抽象化されたアクセス手法として、プロセスをファイルで抽象化した/procファイルシステムが考案されたのです。
■Linuxと商用UNIXの/proc
/procの基本的な考え方は、
/proc/プロセスID/ |
の配下に仮想的なファイルを用意し、この仮想的なファイルへの読み書きがプロセスの状態に対するアクセスになるというものです。
ご存じのとおり、Linuxにも/proc/プロセスID/*というファイル群があり、いろいろな情報をユーザーに対して提供してくれます。Linuxの/procの場合は、それ以外にも「システムのチューニングパラメータへのアクセスを提供する」という意味合いも追加されています。
商用UNIXでは、システムのチューニングパラメータ(例えば最大プロセス数や最大オープンファイル数など)は、カーネルに静的に組み込まれている場合も多く、チューニングを行うにはパラメータ定義ファイルをカーネルに組み込んだうえで再起動する必要があります。
/procの設定方法
通常、/procを使用するのに必要な機能はカーネルに組み込まれています(注)。また、/procはファイルシステムなので、ほかのファイルシステム同様、マウントしなければ使えません。ただ、/procのマウントはシステムの起動時にrc.sysinitなどで実施されるので、通常はシステムにログインした時点で使用可能になっていると考えて構わないでしょう。
注:コンフィグレーション・オプションですが、オフにされることはまずないといっていいでしょう。 |
■/procの読み書き
/procに対する値の「設定」「読み出し」はとても簡単で、catやechoなどのコマンドを使用して、通常のファイルと同じように読み書きできます。もちろん、システム全体にかかわるので、ほとんどの場合はroot権限が必要です。
# cat /proc/xxx |
値が表示される |
# echo value
> /proc/xxx |
値が設定される |
/procはファイルシステムなので、その中に含まれる「ファイル」にはオーナーとパーミッションが付与されます。
-r--r--r-- 1 root root 0 9月 29 23:18 /proc/version |
/proc/versionは読み出し専用、/proc/sys/kernel/sysrqは読み書き可能ということになります。パーミッションやオーナーはプログラム上でハードコーディングされているため、chmodなどでこれらを変更することはできません。
■sysctlによる設定
/procのうち、/proc/sys配下のパラメータについてはsysctl(8)インターフェイスからもアクセスできます。sysctlは、システムのチューニングパラメータを操作するためのインターフェイスです(注)。
注:「/procの一部をsysctl(8)でアクセスできる」というより、Linuxの場合は「sysctl(8)が/procインターフェイスで実現されている」という方が正確でしょう。 |
# sysctl -w var=value |
varというパラメータへvalueという値の書き込み |
# sysctl -a |
全パラメータの読み出しと表示 |
などでアクセスが可能で、
# sysctl -w kernel.sysrq=1 |
/proc/sys以下のパス名は「/」の代わりに「.」で区切って指定する |
と
# echo 1 > /proc/sys/kernel/sysrq |
は同じ操作をしていることになります。また、システムの起動時には/etc/sysctl.confという設定ファイルに従って、自動的にパラメータを設定するサービスが一般的です。自分でチューニングを行った結果は/etc/sysctl.confファイルに書き込んでおくのがよいでしょう(編注)。
# Kernel sysctl configuration file for Red Hat Linux |
/etc/sysctl.confの例(Red Hat Linux 7.3のデフォルト) |
編注:/etc/sysctl.confに書き込んでおかなかった場合、マシンを再起動した時点で/proc/sys以下の設定はデフォルト状態に戻ってしまう。 |
1/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」コマンドです。
|
|