linux下运行pytorch程序显示“killed”或者“已杀死”

博客介绍了PyTorch在Linux系统中因内存不足,被Linux内核的OOM killer杀掉进程的情况。确定问题后给出两个解决方案,一是加大内存,但因内存条涨价放弃;二是增加swap分区,虽性能降低但无需额外成本,还详细说明了增加swap分区的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是由pytorch对于内存不足的反应,确切说,是Linux内核对pytorch程序占用太多内存的反应。Linux内核一旦因为内存资源不足而生气的时候,会使用OOM killer将占用内存最多的进程杀掉。这种情况下,pytorch的python程序根本就来不及显示相关的内存日志,直接在呼喊出killed这一个简短有力的词语后,就game over了。如果不提前掌握这个背景的话,你可真是会手足无措啊。

既然我们确定了是内存不足导致的问题(dmesg也能明确的显示出kernel把占了近10个GB的python进程给kill了),那我们的解决方案就有2个:

第一个是加大内存,将我的x99平台的内存从16GB增加到64GB;这个方案先放弃了,因为内存条涨价太猛,我买不起了;

第二个是增加swap分区,当然性能会降低,但不需要额外增加成本。所以Gemfield今天的选择就是第二个方案。

1,先禁止掉swap功能:

sudo swapoff /swapfile

这个命令执行之后,如果你用free命令查看的话会发现swap分区的大小变为了0。

2,增加 /swapfile的大小:

sudo dd if=/dev/zero of=/swapfile bs=1M count=30720 oflag=append conv=notrunc

这个命令会在现有的/swapfile后面追加30GB,加上之前的2GB的swap分区,现在共有32个GB的swap分区了。如果按照固态硬盘128GB有300多块钱来算的话,这个命令花了七八十块钱呢。

3,设置这个文件为swap分区的挂载点:

sudo mkswap /swapfile

4,再次启用swap

sudo swapon /swapfile

【参考】https://www.zhihu.com/column/p/30562899

### Killed 错误的原因分析 在 IT 场景下,“Killed”通常表示某个进程被操作系统终止。这种行为可能由多种因素引起,具体取决于上下文环境。 #### 1. **资源耗尽** 当系统检测到某些资源(如内存、CPU 时间片或其他硬件限制)已被过度占用时,操作系统的 OOM(Out of Memory)管理器会主动杀死消耗最多的进程以保护整个系统的稳定性[^1]。这种情况常发生在运行大型计算任务或数据密集型应用时。 #### 2. **权限问题** 如果尝试访问未授权区域或者执行非法指令,则可能导致段错误(Segmentation Fault),最终表现为“killed”。例如,在 C/C++ 编程中越界读写数组元素就会引发 SIGSEGV 信号并强制退出程序。 #### 3. **多线程或多进程中的异常情况** 对于 Python 的 PyTorch 数据加载器(Dataloader),如果设置了过多的 `num_workers` 参数而机器本身可用共享内存不足的话,也可能收到类似于“worker was killed by signal”的报错消息[^2]。这是因为子进程中存在竞争条件或是其他同步机制失效所造成的崩溃现象。 #### 4. **网络连接中断** 在网络通信领域比如数据库交互过程中,长时间等待响应却得不到结果亦或者是中间链路断开等情况均有可能造成客户端接收到类似“Lost connection...during query”的提示信息,并伴随有“killed”字样出现[^3]。 --- ### 解决方案建议 针对上述提到的各种可能性提供相应的解决方案如下: #### 资源优化 - 检查当前服务器状态,确认是否有足够的剩余空间供应用程序使用; - 如果发现确实是因为 RAM 不足而导致的服务停止工作,则考虑升级硬件配置或将部分运算转移到云端完成; #### 权限调整与代码修正 - 审核所有涉及指针操作的地方确保不会发生越权存取动作; - 使用现代高级别的编程语言自带的安全特性来规避低级错误的发生几率; #### 配置合理参数设置 - 对于深度学习框架而言适当减少并发数量(`num_workers`)可以有效缓解因争夺有限资源带来的负面影响; - 同样也可以通过增加交换分区大小等方式间接提升整体性能表现从而避免频繁遭遇此类状况; #### 增强网络健壮性设计 - 设置合理的超时时间防止无限期挂起; - 实施重试逻辑以便应对偶尔发生的瞬态故障情形; --- ```python import os def check_memory_usage(): """获取Linux系统上的内存利用率""" with open('/proc/meminfo', 'r') as f: meminfo = dict((i.split()[0].rstrip(':'),int(i.split()[1])) for i in f.readlines()) total_mem = meminfo['MemTotal'] free_mem = meminfo['MemFree'] + meminfo['Buffers'] + meminfo['Cached'] used_percentage = ((total_mem - free_mem)/total_mem)*100 return round(used_percentage,2) if __name__ == "__main__": usage_percent = check_memory_usage() print(f"Current memory usage percentage:{usage_percent}%") if usage_percent >=85 : raise Exception('High Memory Usage Detected! Please optimize your program.') ``` ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值