「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。運用virtualingとは、わりとセキュアでCPUやメモリ・IOといったリソースの制御が可能なプロセス実行環境上で、設定や構成を変える事なくミドルウェアのようなプロセスを動作させることができるツールです。実装はmrubyです。hb.matsumoto-r.jpリソース制御なので、例えばプロセスのメモリ使用量の上限を制限していた場合に、その制限を超えると従来通りOoM-Killerが走るわけですが、virtualingの特徴的な機能として、そのイベントを自動で検知し任意のRubyブロックをコールバックする機能があります。それを利用して、今回はOoM-Killer判定が下されたイベントを検知したら、メモリ制限値を自動で拡張していくような処理を試してみました。設定はRubyで書く事ができます。falseにした後、コールバック処理でメモリの制限値を自動拡張するようにします。#{mem}"end設定の詳細はGitHubをみてもらうとして、必要な部分だけを上記に書きました。このrun_with_mem_eventfd_loopメソッドによって、OoM-Killerのeventを検知するループに入り、検知したらブロックの処理を実行して再度eventループに入ります。このブロック内に予め設定していたメモリの上限値、上記例では512KiB、をeventが通知されるタイミングで倍に自動拡張するという処理を実装しました。これを実際に動かしてみましょう。2097152このように、最初の設定値はすぐにOoM-Killerのイベントが発生し、そこでRubyブロックが呼ばれ自動拡張し、さらに倍々と処理をして、最終的に2MiBあたりで落ち着いたようです。イベントが通知されメモリが拡張されるまではブロックされ、拡張と同時にプロセスの処理が再開されるような動きをします。この時に、Virtualing::MEMORY.usage_in_bytesで使用量を取得すると大体1.5MiBあたりの値となっており、メモリの上限値とも合致します。ふむふむ、うまく応用するといい感じの自動リソース制御アルゴリズムがRubyで簡単に実装できそうですね。まとめということで、virutalingのイベント検知機能を利用して、virtualingで実行されているプロセスのメモリ使用量制限を自動拡張してみました。今回はOoMの検知で自動拡張しましたが、例えば、メモリの使用量の任意の値にさしかかったイベントを検知してブロックをコールバックすることも可能です。それらについては前回の記事を御覧ください。hb.matsumoto-r.jpちなみにですが、今日ロリポのテスト環境にて、ロリポのApacheの設定やディレクトリ構成(それなりに複雑)を全く変える事なく、virtualing経由でchrootかつリソース制御が可能な実行環境上でロリポApacheを起動出来たことをお伝えしておきます。ある程度複雑な構成のミドルウェアであっても、virtualingによって、わりとセキュアでリソース制御可能なプロセス実行環境上で手軽にミドルウェアを動かせるだろうと予想できますので、是非お試し下さい。研究会で登壇してきました。はてなブログPro研究者と技術者をやっています。詳しくはリンクの「研究・開発業績ページ」を御覧ください。さくらインターネットに入社して1年が経ちました非厳密計算で確率的に解釈するコンピューティングへの流れラストオーサーとしての国際会議投稿やジャーナル執筆のサポートについてviを:wqや:q!、あるいはZZで終了するのとではどちらが効率的か自分の研究開発に自信を持つためには月別アーカイブリンク研究・開発業績ページ旧ブログ検索はてなブログをはじめよう!matsumoto_rさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。