1. 問題の説明
最近、Docker コンテナ内のアルゴリズムによってデータのバッチがクリーンアップされると、データ処理が完了した後、プロセスが正常に終了せず、GPU メモリが正常に解放されないことが判明しました。
[root@ai66 ~]# nvidia-smi
Sun Sep 26 09:10:45 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.38 Driver Version: 455.38 CUDA Version: 11.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GTX 108... Off | 00000000:04:00.0 Off | N/A |
| 0% 56C P2 101W / 250W | 10066MiB / 11178MiB | 12% Default |
| | | N/A |
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 2209 C python3 967MiB |
| 0 N/A N/A 7747 C - 905MiB |
| 0 N/A N/A 9055 C - 889MiB |
| 0 N/A N/A 11877 C python3 967MiB |
| 0 N/A N/A 18297 C - 1530MiB |
| 0 N/A N/A 24028 C - 1013MiB |
| 0 N/A N/A 24601 C - 1530MiB |
| 0 N/A N/A 25329 C - 967MiB |
| 0 N/A N/A 26568 C - 333MiB |
| 0 N/A N/A 37182 C - 961MiB |
2. 理由を分析する
処理するデータ量が多いため、プログラムの実行には通常20時間以上かかり、実行完了後も正常に終了しません。原因は不明です。
3. 解決プロセス
kill によるプロセスの強制終了に失敗しました
kill -9 PID によってプロセスを強制的に強制終了しようとします。これは無効であり、プロセスはまだ存在します。
[root@ai66 ~]# kill -9 7747
[root@ai66 ~]# nvidia-smi
Sun Sep 26 09:53:18 2021
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.38 Driver Version: 455.38 CUDA Version: 11.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 GeForce GTX 108... Off | 00000000:04:00.0 Off | N/A |
| 0% 56C P2 92W / 250W | 10066MiB / 11178MiB | 0% Default |
| | | N/A |
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 2209 C python3 967MiB |
| 0 N/A N/A 7747 C - 905MiB |
| 0 N/A N/A 9055 C - 889MiB |
| 0 N/A N/A 11877 C python3 967MiB |
| 0 N/A N/A 18297 C - 1530MiB |
| 0 N/A N/A 24028 C - 1013MiB |
| 0 N/A N/A 24601 C - 1530MiB |
| 0 N/A N/A 25329 C - 967MiB |
| 0 N/A N/A 26568 C - 333MiB |
| 0 N/A N/A 37182 C - 961MiB |
親プロセスを強制終了してみます。
も失敗します。このプロセスの PPID は 1、つまり init プロセスであり、強制終了できないことがわかりました。
[root@ai66 ~]# ps -ef |grep 7747
root 4020 10169 0 09:56 pts/0 00:00:00 grep --color=auto 7747
root 7747 1 25 Sep25 ? 04:41:57 [python3.8]
消滅プロセスの PPID が 1 の場合、消滅プロセスの親プロセスは init プロセスです。init プロセスは、システム内のすべてのプロセスの起点です。通常、init プロセスは PPID を 1 に設定することで、機能しなくなったプロセスを再利用します。
一部のプロセスを強制終了できない理由
データを見つけて、次のように理由を分析します。
kill -9 は SIGKILL シグナルを送信してプロセスを終了させますが、次の 2 つの状況では機能しません:
a. プロセスが「ゾンビ」状態にある (無効なプロセスを戻すには ps コマンドを使用します)。この時点で、プロセスはすべてのリソースを解放しましたが、親プロセスによって確認されていません。「Zombie」プロセスは次回再起動するまで消えませんが、その存在はシステムのパフォーマンスには影響しません。
[root@ai66 ~]# ps -ef |grep 9055
root 9055 38368 94 Sep24 ? 1-20:27:40 [python3] <defunct>
root 18500 10169 0 09:25 pts/0 00:00:00 grep --color=auto 9055
b. プロセスは「カーネル
モード」(コア状態) にあり、使用できないリソースを待機しています。コア状態のプロセスはすべての信号処理を無視するため、コア状態にあったプロセスはシステムを再起動することによってのみ実現できます。AIX では、プロセスはユーザー状態とコア状態という 2 つの状態になります。「kill」コマンドで終了できるのはユーザーモードのプロセスのみです。
[root@ai66 ~]# ps -ef |grep 7747
root 7747 1 26 Sep25 ? 04:41:57 [python3.8]
root 16993 10169 0 09:25 pts/0 00:00:00 grep --color=auto 7747
問題が解決しました
このとき、docker stopでコンテナを終了したり、docker execでコンテナに再入したりすると例外が報告されます。この時点では、サーバーを再起動するしかありません。
案の定、ワンキー再起動で、GPU グラフィックス カードは元の状態に復元されました。