Dockerコンテナ内のプログラムが異常終了し、GPUが解放されない

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 グラフィックス カードは元の状態に復元されました。

おすすめ

転載: blog.csdn.net/jane_xing/article/details/120481938