Windowsマシンでの仮想Linux環境の比較

# 要旨
従来はVirtualBoxやVMware Workstation Playerが主流でしたが、WSL2+WSLgの環境から高度なグラフィックを除くLinuxを快適に使用でるようになりました。
また、Intelの12世代以降のCPUは、Pコア（高性能コア）とEコア（高効率コア）と複雑な構成となりました。
以上のように、ハードウェア、ソフトウェア（サードパーティの仮想化ソフトから見て）の両面で混沌とした状態になっています。
(a) 生Pythonによる行列の転置、(b) Scilabのスクリプトによる行列乗算（avx2利用と思われる）、(c) FrontISTRのMUMPS解法線形弾性解析を行った結果、WSL2とHyper-Vが良好との結果が得られたました。
なお、仮想環境ではUbuntuよりもDebianの方が若干高速でした（メモリ使用量はDebianの方が若干多い）。topコマンドの表示から考えると、アクティブなプロセスを減らせば改善されると思われます。
また、デスクトップ環境（GNOME、XFCE4、LXDE、MATE、LXQt）の影響はあまりなかったです。

:::note info
インフォメーション
VirtualBoxは、ovaファイル（VirtualBox）、vdiファイル（VirtualBoxの仮想ドライブ形式）、vmdkファイル（VMwareの仮想ドライブ形式）をHyper-Vから利用できるように変換するのに使用できます。
:::

