LXDコンテナのリソース制限ガイド:メモリ・CPU・ディスク・ネットワークの上限設定方法
前回の記事では、LXDとは何か、そしてその導入・使い始めの方法について解説しました。まだLXDに馴染みのない方は、そちらもあわせてご覧ください。
実際の運用では、大きなシステムを小さなコンポーネントへ分割するために、同じホスト上で複数のコンテナを実行するケースがほとんどです。その際、各コンポーネントが使用できるリソース量に上限を設けておくのが賢明です。その理由は、コンテナの活用シーンが無数にあるように、制限が必要となる理由もまた無数に存在するからです。
LXDコンテナにリソース制限をかけるメリット
- 顧客ごとのサービス提供: 1台の大型サーバーで、各顧客のウェブサイトを個別のLXDインスタンス(コンテナ)としてホスティングするケースを考えてみましょう。あるサイトにアクセスが急集中すると、他のインスタンスの動作が遅くなる恐れがあります。しかし制限を設けておけば、影響を受けるのはその1つのコンテナだけで済み、残りのコンテナは通常どおり稼働します。
- 柔軟なサービスプランの提供: 同様のシナリオで、異なる料金プランを簡単に販売できます。ある顧客にはXのリソース量を、別の顧客にはYのリソース量を割り当てるといった具合です。これらは簡単なコマンド数発でいつでも調整可能です。
- DoS攻撃への対策: 単純なサービス拒否(DoS)攻撃からシステムを守れます。あるコンテナが攻撃を受けると、そのコンテナはリソース上限に達して停止しますが、他のコンテナには影響が及びません。
- 処理の優先度制御: 2つのコンテナがそれぞれ利用可能なCPU時間の100%を使う状況で、片方を優先的に早く完了させたい場合に有効です。例えば、明日納品が必要なプロジェクトの動画レンダリングなどが挙げられます。一方に90%、もう一方に10%のCPU時間を割り当てることができます。
もちろん、独自の理由で制限が必要になることもあるでしょう。システム全体で1つのコンテナしか使わないのであれば、この設定は不要かもしれません。しかし、複数のコンテナを運用するなら、何らかの制限を設けることがほぼ必須といえます。あるLXDインスタンス上での攻撃、バグ、その他の異常動作がシステム全体に波及し、パフォーマンス低下を招く可能性があるためです。コンテナの数が増えるほど、こうした事態の発生リスクも高まります。
LXDコンテナへのリソース制限の設定方法
ディスク操作に関するリソース制御には、ZFSのインストールが必要です。以前のチュートリアルに従っていれば、すでにインストール済みのはずです。未導入の場合は、その手順に従ってZFSユーティリティをインストールしてから、以下のコマンドを再実行してください。ストレージバックエンドの選択を求められたら「ZFS」を選びます。
sudo lxd init
メモリ使用量の制限
以下のコマンド中の「container_name」は、実際のコンテナ名に置き換えてください。メモリ制限の設定は、次のコマンドを入力するだけです。
lxc config set container_name limits.memory 100MB
ギガバイト単位で指定したい場合は、「MB」の代わりに「GB」と入力します。
CPU使用量の制限
コンテナが使用できるCPUコア数を制限するには、次のように入力します。
lxc config set container_name limits.cpu 2
特定のCPUコアに「ピン留め」する場合は、次のコマンドを使用します。
lxc config set container_name limits.cpu 0-0
この例では、コンテナは最初のCPUコアのみを使用します。2番目のコアなら「1-1」、1番目から3番目までのすべてのコアなら「0-3」を指定します。
もう1つの制限タイプとして、コンテナが使用できるCPU時間の割合があります。
lxc config set container_name limits.cpu.allowance 10ms/100ms
この例では、100ミリ秒ごとに10ミリ秒のCPU時間のみ使用を許可する設定となり、実質的に1コアの約10%の性能となります。
ディスク使用量の制限
ディスク関連のリソースを制限するには、まずコンテナにルートディスクデバイスを追加する必要があります。デフォルトのLXDプロファイルから継承されたデバイスはすでに存在しますが、コンテナごとに個別の設定変更を行うには、この手順が必須です。
lxc config device add container_name root disk pool=default path=/
ストレージプールに別の名前を付けている場合は、「default」を実際のプール名に置き換えてください。プール名を忘れた場合は、次のコマンドで確認できます。
lxc storage list
LXDインスタンスが使用できるディスク容量を制限するには、次のコマンドを実行します。
lxc config device set container_name root size 7GB
なお、現時点ではI/O制限(読み書きの転送速度やIOPS)は正しく機能しないことに注意してください。
ネットワーク使用量の制限
ディスクと同様に、まず設定可能な仮想イーサネットデバイスを追加する必要があります。LXDインスタンスを外部ネットワークに接続しているブリッジの名前を確認しましょう。
lxc network list
ブリッジ名が異なる場合は、「lxdbr0」を適宜置き換えてください。「lxd init」の設定時にネットワークタイプとして「bridged」(デフォルトの選択肢)以外を選んだ場合は、以下のコマンドを選択内容に合わせて調整する必要があります。例えば、「nictype」の値も、実際に使用したLXDネットワークの種類に合わせて変更してください。
lxc config device add container_name eth0 nic name=eth0 nictype=bridged parent=lxdbr0
最後に、ネットワークの受信(ダウンロード)および/または送信(アップロード)に帯域制限を設定します。
lxc config device set container_name eth0 limits.ingress 1Mbit
ここで注意したいのは、1Mbitは1メガビット(メガバイトではない)という点です。1バイトは8ビットであるため、この設定ではダウンロード速度が毎秒約0.125Mビット、つまり約120キロバイトに制限されます。1MB/s(メガバイト毎秒)でダウンロードさせたい場合は、8倍の8Mbitを受信制限値として設定してください。
送信(アップロード)を制限する場合は、次のコマンドを使用します。
lxc config device set container_name eth0 limits.egress 1Mbit
まとめ
本記事では、リソース制限に関連する最もよく使われるプロパティを紹介しました。ただし、lxc config device setやlxc config setで設定できる項目は他にも多数存在します。これらの調整可能なコンテナプロパティの詳細については、LXDの公式GitHubページを参照してください。
-
Firefox「マルチアカウントコンテナ」の使い方を徹底解説!インストールから管理まで
Firefoxが提供する拡張機能「Multi-Account Containers(マルチアカウントコンテナ)」は、デジタルフットプリント(ネット上に残る行動履歴)を減らすために開発されたアドオンです。「コンテナ」と呼ばれる機能を活用することで、複数のプロファイルごとにブラウジング活動を分離でき、ブラウザのCookie管理にも役立ちます。 このガイドでは、マルチアカウントコンテナの基本的な使い方から応用的な管理方法までを詳しく解説し、その機能を最大限に引き出す方法をご紹介します。 Firefoxマルチアカウントコンテナでできること まず何よりも、この拡張機能はブラウジング活動を分離します。仕事
-
OpenVPNでプライベートAWSリソースへ安全にアクセスする方法【実践ガイド】
本記事は、Pluralsightの新コース「Connecting On-prem Resources to your AWS Infrastructure」の一部を基に再構成したものです。Amazon Web Services(AWS)上で稼働しているリソースに接続したい場面はありませんか?公開EC2インスタンスへのSSHアクセスやS3データの暗号化だけなら、実用上十分に安全と言えます。しかし、バックエンドのRDSデータベースインスタンスへの接続や、一般公開していないAWS上のデータを扱う場合はどうでしょう?管理者がこうしたリソースを外部から遮断する理由はさまざまですが、必要なときにアクセスで