/procによるLinuxチューニング [後編]
〜 /proc/sysの主要パラメータ群総解説 〜

遠田 耕平
2002/12/17

/proc/sys/fsディレクトリ

 /proc/sys/fsには、ファイルシステム関連のチューニングパラメータが集められています。

file-max
 システム中のオープンファイル管理データの最大数を指定できます。

file-nr
 file-nr内のパラメータはそれぞれ、オープンされているファイル数、空きファイル管理データの数、システム中のオープンファイル管理データの最大数(file-maxと同じ)を示します。

 ファイルのクローズ時には、使っていたファイル管理データを即座に解放するのではなく、いったん(次の機会に使えるように)取り置きます。この取り置かれている管理データの数が、2番目の数値となります。

inode-state、inode-nr
 inode-stateには全部で7組の数値が含まれますが、意味があるのは最初の2つだけで、残りは0になっています。2つの値は、それぞれシステム中のメモリiノードの数および使用されていないメモリiノードの数を表します。

 inode-nrは、名前こそ違うものの内部的にはinode-state(の最初の2つ)とまったく同じ情報を出力します。/procには、このように同じ情報を出力するだけだったり、変更しても何の影響もない無意味なファイルが存在します。よくあるのは、「以前は意味があったがカーネル全体の構造の変更、見直しに伴って意味がなくなった」というパターンです。この辺りにもLinuxがダイナミックに改良、改善されているのを介間見ることができます。

dquot-nr
 システム中のクオータ管理構造体およびフリーなクオータ管理構造体の数を表示します。

 iノードおよびクオータ管理構造体については上限を制約することはできません。勝手にカーネルが割り当て、メモリが足りなくなってきたタイミングで不要なものを解放します。

dentry-state
 dentry(名前とiノードの対応付けを行う構造体)のシステム中の数およびフリーなdentryの数を表示します。

 ファイル管理構造体やiノード、dentryは数が増え過ぎると逆にメモリを使い過ぎてオーバヘッドが増加します。これらの値は、チューニングに当たって観察が必要なパラメータだといえます。

/proc/sys/vmディレクトリ

 /proc/sys/vmには、仮想記憶(バーチャルメモリ)関連のチューニングパラメータが集められています。

bdflush
 ブロックI/O用のバッファ制御に関連するパラメータです。
  • 第1パラメータ:バッファとして使用できるメモリ(おおよそ全メモリと思って構わない)のうち、この値を超えたページがダーティになるとバッファのディスクへの書き出しを始める
  • 第5パラメータ:kupdatedデーモンの起動間隔。kupdatedデーモンは、古くなったバッファやiノード、スーパーブロックなどを定期的にフラッシュするデーモン
  • 第6パラメータ:バッファは「古い」ものを選択的にディスクに書き出すようになっているが、どの程度の時間がたつと「古い」とするかを指定する。単位はjiffies(一般には1/100秒)
  • 第7パラメータ:バッファとして使用できるメモリのうち、この値を超えたページがダーティになると、bdflush(バッファの書き出しデーモン)を起動する

 「ダーティ」(汚れている)とは、メモリ上のデータが更新されていて、ディスク上のイメージとの間に違いが生じていることを指します。逆に「クリーン」は、メモリとディスク上のイメージが一致している状態をいいます。

 ダーティなページはいずれディスクに書き出さなければなりませんが、クリーンなページは(ディスクから読み込めばよいので)そのまま捨てて(解放して)しまっても構いません。

max-readahead、min-readahead
 ディスクの先読みの最大ページ数、最小ページ数を指定します。

page-cluster
 ページイン、ページアウトの単位をページ数で指定します(この値の2のべき乗ページが単位)。あまり大きいと無駄なI/Oが発生しますし、小さ過ぎるとI/Oの回数が増えてオーバヘッドとなります。

kswapd
 現在では使用されていないパラメータです。

overcommit_memory
 仮想メモリの割り当て時に、物理メモリ/スワップ領域の裏付けのない空間を割り当てます。物理メモリ/スワップの合計を超えた量を(表面上は)利用することができますが、その代わりメモリが足りなくなる危険性が増えます。

