pytorch任务无法kill,导致pod退出失败

简介: 问题现象pytorch进程通过k8s方式部署,由于该任务无法退出,导致所在的pod也无法退出;再次向pytorch任务发送SIGKILL信号也无法杀死。kenrel版本5.10。任务状态信息pytorch进程状态可以看到pending了一个SIGKILL信号(0x100表示第9为被置1,即SIGKILL信号),man手册中也明确了SIGKILL无法被捕获、阻塞忽略等。另外即使是两个不同的pid n

问题现象

pytorch进程通过k8s方式部署,由于该任务无法退出,导致所在的pod也无法退出;再次向pytorch任务发送SIGKILL信号也无法杀死。kenrel版本5.10。

任务状态信息

pytorch进程状态

可以看到pending了一个SIGKILL信号(0x100表示第9为被置1,即SIGKILL信号),man手册中也明确了SIGKILL无法被捕获、阻塞忽略等。另外即使是两个不同的pid namespace,信号也可以传递。

pytorch进程父子关系

[]中表示不同的pid namespace。

1064331(pytorch) [4.0654435]—>4173735[4.0654435]—>4173734[4026581836]—>1[4026581836]

top进程查看

1064333(pytorch)显示R状态,比较可疑的几点是:没有内存信息(内核线程不会有内存信息),同时cpu打满,但是sys又不是很高,并且pytorch任务proc下的一些资源信息又获取不到,比如cat /proc/1064333/stack信息为空。

1.cpu打满像是pytorch任务陷在了某个循环逻辑;

2.stack信息为空只有当任务在退出过程中才会清理自身资源;

进一步分析

既然无法查查看pytorch栈信息,那么我们可以查看其父进程的状态。

可以看到1064331进程的父进程4173735(管理容器的进程?)在退出流程。

上面栈信息的逻辑:父进程4173735退出,并且在清理pid_namespace下的其他任务,等着其他任务退出。4173735看着是当前pid_namespace的init任务。

用sysak profiling 工具观测到1064331任务的栈信息,确实也是在exit流程中,但陷在了uvm_spin_loop代码中,可以通过函数百分比看出。uvm_spin_loop为某gpu厂商的驱动代码,这块逻辑看着也不是持锁死等,单看sys指标没有问题,像是uvm_spin_loop某个条件为达成然后一直再做重复的事情。

代码分析

struct pid_namespace {
    ...
    // ‘child_reaper’ is the init process of a pid_namespace
      struct task_struct *child_reaper;
    ...
}

forget_original_parent,父进程退出时为其下面的子进程寻找新的父进程,zap_pid_ns_process中涉及pid_namespace退出情况的资源清理。

forget_original_parent
	// 如果退出的不是pid_namespace的init任务,则选择init 进程作为新父新
	// 如果是init 进程退出选择一个线程作为新父亲
	-->find_child_reaper
		-->struct pid_namespace *pid_ns = task_active_pid_ns(father)
        -->find_alive_thread
    	// 走到这里意味着是当前pid_namespace中退出的是init任务,则需要将当前pid_namespace中任务都kill
		-->zap_pid_ns_processes(pid_ns)
            	idr_for_each_entry_continue(&pid_ns->idr, pid, nr) {
					task = pid_task(pid, PIDTYPE_PID);
					if (task && !__fatal_signal_pending(task))
                        // 向所有进程发sigkill信号
						group_send_sig_info(SIGKILL, SEND_SIG_PRIV, task, PIDTYPE_MAX);
				}
            	// wait接收sigkill信号的任务去清理他们的资源,然后自己退出
            	do {
					clear_thread_flag(TIF_SIGPENDING);
					rc = kernel_wait4(-1, NULL, __WALL, NULL);
				} while (rc != -ECHILD);
    // 查看选择的child_reaper是否可以作为真正的新父亲
    -->find_new_reaper

结论

当前问题中pytorch已经处于退出流程中但由于驱动的bug造成在uvm_spin_loop中无法返回进而造成pytorch退出失败,最终就导致整个pod资源无法成功清理,临时规避就重启,该问题还未修复。

https://github.com/NVIDIA/open-gpu-kernel-modules/issues/456

扩展

这里高版本有个内核pid namespace退出杀死子进程失败的情况但不影响上面的问题:

