静かに活躍の場を広げているFreeBSD。そのFreeBSDに昔から搭載されているのに知られることなくお蔵入りしている機能や、新しく開発された機能を取り上げ、紹介していきます。最初のテーマは、ホスティングサービスなどでニーズの高いリソース制御機能です。(編集部)
日本の企業では、エンタープライズ目的のLinuxとしてCentOSを採用することが多い。同じような用途ではFreeBSDも人気がある。どちらもできることは似ており、適材適所で使い分けされているようだ。インターネットサーバOSとして人気の高いFreeBSDだが、最近では高性能アプライアンスや組み込みデバイスで採用されるシーンが広がっており、静かに活躍の場を広げている。
しかし、その活用の広さの割には、FreeBSDがもともと提供している「あの機能」を知らないで使っているという方も多い。特に日本語での情報が少ない機能の中には、知られることなくお蔵入りしているものがある。これはもったないことだ。
FreeBSDは新規開発も積極的で、特にここ数年はエンタープライズでの利用に要求される機能が活発に開発され、最新版に統合されている。本連載では、昔から搭載されていながらあまり知られていない機能や、新しく開発された機能を取り上げ、紹介していこうと思う。
静かに浸透するFreeBSD、これを活用する際の参考資料として使っていただければ幸いだ。
FreeBSDに要求される機能として、特にホスティングサービス業者から要望が高い機能がリソース制御機能だ。
FreeBSDをホスティングOSとして採用しているベンダは、たいてい、独自のリソース管理機能をFreeBSDに独自に実装して使っている。特にJailと便利に併用できるリソース制御機能を望む声が多い。
FreeBSDは、4.2BSDで導入されたsetrlimit(2)システムコールを持っているため、プロセス単位でリソース制限を実施することができる。CPU時間、メモリ使用量、プロセス数、ファイルディスクリプタ、共有メモリなどに対して上限値を設けることができる。この機能を活用すれば、求めるリソース制御は実現できる。ディスク容量の制限であれば、同じく4.2BSDに導入されたディスククォータの機能を利用すればよい。
setrlimit(2)でリソース制限はできるが、運用時の柔軟性という面では若干面倒なところがある。setrlimit(2)は、そのシステムコールを実行したプロセスがリソース制限の対象となり、この値は子プロセスへ引き継がれる。通常はログイン時に設定されるようになっており、適用の対象はログインクラスで選ぶ仕組みになっている。ただ、この方法には次のような面倒な点がある。
つまり、機能自体はあるが、柔軟に利用しようとすると難がある。これが従来のリソース制御機能だ。
FreeBSDはこうした問題に対して、新しいリソース制御機能としてRACCT/RCTLの実装を追加した。10-CURRENTや9-STABLEではすでに利用できる。
RACCTはカーネル内部でリソース使用量を把握するためのフレームワークで、RCTLはRACCTを使用してリソース制限を実施するためのフレームワークだ。実際にはrctl(8)コマンドでリソース制限を実施する。
rctl(8)で設定できるリソースはsetrlimit(2)とあまり変わらないが、設定できる対象と自由度が異なる。また、制限値を超えた場合の挙動も自由に設定できる。setrlimit(2)を汎用的に利用できるレベルまで扱いやすくしたものがRACCT/RCTL rctl(8)であると考えてもらってよいだろう。
rctl(8)では設定対象を、ログインクラスのみならず、ユーザー、プロセス、Jailに対して指定できる。制限を超えた場合の動作も、拒否のみならずログの取得、シグナル送付、devd(8)への通知といった選択肢から選択できる。devd(8)に通知した場合にはdevd(8)経由で任意の動作をさせることが可能だ。
RACCT/RCTL rctl(8)はホスティング事業者向けの機能と思われるかもしれないが、安定したサーバ運用を支援する機能としても活用できるし、学生/新入社員向けのUNIX学習環境における安全策としても利用できる。とても便利な機能だ。
RACCT/RCTLの機能は、執筆現在のカーネルではデフォルトになっていない。次のカーネルオプションを追加してカーネルを再構築すると利用できるようになる(10-CURRENT、9-STABLE)。
options RACCT options RCTL
rctl(8)コマンドの使い方は簡単で、-aでルールを追加し、-rでルールを削除、-uで対象とする主体が現在利用しているリソース量を表示する、というものだ。-aで追加したルールは、フィルタという形でまとめて指定できる。
rctlコマンドオプション | 内容 | |
-a ルール | ルールをRCTLデータベースへ追加 | |
-r フィルタ | 一致するフィルタをRCTLデータベースから削除 | |
-u フィルタ | フィルタに一致するサブジェクトが消費しているリソース量を表示 | |
-h | バイト、キロバイト、メガバイト、ギガバイト、テラバイト、ペタバイトなど読みやすい単位で出力 | |
表1 rctlコマンドオプション 内容 |
指定するルールは次のような形をとっている。perは指定しなくてもよく、「○○の中の□□に対して」といった指定が必要な場合に利用することになる。
subject:subject-id:resource:action=amount/per
ルール | 内容 | |
subject | ルールを適用する主体。プロセス、ユーザー、ログインクラス、Jailを指定可能で、それぞれprocess、user、loginclass、jailで指定する | |
subject-id | subjectを特定するIDを指定。ユーザー名、ユーザー番号、ログインクラス名、Jail名を指定する | |
resource | 制限をかけたいリソースを指定 | |
action | subjectが指定した制限を超えた場合にどのアクションを起こすかを指定。要求の拒否、警告をコンソールへ出力、devd(8)へ通知、指定したプロセスへシグナルの送付を指定可能。それぞれdeny、log、devctl、sigで指定する(ただしcpuとwallclockに対してdenyを適用しても効果はない) | |
amount | 制限値を指定する | |
per | 制限を適用する範囲を指定。process、user、loginclass、jailで指定する | |
表2 rctl(8)コマンドで指定できるルール |
指定できるリソースは次のとおりだ。setrlimit(2)で指定できるリソースとかぶっている。
リソース | 内容 | |
cputime | CPU時間の最大値。秒数で指定 | |
datasize | データサイズの最大値。バイト数で指定 | |
stacksize | スタックサイズの最大値。バイト数で指定 | |
coredumpsize | コアダンプサイズの最大値。バイト数で指定 | |
memoryuse | 物理メモリ使用量の最大値。バイト数で指定 | |
memorylocked | ロックされているメモリ使用量の最大値。バイト数で指定 | |
maxproc | プロセスの最大数 | |
openfiles | ファイルディスクリプタテーブルサイズの最大値 | |
vmemoryuse | アドレス空間のメモリ使用量の最大値。バイト数で指定 | |
pseudoterminals | PTY(擬似ターミナル)の最大数 | |
swapuse | スワップ使用量の最大値。バイト数で指定 | |
nthr | スレッドの最大数 | |
msgqqueued | SysVメッセージキュー最大保持数 | |
msgqsize | SysVメッセージキュー最大値。バイト数で指定 | |
nmsgq | SysVメッセージキュー最大数 | |
nsem | SysVセマフォ最大数 | |
nsemop | semop(2)システムコール1回におけるSysVセマフォの最大変更数 | |
nshm | SysV共有メモリセグメントの最大数 | |
shmsize | SysV共有メモリサイズの最大値。バイト数で指定 | |
wallclock | 経過時間の最大値。秒数で指定 | |
表3 rctl(8)コマンドで指定できるリソース |
rctl(8)はいつ実行してもよい。ただし設定はシステムを再起動するとクリアされるため、システムが再起動しても適用させたい場合には/etc/rctl.confファイルに設定を追加し、/etc/rc.confにrctl_enable="YES"を追加しておく。
連載:FreeBSDのコレ知ってる?
第1回 自由な設定が可能な最新リソース制御機能
Page 1
実は知らなかったFreeBSDの「あの機能」
プロセス単位でリソースを制限、setrlimit(2)
柔軟な設定が可能なRACCT/RCTL rctl(8)
RACCT/RCTL rctl(8)の基本的な使い方
Page 2
RACCT/RCTL rctl(8)で無邪気な学生からシステムを守る
ルールをまとめておく/etc/rctl.confファイル
Jailに対してリソース制限を実施
cron(8)の代替としてシステムモニタリング
Copyright © ITmedia, Inc. All Rights Reserved.