OS: CPU能力を使い切る

 仮想化とクラウドコンピューティングの普及により、物理マシンより仮想マシンを扱うことが多くなりました。そこで、仮想化環境上で動作するOSの特徴についても知っておく必要があります。


 マルチコアCPUやマルチCPU構成が当然になったため、CPUの能力を使い切るには、プログラムをマルチスレッド対応させるか、多数同時に動作させる必要がでてきました。しかし、マルチスレッド対応も、同時動作の保証も、プログラム作成の難易度を一気に高めます。また、マルチスレッド対応しても、サーバーの全コアで並列動作させるほどの性能要件がないこともあります。


 そこで、CPUを有効に使い切るための手段として、CPUを自由に仮想マシンVM)に割り当てられる仮想化が普及しました。この数年注目を集めているコンテナーはVMとよく比較されますが、仮想化のレイヤーがハードウエアでないなどVMとは大きく異なります。両者の違いについて説明します。


仮想マシンVM)方式の仮想化

 まずは、仮想化の代表であるVM仮想マシン)方式の仮想化と特徴です。VMはハードウエアを模擬した環境をOSに提供するので、複数の異なるOSを同時に動作させることができます。このうち一つのOSがダウンしても、他のOSの動作には影響がありません。一方、仮想マシンには、仮想化のオーバヘッドがあります。仮想化のオーバヘッドは、ストレージI/OとネットワークI/Oに顕著です。逆に、CPUの命令を実行し続けI/Oをほとんど行わない処理は、オーバヘッドの影響を受けづらいです。したがって、I/Oへの性能要求が高いシステムを仮想マシンで動作させる場合、I/O性能に関して入念な検討が必要です。


 I/Oに仮想化ソフトウエアが介在する以上避けられないのですが、極力減らすための工夫はあります。その代表が準仮想化です。準仮想化は、特別なデバイスドライバをゲストOSに入れ、仮想マシンがハードウエアを模擬することなく、直接I/O対象のデータを送受することで、仮想化のオーバヘッドを大幅に削減します。仮想マシンデバイスドライバの一覧表示や、デバイス情報でドライバを確認してVM対応のドライバがあれば、準仮想化を使用していることが分かります。


 準仮想化ドライバは仮想化基盤により異なり、デバイス名が変わるなどの影響があります。また、準仮想化だと、物理デバイスの動作誤差を利用した乱数生成機能が、誤差データが収集できないため十分に動作しないことがあります。これが原因で、物理サーバー向けの設定のままだと、暗号化や署名作成の処理がいつまでも終了しないことがあります。


仮想化より省リソースのコンテナー

 コンテナーは、今後有望な仮想化技術です。GoogleNetflixといった世界的規模のシステムを支えるだけでなく、CI(継続的インテグレーション)/CD(継続的デリバリー)との相性のよさで注目されるDockerもコンテナーを作成・実行するシステムです。


 コンテナーでは、一つのOSの中を分割して、OSを専有しているように見せます。
f:id:nonbei:20180608171733j:plain
仮想マシンVM)やコンテナーの上でOSが動く


 カーネルは共通なので、コンテナー間で共通なリソースを共有することにより、VMにくらべて省リソースである一方、WindowsLinuxや、Linuxの異なるバージョンのように異なるカーネルを同居させられません。コンテナーのメリットとしてポータビリティーが謳われることがありますが、このポータビリティーは、OSが同一であることが前提です。WindowsのコンテナーをLinuxで動かす、あるいはその逆は、コンテナーがあってもなくても同じで、JVMや.NETのようなカーネルの違いを吸収する仕組みを挟む必要があります。


 省リソースであるコンテナーは、作成・起動も速いという特徴を活かして、大量の試験を実施しなければならないCIパイプラインの高速化に適用事例が多いです。


ソ-ス:CPU能力を使い切る、仮想環境でOSが動く仕組みを図解 - 新人SEのためのOS基礎:日経 xTECH Active