https://lore.kernel.org/all/20220713175305.1327649-1-tycho@tycho.pizza/

该补丁修复的是如果子进程在退出流程中并发生了等待资源回收的情况;恰巧父进程也在退出并给子进程发了sigkill信号,那么会造成子进程无法响应kill信号。如果等回收资源出了些问题那么父进程也会死等。详情见[4]

参考

[1]https://blog.csdn.net/wennuanddianbo/article/details/101305653

[2]http://blog.chinaunix.net/uid-69947851-id-5825901.html

[4]https://netflixtechblog.com/debugging-a-fuse-deadlock-in-the-linux-kernel-c75cd7989b6d

目录
相关文章
|
自然语言处理 PyTorch 算法框架/工具
自然语言生成任务中的5种采样方法介绍和Pytorch代码实现
在自然语言生成任务(NLG)中,采样方法是指从生成模型中获取文本输出的一种技术。本文将介绍常用的5中方法并用Pytorch进行实现。
609 0
|
8月前
|
PyTorch 调度 算法框架/工具
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
DLC任务Pytorch launch_agent Socket Timeout问题源码分析与解决方案
439 18
阿里云PAI-DLC任务Pytorch launch_agent Socket Timeout问题源码分析
|
资源调度 PyTorch 调度
多任务高斯过程数学原理和Pytorch实现示例
本文探讨了如何使用高斯过程扩展到多任务场景,强调了多任务高斯过程(MTGP)在处理相关输出时的优势。通过独立多任务GP、内在模型(ICM)和线性模型(LMC)的核心区域化方法,MTGP能够捕捉任务间的依赖关系,提高泛化能力。ICM和LMC通过引入核心区域化矩阵来学习任务间的共享结构。在PyTorch中,使用GPyTorch库展示了如何实现ICM模型,包括噪声建模和训练过程。实验比较了MTGP与独立GP,显示了MTGP在预测性能上的提升。
427 7
|
机器学习/深度学习 PyTorch 测试技术
PyTorch实战:图像分类任务的实现与优化
【4月更文挑战第17天】本文介绍了使用PyTorch实现图像分类任务的步骤,包括数据集准备(如使用CIFAR-10数据集)、构建简单的CNN模型、训练与优化模型以及测试模型性能。在训练过程中,使用了交叉熵损失和SGD优化器。此外,文章还讨论了提升模型性能的策略,如调整模型结构、数据增强、正则化和利用预训练模型。通过本文,读者可掌握基础的PyTorch图像分类实践。
|
机器学习/深度学习 算法 PyTorch
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
【PyTorch实战演练】深入剖析MTCNN(多任务级联卷积神经网络)并使用30行代码实现人脸识别
1437 2
|
机器学习/深度学习 自然语言处理 PyTorch
PyTorch在NLP任务中的应用:文本分类、序列生成等
【4月更文挑战第18天】PyTorch在NLP中应用于文本分类和序列生成,支持RNN、CNN、Transformer等模型构建。其动态计算图、丰富API及强大社区使其在NLP研究中备受欢迎。预训练模型和多模态学习的发展将进一步拓宽PyTorch在NLP的应用前景。
|
机器学习/深度学习 PyTorch TensorFlow
如何使用TensorFlow或PyTorch进行机器学习任务?
如何使用TensorFlow或PyTorch进行机器学习任务?
163 2
|
存储 机器学习/深度学习 Kubernetes
【DSW Gallery】如何在DLC中进行Pytorch DDP分布式训练任务
本文基于Pytorch 1.8版本,介绍了如何使用DLC进行Pytorch DDP分布式训练任务.
【DSW Gallery】如何在DLC中进行Pytorch DDP分布式训练任务
|
数据可视化 PyTorch 算法框架/工具
基于 PyTorch 框架实现昆虫分类任务(下)
基于 PyTorch 框架实现昆虫分类任务(下)
239 0
基于 PyTorch 框架实现昆虫分类任务(下)
|
机器学习/深度学习 数据采集 数据可视化
基于 PyTorch 框架实现昆虫分类任务(上)
基于 PyTorch 框架实现昆虫分类任务(上)
692 0
基于 PyTorch 框架实现昆虫分类任务(上)

热门文章

最新文章

推荐镜像

更多