sysctlによるカーネルのチューニング

 Linuxカーネルは柔軟性が高く、sysctlコマンドを利用すれば、カーネルパラメータを動的に変更してその場で動作を変えることさえ可能だ。sysctlのインタフェースでは、LinuxまたはBSDの何百というカーネルパラメータを参照したり変更したりできる。変更はただちに反映されるが、リブート後まで変更を保留する手段もある。うまくsysctlを使えば、カーネルを再コンパイル翻訳記事)しなくてもマシンの最適化が可能であり、しかもその効果をすぐに確認できる。

 とりあえずsysctlでどんな変更ができるのかを知るには、「sysctl -a」を実行して扱えるパラメータをすべて表示するといい。そのリストは非常に長いもので、私のマシンでは712もの設定可能な項目が表示される。

$ sysctl -a
kernel.panic = 0
kernel.core_uses_pid = 0
kernel.core_pattern = core
kernel.tainted = 129

...(以下略)...

 ある変数の値だけを確認したければ、「sysctl vm.swappiness」のようにすればよい。また、「sysctl vm」とすれば「vm」で始まるすべての変数が表示される。「-n」オプションを追加すると、変数の名前は表示されずに値だけが出力される。反対に、「-N」オプションでは、変数の値は出さずに名前だけが出力される。

 変数の値を変更するには、「-w」オプションを用いた「sysctl -w <変数>=<値> 」という構文を使う。たとえば、「sysctl -w net.ipv6.conf.all.forwarding=1」とすれば、指定した変数が「true」になり(0は「no」または「false」を、1は「yes」または「true」を意味する)、IPv6転送が有効になる。なお、仕様改訂のためか「-w」オプションは必要ない場合もある。あとは各自で実際に変更を試してもらいたい。

 詳細については、「man sysctl」を実行して、標準のドキュメントを参照してほしい。

systlと「/proc」ディレクトリ
 「/proc/sys」(翻訳記事)という仮想ディレクトリにも、sysctlパラメータの参照と変更が可能なインタフェースがある。たとえば、「/proc/sys/vm/swappiness」ファイルは、「sysctl.conf」ファイルの「vm.swappiness」パラメータと同じものを指す。つまり、先頭の「/proc/sys/」を外してドット(.)をスラッシュ(/)で置き換えれば、対応するsysctlパラメータになるわけだ (ちなみに、実はドットによるスラッシュの置き換えは不要で、スラッシュの使用も認められているが、一般的にはドット表記が用いられる)。そのため、「echo 10 >/proc/sys/vm/swappiness」は、「sysctl -w vm.swappiness=10」を実行するのと同じことになる。ただし、当然のことながら、該当する「/proc/sys」ファイルが読み取り専用になっている場合、そのパラメータはsysctlコマンドを使っても変更できない。

 sysctlパラメータの値は、ブート時に「/etc/sysctl.conf」ファイルから読み込まれる。このファイルには、空白行やコメント(“#”またはセミコロンで始まる行)が含まれていてもよいが、それ以外は「<変数>=<値>」形式の行でなければならない。参考までに、私の「sysctl.conf」ファイルは次のようになっている。この設定は、いつでも「sysctl -p」コマンドによって適用できる。

# Disable response to broadcasts.
net.ipv4.icmp_echo_ignore_broadcasts = 1

# enable route verification on all interfaces
net.ipv4.conf.all.rp_filter = 1

# enable ipV6 forwarding
net.ipv6.conf.all.forwarding = 1

# increase the number of possible inotify(7) watches
fs.inotify.max_user_watches = 65536

効果的な利用法

 これほど多くのチューニング可能なパラメータをどのように扱えばいいのだろうか。実は、そこがsysctlの泣きどころだ。Linuxカーネルに関する重要事項のほとんどは、多数のソースファイルに記されており、容易には参照できない。また、そうした記述は一般のユーザには理解しがたい場合もある。「/usr/src/linux/Documentation/sysctl」ディレクトリを探せば何か見つかるかもしれないが、そこにある(すべてではないが)大部分のファイルはカーネル2.2について記されたもので、もう何年も更新されていないようだ。

 また、このテーマを取り上げた書籍をあたっても、十分な情報が得られるとはいえない。『Linux Server Hacks, Volume 2』(2005年O’Reilly刊)のHack #71にsysctlの解説があるが、やはり物足りない。ほかの何冊かの書籍にもsysctlが出てくるが、具体的なパラメータやヒントについては自分で調べるしかない。

 試しに、仮想メモリの管理をチューニングできるswappinessパラメータの情報を探してみよう。「/usr/src/Linux/Documentation/sysctl/vm.txt」ファイルには、このパラメータの名前さえなかった。おそらく、カーネルのバージョン2.6あたりで追加されたものだからだろう。「/usr/src/linux」ディレクトリ全体に対して検索をかけたところ、「swappiness」という記述を含むファイルが5つ見つかった。うち3つは「include/linux」ディレクトリ内のヘッダファイルをインクルードするものだった。残りは「kernel/sysctl.c」と「mm/vmscan.c」で、後者には次のような情報が含まれていた。

 * From 0 .. 100.  Higher means more swappy.
 */
int vm_swappiness = 60;

 これだ!これこそ探し求めていた情報だ。デフォルト値(60)とパラメータの意味に関する最低限の説明が記されている。これでどうにかvm_swappinessが使えそうだ。

 私としては、「sysctl -a」を使って利用可能なパラメータを把握したうえで、Googleで追加情報を探すことをお勧めしたい。たとえば、共有メモリの割り当てを変更して動画再生の問題を解決する例やvm.swappinessの説明、あるいはIPv4ネットワークのトラフィック最適化のヒントが見つかるはずだ。

 sysctlには、Linuxシステムの柔軟性の高さを示すもう1つの側面がある。ドキュメントは十分に揃ってはいないが、その機能を自分で調べることはマシンのパフォーマンスのさらなる向上につながる。これこそ、最もレベルの高いシステム管理といえよう(いや、システム的にはむしろ低レベルと呼ぶべきか)。

Federico Kerekiはウルグアイ在住のシステムエンジニア。20年以上にわたり、システムの開発、コンサルティング活動、大学での教育指導を続けている。

Linux.com 原文(2008年9月9日)