定義:
オーバーコミットには主にメモリ,CPU,GPUの3種類があり,それぞれリソースの割り当て方法や影響が異なる.
OSや仮想化環境が,物理メモリ[RAM]よりも多くのメモリをアプリケーションに割り当てること.OSはスワップ[仮想メモリ]を用いて,一時的に不要なデータをディスクに退避することによって,実際の物理メモリ以上のメモリを割り当てられる.
オーバーコミットにより,物理メモリを効率的に利用できる.また,クラウドにおける仮想マシンなどメモリ要求が変動する環境で有効である.
一方で,実際にメモリ不足になるとスワップが発生し,性能が大幅に低下する.また,極端なオーバーコミットはOOM[Out of Memory]エラーを引き起こし,プロセスが強制終了される原因となる.
OSは,例えば,Linuxの場合,仮想メモリを利用し,ページファイル[スワップ]にデータを退避することでオーバーコミットを実現する.
仮想マシン[VM]の場合,複数のVMが物理RAM以上のメモリを割り当てる[KVM,VMware等].VMwareではメモリバルーニング[Memory Ballooning]により,KVM/QEMUではバルーニングやスワップ技術により実現される.
仮想環境やコンテナにおいて,物理コア数以上の仮想CPU[vCPU]を割り当てること.
CPUの処理はIO待ちやスリープ状態になることが多く,その間に他のタスクを実行できるため,オーバーコミットしても問題になりにくい.仮想マシン[VM]においては,物理CPUを仮想CPUとして分割し,複数のVMに割り当てることによって実現する.
KubernetesやDockerでは,CPUリソースの共有・スケジューリングを行うことによってオーバーコミットを可能としている.
CPUのオーバーコミットにより,CPU使用率が低いアプリならば,オーバーコミットによりリソースを有効活用できる.また,クラウド環境においては,柔軟にスケール可能.
一方で,負荷が高まると,コンテキストスイッチが頻発してしまい処理遅延が発生する.また,高いCPU使用率のワークロードにおいては,スロットリング[CPU制限]が掛かる.
KVM/QEMU の vCPU 割り当て,VMware の CPU シェアリング,Kubernetes の CPUリソース管理[requests/limits]により実現される.
1つの物理GPUを,複数のプロセスや仮想マシンに割り当てること.なお,GPUは並列処理を前提とし,固定リソース[演算ユニット・VRAM]を消費するため,柔軟なスケジューリングが難しい.また,CPUはシングルスレッドでも動作するが,GPUは多数の並列スレッドを同時に実行する設計となっている.このため,単純なスケジューリングによる切り替えではリソースの競合を解決できない.さらに,CPUのスケジューリングはコア単位,メモリのスワップはページ単位で処理できる一方で,GPUのリソース[CUDAコア,VRAM,メモリ帯域]は固定的で分割が難しい.そのため,CPUやメモリは完全に仮想化[Hypervisor上で分割]できるものの,GPUの仮想化[vGPU]は物理リソースを直接分割する方式が一般的であり,柔軟性に欠ける.
なお,vGPUにおいても処理対象のデータを一時的に配置する領域として用いられるVRAMは,各GPUが一定の容量を占有する.このとき,各vGPUに割り当てられるVRAMは均一となる.
Mathematics is the language with which God has written the universe.