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日）

