.NET をIBM Powerで動かしてみた話 #1

IBM Power (Linux on Power)で.NETを動かせるようになりました。これでまたひとつ、Power CPUの性能を活かせる場面が増えましたね。IBM Power上でRDBMSなどを動かしている方にとっては、対象のRDBMSへアクセスしにくるx86環境上の.NETアプリケーションを、RDBMSが稼働する同一のPowerノード上に動かせる(集約できる)ようになりました。これにより、データ転送のパフォーマンス・ロスがなくなり、システム全体の性能向上も期待できます。

そして以下の記事を確認すると、.NET 7 on IBM Power では .NET 7のRuntime やSDK がRed Hat Enterprise Linux のAppStream レポジトリに含まれるパッケージとして提供されるようです。またサポートされているのは、RHEL8.7 とRHEL9.1 とのこと。

[IBM社のブログ : .NET 7 now includes support for Linux on Power!](https://community.ibm.com/community/user/powerdeveloper/blogs/janani-janakiraman/2022/11/07/net7-support-linux-on-power)

>This week, Microsoft announced the availability of .NET 7 and for the first time, .NET includes support for Linux on Power (ppc64le)! This milestone was a collaboration between IBM and Red Hat, Microsoft, and the .NET open source community. .NET 7 is targeted for the Red Hat Enterprise Linux (RHEL) distribution.

>#### Where can you get .NET 7 for Linux on Power?
>As an open source project, all changes are included upstream here: https://github.com/dotnet. We welcome contributions from the developer community to continue extending support for Linux on Power in .NET.
>
>Fully supported RPM packages and container images built from those sources for ppc64le are provided by Red Hat. Learn more here: https://developers.redhat.com/articles/2022/10/26/net-7-now-available-rhel-and-openshift
>
>For use on RHEL 8.7 and RHEL 9.1:
>
>　　　・ .NET 7 is supported on both RHEL and Red Hat OpenShift Container Platform.
>
>　　　・　.NET 7 is available as the RPM, dotnet-sdk-7.0. in the AppStream repositories for RHEL 8.7 and RHEL 9.1 The AppStream repositories are enabled by default on RHEL 8 systems.  
>
>　　　・You can use the ubi8/dotnet-70-runtime image to run a pre-compiled application inside a Linux container. A no-cost Red Hat Enterprise Linux Developer Subscription is available that includes a full suite of tools for container development.
>
>　　　・　.NET 7 images are added to OpenShift by importing imagestream definitions from s2i-dotnetcore.
See the RHEL .NET 7 Documentation “Getting Started with .NET 7” , “.NET 7 RPM Release Notes” and “.NET 7 Container Release Notes” for more information.

さて、ここからが本記事の本題です。
上記のブログ情報を見て、Linux on Powerを使用されたことがある方は、以下のようなことを思うのではないでしょうか。

<b>1. 「本当に.NET 7は問題なく動くのか」
2. 「x86環境で作成された.NET アプリケーションはppc64le環境でもそのまま動くのか」
3. 「コンテナ環境でも利用できるのか」</b>

この記事では3回に渡って、実際に.NET 7 をIBM Power 環境で試し、その動作を確認してみたいと思います。

それでは、まず初めの「本当に.NET 7は問題なく動くのか」を見ていきたいと思います。

# 1. 「本当に.NET 7は問題なく動くのか」

今回は、以下の環境で検証を行ってみたいと思います。簡単に評価環境を作成できるよう、無償で利用可能なOSとしてAlmaLinuxを選択してみました。
これまでRHELの評価環境として利用されることが多かったCentOSですが、CentOS Streamとして生まれ変わったこともあり、私自身もAlmaLinuxを使用してみたかったため、こちらを選びました。

|項目|バージョン|備考|
|:----:|:----:|:----:|
|OS|AlmaLinux 8.7|ダウンロード : [AlmaLinux 8.7 ISO](https://mirrors.almalinux.org/isos.html)
|.NET|7.0.101|-|


### (1) 作業環境の確認

今回導入したAlmaLinux環境は以下となります。
RHEL8.7 相当となるAlmaLinux 8.7 をインストールしています。

```bash
[root@dotnet-sample-alma87 ~]# uname -a
Linux dotnet-sample-alma87 4.18.0-425.3.1.el8.ppc64le #1 SMP Tue Nov 8 14:07:43 EST 2022 ppc64le ppc64le ppc64le GNU/Linux
[root@dotnet-sample-alma87 ~]# cat /etc/redhat-release 
AlmaLinux release 8.7 (Stone Smilodon)
```

本記事とは関係ありませんが、AlmaLinuxは以下のURLより各CPUアーキテクチャのISOイメージをダウンロードすることができます。今回はPower CPUに対応している"ppc64le"版の中から、"8.7" を選択して、ISOイメージを取得しました。

https://mirrors.almalinux.org/isos.html

実際に導入してみた感想としては、通常のRHELやこれまでのCentOSと何も変わらない方法でインストールできました。インストール時の画面も、私が触った限りではほとんど同じ(全く同じ？)でしたので、Linux環境をインストールしたことがある方であれば、何も問題なく環境を作成いただけるかと思います。

### (2) .NET 7 のインストール

まず.NET関連のパッケージを確認してみます。

```bash
[root@dotnet-sample-alma87 ~]# dnf search dotnet
AlmaLinux 8 - BaseOS                                                                                                                               176 kB/s | 2.4 MB     00:14    
AlmaLinux 8 - AppStream                                                                                                                            198 kB/s | 8.6 MB     00:44    
AlmaLinux 8 - Extras                                                                                                                               7.4 kB/s |  18 kB     00:02    
============================================================================== 名前 完全一致: dotnet ==============================================================================
dotnet.ppc64le : .NET CLI tools and runtime
================================================================================ 名前 一致: dotnet ================================================================================
dotnet-apphost-pack-7.0.ppc64le : Targeting Pack for Microsoft.NETCore.App 7.0
dotnet-host.ppc64le : .NET command line launcher
dotnet-hostfxr-7.0.ppc64le : .NET command line host resolver
dotnet-runtime-7.0.ppc64le : NET 7.0 runtime
dotnet-sdk-7.0.ppc64le : .NET 7.0 Software Development Kit
dotnet-targeting-pack-7.0.ppc64le : Targeting Pack for Microsoft.NETCore.App 7.0
dotnet-templates-7.0.ppc64le : .NET 7.0 templates

[root@dotnet-sample-alma87 ~]# dnf search aspnetcore
メタデータの期限切れの最終確認: 0:01:02 時間前の 2022年12月20日 01時55分17秒 に実施しました。
========================================================================== 名前 & 概要 一致: aspnetcore ===========================================================================
aspnetcore-targeting-pack-7.0.ppc64le : Targeting Pack for Microsoft.AspNetCore.App 7.0
============================================================================== 名前 一致: aspnetcore ==============================================================================
aspnetcore-runtime-7.0.ppc64le : ASP.NET Core 7.0 runtime

```
"dotnet-sdk-7.0.ppc64le" の導入で関連パッケージがインストールされるとのことなので、まずはこのパッケージを導入してみます。

```bash
[root@dotnet-sample-alma87 ~]# dnf install -y dotnet-sdk-7.0.ppc64le
メタデータの期限切れの最終確認: 0:02:42 時間前の 2022年12月20日 01時55分17秒 に実施しました。
依存関係が解決しました。
===================================================================================================================================================================================
 パッケージ                                               アーキテクチャー                  バージョン                                   リポジトリー                        サイズ
===================================================================================================================================================================================
インストール:
 dotnet-sdk-7.0                                           ppc64le                           7.0.101-1.el8_7                              appstream                            53 M
依存関係のインストール:
 aspnetcore-runtime-7.0                                   ppc64le                           7.0.1-1.el8_7                                appstream                           2.8 M
 aspnetcore-targeting-pack-7.0                            ppc64le                           7.0.1-1.el8_7                                appstream                           1.6 M
 dotnet-apphost-pack-7.0                                  ppc64le                           7.0.1-1.el8_7                                appstream                            99 k
 dotnet-host                                              ppc64le                           7.0.1-1.el8_7                                appstream                           192 k
 dotnet-hostfxr-7.0                                       ppc64le                           7.0.1-1.el8_7                                appstream                           174 k
 dotnet-runtime-7.0                                       ppc64le                           7.0.1-1.el8_7                                appstream                           7.8 M
 dotnet-targeting-pack-7.0                                ppc64le                           7.0.1-1.el8_7                                appstream                           2.9 M
 dotnet-templates-7.0                                     ppc64le                           7.0.101-1.el8_7                              appstream                           3.4 M
 libicu                                                   ppc64le                           60.3-2.el8_1                                 baseos                              8.9 M
 netstandard-targeting-pack-2.1                           ppc64le                           7.0.101-1.el8_7                              appstream                           1.5 M

トランザクションの概要
===================================================================================================================================================================================
インストール  11 パッケージ

<以降、省略>
```

完了後、インストールされた.NET 7 の環境情報を確認

```bash
[root@dotnet-sample-alma87 ~]# dotnet --info
.NET SDK:
 Version:   7.0.101
 Commit:    5afc08ace5

ランタイム環境:
 OS Name:     almalinux
 OS Version:  8.7
 OS Platform: Linux
 RID:         rhel.8-ppc64le
 Base Path:   /usr/lib64/dotnet/sdk/7.0.101/

Host:
  Version:      7.0.1
  Architecture: ppc64le
  Commit:       97203d38ba

.NET SDKs installed:
  7.0.101 [/usr/lib64/dotnet/sdk]

.NET runtimes installed:
  Microsoft.AspNetCore.App 7.0.1 [/usr/lib64/dotnet/shared/Microsoft.AspNetCore.App]
  Microsoft.NETCore.App 7.0.1 [/usr/lib64/dotnet/shared/Microsoft.NETCore.App]

Other architectures found:
  None

Environment variables:
  Not set

global.json file:
  Not found

Learn more:
  https://aka.ms/dotnet/info

Download .NET:
  https://aka.ms/dotnet/download
```

### (3) サンプルコードの稼働

今回は、以下のGitHubレポジトリに公開しているサンプルコードを使用して稼働確認をしてみたいと思います。
こちらのレポジトリは、様々なところに公開されている.NET のサンプルコードをこのQiitaの記事用に集めたものとなります。

https://github.com/nakaji1106/dotnet-demo.git

まずは評価環境上で、gitコマンドを使用できるように必要パッケージをインストールします。

```bash
[root@dotnet-sample-alma87 ~]# dnf install -y git
```

次に、対象のサンプルコードを上記のGitHubレポジトリよりダウンロードします。

```bash
[root@dotnet-sample-alma87 ~]# git clone https://github.com/nakaji1106/dotnet-demo.git
Cloning into 'dotnet-demo'...
remote: Enumerating objects: 135, done.
remote: Counting objects: 100% (135/135), done.
remote: Compressing objects: 100% (106/106), done.
remote: Total 135 (delta 23), reused 115 (delta 16), pack-reused 0
Receiving objects: 100% (135/135), 436.89 KiB | 728.00 KiB/s, done.
Resolving deltas: 100% (23/23), done.
```

このGitHubレポジトリには、"BlazorServerSignalRApp" と"dotnetapp" の2つがあります。
今回は、dotnetappの動作を確認します。

```bash
[root@dotnet-sample-alma87 ~]# cd dotnet-demo/
[root@dotnet-sample-alma87 dotnet-demo]# ll
合計 8
drwxr-xr-x. 10 root root 4096 12月 20 02:14 BlazorServerSignalRApp
-rw-r--r--.  1 root root  563 12月 20 02:14 README.md
drwxr-xr-x.  2 root root   30 12月 20 02:14 dotnetapp
```

dotnetapp では、稼働環境のシステム情報を取得し、出力するアプリケーションが実装されています。
正常に稼働すれば、CPU情報やメモリの情報などが確認できるはずです。

```bash
[root@dotnet-sample-alma87 dotnet-demo]# cd dotnetapp/
[root@dotnet-sample-alma87 dotnetapp]# ls
Program.cs  dotnetapp.csproj
```
早速、dotnetappディレクトリにて、.NETアプリケーションのRestore作業ならびにRun(起動)をしてみます。
ちなみにこのアプリケーションは、x86用に作成されたものをそのまま使用しています。

```Bash:Restore 作業
[root@dotnet-sample-alma87 dotnetapp]# dotnet restore
  Determining projects to restore...
  Restored /root/dotnet-demo/dotnetapp/dotnetapp.csproj (in 220 ms).
[root@dotnet-sample-alma87 dotnetapp]# ls
Program.cs  dotnetapp.csproj  obj
```

```Bash:Run 作業
[root@dotnet-sample-alma87 dotnetapp]# dotnet run
         42                                                    
         42              ,d                             ,d     
         42              42                             42     
 ,adPPYb,42  ,adPPYba, MM42MMM 8b,dPPYba,   ,adPPYba, MM42MMM  
a8"    `Y42 a8"     "8a  42    42P'   `"8a a8P_____42   42     
8b       42 8b       d8  42    42       42 8PP!!!!!!!   42     
"8a,   ,d42 "8a,   ,a8"  42,   42       42 "8b,   ,aa   42,    
 `"8bbdP"Y8  `"YbbdP"'   "Y428 42       42  `"Ybbd8"'   "Y428  
.NET 7.0.1
AlmaLinux 8.7 (Stone Smilodon)

UserName: root
OSArchitecture: Ppc64le
ProcessorCount: 4
TotalAvailableMemoryBytes: 5905842176 (5.000 GiB)
```

無事にサンプルコードが動きました！

# まとめ

今回のブログでは、まず.NET 7がLinux on power (IBM Power)環境で問題なく稼働することを確認しました。サンプルコードも特にCPUアーキテクチャについて意識することなく、ソースコードの変更は"ゼロ"でそのまま動かすことが出来ました。
また、AlmaLinuxのようにRHEL互換の無償 LinuxOSでも問題なく動作することも分かりました。機会があればRockey LinuxやCentOS Stream環境でも評価してみたいなとも思います。

個人的には、まだまだ.NETアプリケーションの実装部分については理解が足りていないので、次の投稿予定の"2. 「x86環境で作成された.NET アプリケーションはppc64le環境でもそのまま動くのか」" では、アプリケーションの互換性があるのかという点とともに、サンプルコードを自分なりに変更しながら、.NETの理解も進められたらと思います。

<b>「.NET をIBM Powerで動かしてみた話 #2 」</b>はこちらから↓

https://qiita.com/Nakaji1106/items/7ac09e9579a8b3f271f3

それでは、今回は以上となります。本記事が何かの参考となれば幸いです。