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年以上にわたり、システムの開発、コンサルティング活動、大学での教育指導を続けている。