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、分析原因
因为处理的数据量较大,程序通常执行时间几乎20h+,执行完成后未正常退出,原因暂未知。
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 |
尝试kill掉其父进程,
也失败。我们发现该进程的PPID是1,即init进程,该进程我们是无法kill掉的。
[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]
如果一个defunct进程的PPID为1,则该defunct进程的父进程为init进程。init进程是系统中所有进程的起源。通常情况下,init进程通过将defunct进程的PPID设为1来收回该进程。
为何无法kill掉某些进程
查找资料分析其原因如下:
kill -9发送SIGKILL信号将其终止,但是以下两种情况不起作用:
a、该进程处于"Zombie"状态(使用ps命令返回defunct的进程)。此时进程已经释放所有资源,但还未得到其父进程的确认。"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、 该进程处于"kernel
mode"(核心态)且在等待不可获得的资源。处于核心态的进程忽略所有信号处理,因此对于这些一直处于核心态的进程只能通过重启系统实现。进程在AIX中会处于两种状态,即用户态和核心态。只有处于用户态的进程才可以用“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重新进入容器,都会有异常报错。至此没办法,我们只能重启服务器了。
果然,一键reboot,gpu显卡恢复如初。