pagetable_cache
 ページテーブルキャッシュの上下限を指定します。ページテーブルキャッシュとは、使い終わったページテーブルを一時的に保管(キャッシング)しておき、高速に再利用する仕組みです。プロセスの生成/終了が頻繁に起きる環境であれば、増やしてみる価値があります。当然ながら、あまり多く保管しておくとメモリの無駄になります。

max_map_count
 仮想空間にマッピングできる最大ページ数を指定します。ここでいうマッピングには、mmap(2)システムコールによるファイルマッピングはもちろん、プログラムテキストのロードやmallocなども含まれるので、あまり小さくするのは考えものです。

/proc/sys/net/ディレクトリ

 /proc/sys/net配下には、ネットワーク関連のチューニングパラメータが格納されています。/proc/sys/net/core配下にはネットワーキング一般(ソケット関連)、/proc/sys/net/ipv4にはipv4関連のチューニングパラメータがあります。

 いずれもネットワーク操作に関する大量のチューニングパラメータが含まれていますが、その中の代表的なものを示します。

/proc/sys/net/core

rmem_default、rmem_max、wmem_default、wmem_max
 これらは、いわゆるソケットバッファ(ソケットに送信された/到着したデータを格納しておくバッファ)のデフォルト値/最大値を規定します。

 デフォルト値を大きくすることで性能を稼ぐことができますが、その分メモリを消費します。setsockopt(7)のSO_SNDBUF/SO_RCVBUFオプションを利用して、ソケット個別に指定する方がよいかもしれません。なお、SO_SNDBUFオプションで設定できる値は、ここで指定する最大値よりも大きくすることはできません。

 なお、これらの値は起動時にメモリ実装量をチェックしたうえで、ふさわしいサイズに「調整」されます()。

注:rmem_*、wmem_*に限らず、Linuxのチューニングパラメータはマシン構成に応じて動的に計算される場合があるので、複数のマシンでチューニングを行う際は注意する必要があります。

/proc/sys/net/ipv4

ip_forward
 IPフォワーディングを有効にします。

tcp_window_scaling
 TCPウィンドウスケーリングオプションを有効化します。デフォルトで有効になっていますので、設定し直す必要はありません。

tcp_sack、tcp_fack
 選択的ACKおよび高速再送を有効にします。これもデフォルトで有効になっているので、特に調整する必要はないでしょう。

tcp_max_syn_backlog
 ネットワーク接続(SYN)を受け付けたが、相手からまだACKを受け取っていないような状態のコネクションを、listen中のソケット当たりいくつ保持するかを指定します。大規模なサーバでは、この値を増やすことで性能が改善される可能性があります。

tcp_mem
 TCPネットワーキングに使用可能なメモリの上限を指定します。たくさんのデータが到着してメモリ使用量が増加し、このしきい値を超えるとカーネルはメモリ不足と判断してTCPへのメモリ割り当てを一時中断します。

 すなわち、このパラメータはメモリ上にためてよいデータ量を表すことになります。多数のサーバを動作させたり、あるいは実メモリが非常に多くてデフォルトよりも多いメモリをネットワークに使用できるような場合は、大きめに設定しておくのがよいでしょう。

tcp_rmem、tcp_wmem
 TCPのデータ転送の際の制御パラメータです。第1パラメータはTCPソケットバッファの下限値で、それより多量のメモリを使用している場合はメモリに余裕がないと判断されます。

 第2、第3パラメータはrmem_max、rmem_default、wmem_max、wmem_defaultを上書きします(ソケットバッファの量をTCP向けに設定し直します)。

2/4

Index
/procによるLinuxチューニング [後編]
 〜 /proc/sysの主要パラメータ群総解説 〜
  Page 1
/proc/sys/kernelディレクトリ
  Page 2
/proc/sys/fsディレクトリ
/proc/sys/vmディレクトリ
/proc/sys/netディレクトリ
  Page 3
チューニングの実例
 ファイルI/Oのチューニング
 ネットワークのチューニング
  Page 4
Appendix
 パラメータ/デフォルト値一覧表

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 記事ランキング

本日 月間