【R】Shiny Server構築にあたってVirtualBoxとDockerでオーバーヘッドの比較

2022-04-07

目的

現在は古いPCにUbuntu 18.04 DesktopとR 4.0.3をインストールしてShiny-Serverを動かしていますが、来年で10年経過するPCのためバックアップ運用の体制を整えたいと思っています。その際、実機にOSインストールから環境構築は時間がかかるため、仮想環境かコンテナで復旧を楽にしたいと考えました。

ただ、以前Windows10 + VirtualBoxでShiny-Serverを動かしていた時は非常に動作が遅かったので、仮想化は難しいと考え、オーバーヘッドが少ないと言われているDockerならどうか?と言うことで予備実験をしました。

条件・方法

  • ハードウェア:CHUWI CoreBox
    CPU:Core i5-8259U 4コア8スレッド(Passmark Average:8133, Single Thread Rating:2246)
    メモリ:16GB
  • ベンチマークプログラム:R-benchmark-25.R
  • システム条件
    1.Windows11(RGUI)
    2.Windows11 + VirtualBox(Ubuntu 20.04 Server)
    3.Windows11 + WSL2 & Docker Desktop(Ubuntu 20.04)
  • R Version
    1.R 4.1.3(Windows11) or R 3.6.3(Ubuntu 20.04)
    2.Microsoft R Open(MRO) 4.0.2

以前の比較からハードウェア・システムとも条件が変わっています。とりあえずR-benchmarkの実行時間だけさっくり比較なので、Rのバージョンもこだわらずaptでインストールしました。

方法は、RコンソールからR-benchmark-25.Rの実行時間(Total time for all 15 tests)を比較します。

ついでに、以前Windows10のMROではプロセス数が増えると実行時間が極端に延長したので、改めて検証します。

環境構築

結果

VirtualBoxとDockerの比較

条件システムR version実行時間
1-1Windows11R 4.1.340.93
1-2Windows11MRO 4.0.24.30
2-1Win11 + VirtualBoxR 3.6.340.05
2-2Win11 + VirtualBoxMRO 4.0.27.82
3-1Win11 + DockerR 3.6.337.00
3-2Win11 + DockerMRO 4.0.24.15

プロセス数増加の影響

条件システム ・ R versionProc1Proc2Proc4Proc6
1-2Windows11 ・ MRO 4.0.24.305.1410.1829.49

VirtualBoxを使っても、Windows11と変わらない速度で実行できています。MRO 4.0.2は若干遅くなっていますが、以前の検討のような極端な速度の低下はありません。

また、プロセス数の増加に関しても実行速度の低下はありません。

結論

VirtualBoxでもほとんど速度低下が無かったので、わざわざDockerを使わなくてもいいかと考えています。

Dockerは環境構築が大変だったのとまだ理解が足りないため、VirtualBoxでUbuntu Serverの方が運用の手間はかからないと思っています。

WSL2導入後にVirtualBoxを使うには機能の無効化が必要です

また、Windows環境で同時プロセス数を増やすとMROの実行時間が長くなった理由は、やはりOSの問題だろうと考えています。とは言え、そこまで速度が必要なアプリ(業務)では無いため、安定性重視で通常のRを使うことは変更なしにします。

残る疑問点

VirtualBoxでも速度低下が無かった事

考えられる要因

1.PCの性能向上(CPUの世代?)

2.Windows(10 → 11)、VirtualBox(6.1.xx → 6.1.14)の最適化

3.ゲストOSの変更(Ubuntu 18.04 Desktop → Ubuntu 20.04 Server)

すぐに確認できそうなのは3.ゲストOSの変更です。Shiny-ServerインストールにはGUIで使うライブラリも必要だった(と思う)ため、ゲストOSについては今後確認して追記します。

追記

ゲストOSをUbuntu 20.04 Desktopに変更しても実行時間は41.80と変わらなかったため、ゲストOSは関係ないようです。