:::note info
インフォメーション２
Windowsの仮想化、それを利用したセキュリティ設定をオフにすると、VirtualBoxやVMwareにおいても同等の計算速度となりました。
これらの機能はオンにするのは簡単ですが、オフにするのは執拗な操作が必要ですので、切り替えは手間がかかりすぎます。
用途・好みにより、マイクロソフトかサードパーティかを選択することが良いと思います。
:::
- VirtualBoxは開発が活発で、[virtualbox.org: End user forums for VirtualBox](https://forums.virtualbox.org/index.php)などでまとまった情報が入手できるので、第一候補です。
- 個人向けのVMwareは最近の印象がよくありません：買収される前から開発が停滞していた（SSDやP-core・E-core対応...）と感じていました。無償になりましたが、ダウンロード先を見つけにくく、ユーザー登録が必須ですので使用をためらいます。
## Windowsの仮想化の無効化方法
#### PowerShellからの操作
```powershell
# コマンドオプションの表示
wsl --help

# すべてのディストリビューションと WSL 2 の軽量ユーティリティ仮想マシンを終了
wsl --shutdown

# 全てのwslディストリビューションの登録を解除し、ルート ファイルシステムを削除
wsl --unregister <Distro>

#  Linux 用 Windows サブシステム パッケージをアンインストール
WSL --uninstall
```
#### コントロールパネル / プログラム / Windowsの機能の有効化または無効化
Hyper-V、 Linux用Windowsサブシステム、Virtual Machine Platform、Windowsサンドボックス、Windowsハイパーバイザープラットフォーム（WindowsのPro版での項目）のチェックを外します。
![Windows仮想化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/6951e72f-aab8-4446-a7a2-3d196f452d39.png)
#### 仮想化ベースのセキュリティ機能の無効化
[「VMware PlayerとDevice/Credential Guardには互換性がありません。」エラーの対応方法](https://zenn.dev/inada/articles/3ae416fe297d17)を参考にして無効化します。
[Device Guard and Credential Guard hardware readiness tool](https://www.microsoft.com/en-us/download/details.aspx?id=53337)を実行し、再起動する方法が確実でした。
# 1. 計算速度の比較
## 使用したパソコン
#### 主マシン（デスクトップパソコン）
Intel Core i7-12700K (P-cores 8, E-cores 4), RAM 128GB, Nvidia GeForce RTX 3060, Windows 11 Pro 24H2
#### サブマシン（ノートパソコン）
Intel Core i7-10750H (6 cores), RAM 64GB, Intel UHD Graphics + Nvidia RTX 2060, Windows 11 Pro 24H2
## 1.1 生Pythonによる行列の転置
以前投稿したPythonコード"Modyfy_Matrix.py"による測定結果です
[Windowsマシン：各種環境でのPython本体の実行速度](https://qiita.com/HD_mount_Music/items/13113d43c00cfb165de3)
### 主マシン（OS、仮想環境、Pythonのフレバー）
- 高速（0.18s～0.23s）
Windows MSYS2、 Windowsの標準（python.org）、Hyper-V-Windows11開発環境の標準
WSL2-Debian 12の標準（GNOMEとLXQtでほとんど差がない）、WSL2-Ubuntu 24.04の標準
Hyper-V Debian 12の標準（リポジトリのLinuxカーネル6.1、自分でビルドした6.14、共に高速）、Hyper-V / Arch Linuxの標準（GNOME、XFCE4、LXDEでほとんど差がない）、Hyper-V / Fedora41の標準

- やや遅い（0.3s前後）
Hyper-V-Windows11開発環境のAnaconda
Hyper-V / Ubuntu 22.04の標準、 VMware Workstation Player / Ubuntu 22.04の標準、Hyper-V / AlmaLinux 9の標準

- 遅い（0.4s前後）
VirtualBox ／ Ubuntu 22.04の標準

#### UbuntuとDebianの動作プロセス比較（主マシン）
topコマンドにより確認すると、Debianのメモリ使用量がUbuntuよりも若干大きいものの、実際に活動しているプロセスが少ないようです。Ubuntuの不要プロセスを切るなどを行えれば改善される可能性があります。

- Hyper-V上のUbuntu 22.04
```bash
top
top - 07:16:08 up 1 min,  0 users,  load average: 0.19, 0.07, 0.02
Tasks: 309 total,   1 running, 308 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.6 us,  0.3 sy,  0.0 ni, 99.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  62882.0 total,  60802.8 free,   1199.7 used,    879.6 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  61048.4 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
   1829 masahiro  20   0 5488760 377576 152260 S   2.7   0.6   0:02.34 gnome-s+ 
   1105 xrdp      20   0   51436  32100  10496 S   1.7   0.0   0:01.10 xrdp     
   1573 masahiro  20   0  340116 121288  77256 S   1.3   0.2   0:00.54 Xorg     
   2366 masahiro  20   0  969776  59764  45396 S   0.7   0.1   0:00.27 gnome-t+ 
   1272 gdm       20   0 5361972 209440 124112 S   0.3   0.3   0:00.76 gnome-s+ 
   1981 masahiro  20   0  390284  11500   6784 S   0.3   0.0   0:00.05 ibus-da+ 
   2405 masahiro  20   0   14260   4096   3200 R   0.3   0.0   0:00.08 top      
      1 root      20   0  166860  11640   8056 S   0.0   0.0   0:00.33 systemd  
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd 
      3 root      20   0       0      0      0 S   0.0   0.0   0:00.00 pool_wo+
…
```
- Hyper-V上のDebian 12
```bash
top
Tasks: 283 total,   1 running, 282 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.0 sy,  0.0 ni, 99.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st 
MiB Mem :  62885.2 total,  60750.1 free,   2073.9 used,    692.2 buff/cache     
MiB Swap:    976.0 total,    976.0 free,      0.0 used.  60811.3 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND  
   1575 masahiro  20   0 5362196 318624 149216 S   0.7   0.5   0:17.83 gnome-s+ 
    722 xrdp      20   0   55956  41628  10568 S   0.3   0.1   0:03.22 xrdp     
      1 root      20   0  168072  12564   9180 S   0.0   0.0   0:00.27 systemd  
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd 
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp   
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par+ 
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 slub_fl+ 
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns    
      7 root      20   0       0      0      0 I   0.0   0.0   0:00.00 kworker+ 
      8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker+ 
      9 root      20   0       0      0      0 I   0.0   0.0   0:00.06 kworker+
...
```
### サブマシン
Windowsの標準（python.org）、WSL2-Debian 12、Hyper-V-Debian 12が0.41s～0.53sで大差がなかった。

## 1.2 Scilabのスクリプトによる行列乗算
10年前のScilabコ－ドが残っていました。単純な演算が良いと思いますので行列乗算としました。
```scilab:bench_matmul.sce
// Copyright (C) 2010 - DIGITEO - Michael Baudin
//
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt

// Benchmarking the matrix-matrix product

// References
// "Programming in Scilab", Michael Baudin, 2010, http://forge.scilab.org/index.php/p/docprogscilab/downloads/

/////////////////////////////////////////////////////////////////
//
// A basic benchmark
if ( %f ) then
rand( "normal" );
n = 1000;
A = rand(n,n);
B = rand(n,n);
tic();
C = A * B;
t = toc();
mflops = 2*n^3/t/1.e6;
disp([n t mflops])
end

/////////////////////////////////////////////////////////////////
//
// A subtle benchmark
scf();

stacksize("max");
rand( "normal" );
lines(0);

s = stacksize();
MB = round(s(1)*8/10^6);
nmax = sqrt(s(1));
mprintf("Memory: %d (MB)\n",MB);
mprintf("Maximum n: %d\n",nmax);

timemin = 0.1;
timemax = 8.0;
nfact = 1.2;

//
// Make a loop over n
xtitle("Matrix-Matrix multiply","Matrix Order (n)","Megaflops");
n = 1;
k = 1;
perftable = [];
while ( %t )
  A = rand(n,n);
  B = rand(n,n);
  tic();
  ierr = execstr("C = A * B","errcatch");
  t = toc();
  if ( ierr <> 0 ) then
    laerr = lasterror();
    disp("Error:");
    disp(laerr);
    break
  end
  if ( t > timemin ) then
    mflops = 2*n^3/t/1.e6;
    perftable(k,:) = [n t mflops];
    plot(n,mflops,"bo-")
    mprintf("Run #%d: n=%6d, T=%.3f (s), Mflops=%6d\n",k,perftable(k,1),perftable(k,2),perftable(k,3))
    k = k+1;
  end
  if ( t > timemax ) then
    break
  end
  n = ceil(nfact * n);
end
// Search for best performance
[M,k] = max(perftable(:,3));
mprintf("Best performance:")
mprintf(" N=%d, T=%.3f (s), MFLOPS=%d\n",perftable(k,1),perftable(k,2),perftable(k,3));
```
### 主マシン
- 高速（480MFLOPS）
Windows（MKL, MSVCを使用していて、Windows版は高速チューニングされているようです）
- 中速（200～270MFLOPS）
Hyper-V Windows 11開発環境、WSL2-Debian 12、Hyper-V-Ubuntu 22.04、Hyper-V-Debian 12
- 低速（126MFLOPS）
VirtualBox-Ubuntu 22.04 

### サブマシン
- 高速（292MFLOPS）
Windows
- 中速（118～125MFLOPS）
WSL2-Debian、Hyper-V-Debian 12

## 1.3 線形弾性解析
### 概要
2022年に構造解析ソフト”FrontISTR Ver. 5.3”の計算時間をWindows版の公式バイナリとWSL2でIntel oneAPIのMKLとMPIを組み込んでコンパイルし、計算時間を比較しました。結果は下表の通りです。


```bash
fistr1 -t 4 # 4はスレッド数
```

![FrontISTR-Tutrial01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/903118b6-83f2-42fe-9c86-4c9d6cbf0483.png)

```bash
hecmw_part1 # tutorialに４分割をすることが指定されている。メッシュの分割を実施するコマンド。
mpirun -np 4 fistr1 -t 1 #MPI 4並列, 1 OpenMPスレッドで実行
mpiexec -np 4 fistr1 -t 1 # Windows用
```

![FrontISTR-Tutrial02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/b55cc99b-b742-4222-b4c1-0833fa0f5d5a.png)


今回の比較においては、反復法のCG法は環境を変えても変化が小さいので、直接法のMUMPS解法での計算時間を評価しました。また、計算が短時間で終了すればよいとの視点から４並列での計算時間のみ比較しました。
今回の比較にあたり、Linux版についてはFrontISTR最新版（Ver.5.7:2025年4月リリース）をソースコードからビルドしました。


解析モデルは、tutorial ２-線形静解析 (弾性、並列)です。
[線形静解析 (弾性、並列)](https://manual.frontistr.com/ja/tutorial/tutorial_02.html)

データはFrontISTRのGithubにあります。
[FrontISTR/tutorial/02_elastic_hinge_parallel/](https://github.com/FrontISTR/FrontISTR/tree/master/tutorial/02_elastic_hinge_parallel)

新たにやり直した結果、Linux環境の影響を把握することができました。
- WSL2とHyper-Vは、Windows用公式版の同程度の速度で計算できました
- VirtualBoxはOpenBLASにおいてCPUを正常に認識せず、64bit CPUの最低基準＋αでの動作となりマシンの性能が発揮できないと考えられます


### 主マシン
- 高速（3.41s～3.53s）
Windows用公式MSMPI版（MS-MPI、OpenBLAS）、WSL2とHyper-VのDebian 12（oneAPIのMPIとMKL）、Hyper-Vの22.04（oneAPIのMPIとMKL）、Hyper-Vの22.04（OpenBLAS：avx2有効のHASWELLとしてライブラリが作成された、OpenMPI）
- 低速（5.59s～6.65s）
Windows 公式IMKL版（Intel-MPI、MKL）、VirtualBOXのUbuntu 22.04、Debian12（OpenBLAS：avx無効のNEHALEMのライブラリが作成された、OpenMPI)

### サブマシン
- 高速（4.40s～4.78s）
Windows用公式MSMPI版（MS-MPI、OpenBLAS）、WSL2とHyper-VのDebian 12（oneAPIのMPIとMKL）
- 低速（7.43s）
Windows 公式IMKL版（Intel-MPI、MKL）


# 2. Hyper-Vの導入方法
Hyper-VはWSL2と比べて情報（特にUbuntu以外のディストリビューション）が少ないです。
Debianでの導入方法を整理しました。
### Hyper-Vの設定、通常の方法によるLinuxのインストール
- UbuntuをDebianに読み替えてインスト－ルします
[Hyper-VでUbuntu24.04LTSをインストール・セットアップする](https://zenn.dev/junkor/articles/cb486c14a2db18)
- ネットワークからのインストールにすれば、最新版となります
- ソフトウェアは、GNOME or XFCE4 or MATEと標準システムユーティリティ
（KDEは試していませんが、デスクトップ環境で大差なかったです。軽量デスクトップという方は、XFCE4、MATE、...などお好きなものを）

## リポジトリの追加
- 主リポジトリにcontrib non-freeの追加
```bash
sudo nano /etc/apt/sources.list

# main non-free-firmware に　contrib non-free を追加
```
- Backportsとfasttrackリポジトリの追加
[VirtualBox / debian WIKI](https://wiki.debian.org/VirtualBox)
```bash
# Install lsb-release :
sudo apt install lsb-release

# Add Backports to sources.list:
echo "deb http://deb.debian.org/debian $(lsb_release -cs)-backports main contrib non-free" |
sudo tee /etc/apt/sources.list.d/backports.list

# Import fasttrack archive keyring:
sudo apt install fasttrack-archive-keyring

# Adding fasttrack repositories:
echo "deb http://fasttrack.debian.net/debian-fasttrack/ $(lsb_release -cs)-fasttrack main contrib" |
sudo tee /etc/apt/sources.list.d/fasttrack.list
echo "deb http://fasttrack.debian.net/debian-fasttrack/ $(lsb_release -cs)-backports-staging main contrib" |
sudo tee -a /etc/apt/sources.list.d/fasttrack.list

# Update the list of packages:
sudo apt update

# Install packages for Compile and Build
sudo apt install build-essential git dkms curl
```

## 拡張セッション(xrdp, xorgxrdp)のための設定
### Debian側での設定
```
sudo apt install xrdp xorgxrdp

sudo nano /etc/xrdp/xrdp.ini
```
port=3389 を　コメントアウトして、　port=vsock://-1:3389　とする
![スクリーンショット 2025-04-08 193436.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/5b61efde-7d76-47e3-b419-b27bae5db9bf.png)


[linux-vm-tools/ubuntu/24.04/install.sh](https://github.com/Hinara/linux-vm-tools/blob/master/ubuntu/24.04/install.sh)
のスクリプトを参考とし、
security_layer=negotiateを　security_layer=rdp　に
crypt_level=high　を　crypt_level=none　に
bitmap_compression=true　を　bitmap_compression=false　に
変更します。

Ubuntuと同様にインストールした時点で起動していましたが、
systemctlコマンドでxrdpサービスが有効化されていることを確認します：

```bash
sudo systemctl status xrdp

# 有効化
sudo systemctl enable xrdp

# 再起動
sudo systemctl restart xrdp

# xrdpの動作を確認後、Debianをシャトダウンします
sudo poweroff # キーボードの位置関係からpoweroffが速くタイプできます
```

### Windows側での対応
PowerShellを管理者権限で起動し、以下のコマンドを実行:
```powershell
# Set-VM -VMName <作成した仮想マシン名> -EnhancedSessionTransportType HvSocket
Set-VM -VMName "Debian12-LXQt" -EnhancedSessionTransportType HvSocket
# メッセージが表示されなければOKです
```
再度接続すると、画面の解像度やドライブ共有設定などの画面がでてきます。
![拡張セッション成功-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/14971286-51e8-4ff4-9ce1-8efa288374e7.png)


xrdpの画面からログインし、高解像度で動作し、ドライブの共有ができれば、設定を保存します。
![拡張セッション成功-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/50b1eb96-ff23-4ceb-8cda-d46f84633095.png)
![拡張セッション成功-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4014034/a340d601-0baf-49cc-a184-f52d428544f8.png)