Nsight Systems X転送時 MIT-SHMエラー回避

# はじめに
## 結論
Nvidia Nsight Systems を SSHのX転送を経由して GUIで使う場合、特定の操作で MIT-SHM に関するエラーが発生し、以降の操作が効かなくなります。
その際、`XLIB_NO_SHM` 環境変数を 1 に設定して起動することで回避することができます。

## 背景
Nvidia Nsight Systems は、Nvidia社CUDAツールキット付属の、CPU/GPU両用のプロファイリング(性能解析)ツールです。
そのツール本体 `nsys-ui` のLinux版はXアプリケーションとしてGUIで使うものですが、Linuxマシン自体のコンソールではなく、SSHで遠隔アクセスしてX転送経由で使いたい場面というのも多々あります。
その時に発生するエラーに関する回避策の話となります。

## 対象および検証環境
* Nsight Systems: 2021.3.2  
  ※CUDA11.4付属、RPMパッケージとして導入
* OS: CentOS 8.4
* Xサーバ: VcXsrv 1.20.5.1/Win10  
  SSH接続・X転送は RLogin.exe を使用

# 事象
## X転送による起動
RPMパッケージとしてNsight Systemsを導入した場合、自動的に alternatives の設定も行われ、次の実行例のように `nsys-ui` というコマンドで、Nsight Systemsを起動することができます。
※なお、SSH接続時にX転送を有効にし、クライアントのPC側でVcXsrvを予め起動しておきます。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74396/ff3daa02-74a6-c4bc-4a4c-04dac379f49f.png)

## エラー発生操作
起動すると、次のような画面で、プロファイルを採取したアプリケーションのタイムチャートを確認し、GUI操作で性能分析ができるわけですが…。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74396/ba33a623-a013-4522-915f-7216e5523b4d.png)

ここで画面右上にある！マークのアイコンをクリックして情報を見ようとすると、ターミナル側に MIT-SHM に関するエラーが出力され、GUI操作を受け付けなくなります。
※これ以外にも、エラーを発生させる操作が幾つかあるようです。が、詳細は割愛します。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74396/7d88fe54-45ac-bd31-fca1-54f1887746b0.png)

# 分析および回避
## エラーについて
さて、エラーメッセージの内容は、

```text:エラーメッセージ
Xlib:  extension "MIT-SHM" missing on display "～"
```

これは、Xの機能拡張 ( extension ) として `MIT-SHM` というものを Nsight Systems で使おうとしたところ、Xサーバ側で使えなかったことを意味します。
そのため、この機能拡張をあてにしていた Nsight Systems 側で、操作がままならなくなってしまったということになります。

## MIT-SHMとは
では、MIT-SHM とは何か、ということですが、これは Xクライアントとサーバが連携する X の GUIシステムにおいて、**両者が共有メモリ(SHM)を用いて高速にデータのやり取りを行う**ための機能拡張です。
これを使わない場合は、通常通り TCP/IPソケットあるいはUnixドメインソケットを通じた通信でデータをやり取りすることになるのですが、それは共有メモリを介したやり取りよりも遅くなります。

とは言え、共有メモリを使う以上、Xクライアント・サーバとも**同一マシン上で実行している**というのが前提となります。そのため、( VcXsrvがMIT-SHMに対応しているか、という問題をおいておくにしても ) **ネットワークを経由するのが前提のX転送では絶対に使えない**ということになります。

## 環境変数による無効化
であれば、Xクライアントである Nsight Systems の方で、ネットワーク経由の X なのだから、わざわざ MIT-SHM を使わないようにすればよいと思うのですが。
それが可能かどうかはともかくとして、少なくとも自動判断による MIT-SHM の有効化/無効化の切り替えは行っていないようです。

しかし、実は X のクライアントライブラリには、環境変数による無効化のスイッチが存在しているようでした。それが `XLIB_NO_SHM` です。
これを設定することで MIT-SHM のエラーを回避し、GUI操作を続けることができることが今回分かった、ということになります。
※次の図は、！マークアイコンをクリックした後の画面が表示されているところを撮ったものです。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74396/f0618062-1b41-82d1-ac17-85fb2ad0829a.png)

# 余談
## 他の無効化方法はあるか
この Nsight Systems は同梱の Qt ライブラリを用いた Qtアプリケーションであり、Qt の方では似たようなスイッチとして、`QT_X11_NO_MITSHM` や `QT_XCB_NO_MITSHM` という環境変数があることが分かっています。
しかし、今回この環境変数を設定しても、エラー回避にはなりませんでした。なので、Qtからの制御でMIT-SHMを使っているわけではなく、他の無効化方法はないのではないかと思います。

## Nsight Systemsを起動するまでの準備
上述のように、Nsight Systems は Qtアプリケーションであり、必要な Qtライブラリは一式同梱されています。
しかし、RPMパッケージを導入しただけでは、必要となるX関係等のライブラリが全て揃う様にはなっていないようで、今回試したときは訳も分からず起動失敗してしまいました。( デスクトップ用のパッケージ一式を入れてなかったり、CUDA全体でなく Nsight Systems のみ導入して試していたのが悪かったのかもしれませんが )

もし起動に失敗する場合、以下のパッケージが不足していないか確認し、インストールされていなければ dnf コマンドで追加すると良いと思います。

* alsa-lib
* libxkbcommon-x11
* libXtst
* xcb-util
* xcb-util-image
* xcb-util-keysyms
* xcb-util-renderutil
* xcb-util-wm

# 終わりに
記事としては一発ネタに近いのですが、色々検索をかけてみても、今回紹介した環境変数の情報があまりはっきりした形で載っていないようなので、載せることにしました。
同様の症状でお悩みの方の助けになれば幸いです。