Calendarの季節になり,いろいろなカレンダーの案内をみかけるようになりました。2014の16日目の記事として書きました。Calendarに参加させるということが新鮮だったのか,うれしい反応をいただきました。2015の15日目の記事としても書きました。1.1の新機能や変更点を紹介」と書きましたが,今回は予定を変更してLinuxカーネルに新たに導入されたコンテナ関連の機能について書きたいと思います。cgroupこの連載では,cgroupについて第3回から第5回にかけて紹介しています。今回はcgroupの基本的な機能については説明しませんので,必要に応じてそちらをご参照ください。その際に説明したように,cgroupでは,制限するリソースごとに「サブシステム」または「コントローラ」と呼ばれるモジュールにわかれています。カーネルのバージョン2.6の後半からバージョン3の前半にかけて,新しいサブシステムが続々と追加されました。その頃は,筆者は新しいカーネルがリリースされるたびに,cgroupに新しい機能が追加されていないかをチェックして,追加されるたびに試してブログに書いたりしていました。その後,一通り機能が充実したあたりからは,すぐに試してわかりやすい結果が得られるような新機能の追加は少なくなりました。いうこともあり,新しいcgroupの機能を試してブログに書くことは少なくなりました。それだけコンテナ関連の機能が成熟してきたということかもしれませんね。新しい機能のリリースはなくても,コンテナが注目されるにつれ,コンテナ関連の機能をカーネルに取り入れたいという提案はいろいろなされていました。最近そのような中から,久々にカーネルにマージされる機能が出てきました。Controller)です。cgroupによるプロセス数の制限コンテナごとに起動できるプロセスの数を制限したいという要求は,特にマルチテナント環境では昔からあり,OpenVZでも実現されていた機能でした。cgroupでも,以前"fork"という名前で似たような機能を持つサブシステムが提案されていたことがあります。この時はrejectされていました。bomb対策を行ったという発表をしていただきました。筆者は発表を聞きながら,提案されているパッチにさらに改造を加えてカーネルに機能を追加し,サービスを作り上げる技術力の高さに感心したことを覚えています。いずれにせよ,実際にサービスを提供する際には,このような機能が必要な場合があるということを示していると思います。私は,pidsサブシステムがマージされるまでの経緯を追っていないので,どういう議論がなされてサブシステムがマージされるに至ったのかはわかりませんが,待望されていた機能には違いないと思います。pidsサブシステムを有効にしたカーネルの作成それでは早速pidsサブシステムを使ってみましょう。6.0上で作成した4.3.0カーネル上で実行しています。pidsサブシステムを使うには,カーネルの設定でCONFIG_CGROUP_PIDSを有効にする必要があります。menuconfigなどで設定する場所は他のcgroupサブシステムと同じ場所です。subsystem新しく作ったカーネルで起動すると,/proc/cgroupsにpidsという行が現れています。1マウントとグループの作成pidsサブシステムを使う際にマウントを行う方法は,他のサブシステムと同様です。-oオプションでpidsを指定します。以下のように行います。/sys/fs/cgroup/pidsこのマウントした/(ルート)を見てみると以下のようなファイルができています。tasksここにtest01というグループを作成してみましょう。taskspids.maxとpids.currentが,pidsサブシステムが独自に持つファイルのようですね。ファイル名ですぐに役割が分かったのではないでしょうか。グループ内で許可するプロセス数それぞれのファイルが,グループを作成した直後にはどのような内容であるかを見てみましょう。さきほど作成したtest01グループで見てみます。/sys/fs/cgroup/pids/test01/pids.maxmaxグループを作成した直後ですから,グループにプロセスは登録されていませんのでpids.currentは当然0になりますね。制限なしとするにはpids.maxにmaxと書きます。初期値は制限なしでmaxです。制限を追加する制限値を設定する方法は通常のcgroupの使い方と同じです。制限値として2を設定してみましょう。/sys/fs/cgroup/pids/test01/pids.max2ファイルの内容は,設定した通り2になっていますね。現在のシェルをグループに追加してみましょう。/sys/fs/cgroup/pids/test01/pids.current2pids.currentの内容は,追加したシェルと確認用に実行したcatで2になっています。ここでパイプでつないでコマンドを実行してみましょう。unavailableTerminatedシェルを登録してひとつ消費した状態で2つ実行しようとしたので,実行できずにエラーになっています。制限が効いていることがわかりますね。第3回でcgroupの特徴として階層構造が取れることを紹介しました。それでは多層の場合に,pidsサブシステムでどのように制限がかかるのかを確認してみましょう。先ほどのtest01グループの下層にtest02グループを作成します。test01は2を設定しておき,test02は作成したままで特に制限をかけないままにしておきます。maxtest02にプロセスを追加して,test01とtest02のpids.currentを確認してみます。2test01のtasksは空ですので,test01グループにはプロセスは登録されていない状態です。test02のtasksには追加したシェルのPIDとcatのPIDが表示されています。catを実行した瞬間は,test02には2つプロセスが存在する状態ですね。pids.currentを見てみると,test01,test02ともに2となっています。これは,階層構造の子孫のプロセスが上位でカウントされているということです。ここで先ほどと同様にpids.maxを超えるプロセスを生成してみます。unavailableTerminatedプロセスは生成できませんね。階層構造を持つグループの場合,先祖であるグループのどれかひとつの制限にかかると,プロセスが生成できないということです。cgroup著者プロフィール加藤泰文(かとうやすふみ)2009年頃にLinuxカーネルのcgroup機能に興味を持って以来,Linuxのコンテナ関連の最新情報を追っかけたり,コンテナの勉強会を開いたりして勉強しています。英語力のない自分用にLXCのmanページを日本語訳していたところ,あっさり本家にマージされてしまい,それ以来日本語訳のパッチを送り続けています。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。