跑代码过程中遇到 killed 解决策略
目录
一、引言
二、解决
第一步:查看日志,确认问题
第二步:解决方法
第一种:增加交换空间
第二种:调整内存分配策略
一、引言
-
简要描述问题:在跑代码时,程序突然被终止,命令行提示 "Killed"。
-
这个问题通常是由于系统内存不足,触发了 Linux 的 OOM Killer 机制。
-
本文将分享如何通过查看日志、增加交换空间、调整内存分配策略等方法解决这个问题。
二、解决
第一步:查看日志,确认问题
使用dmesg查看系统日志
sudo dmesg | grep -i "killed"
如果有看到 Out of memory 可以确定是内存不足的问题
第二步:解决方法
第一种:增加交换空间
什么是交换空间?
-
交换空间是磁盘上的一块区域,当物理内存不足时,系统会将部分内存数据转移到交换空间,以腾出物理内存。
-
虽然交换空间的速度比物理内存慢,但可以避免程序因内存不足而被终止。
如何增加交换空间?
1.创建交换文件 (大小为20G)
sudo fallocate -l 20G /swapfile_new
2.设置权限
sudo chmod 600 /swapfile_new
3.格式化为交换空间
sudo mkswap /swapfile_new
4.启用交换文件
sudo swapon /swapfile_new
5.验证交换空间
sudo swapon --show
free -h
6.永久生效
编辑/etc/fstab文件,添加以下内容
/swapfile_new none swap sw 0 0
【扩展】详细步骤
在编辑之前,最好先备份/etc/fstab文件,以防操作失误导致系统无法启动
sudo cp /etc/fstab /etc/fstab.backup
使用nano文本编辑器打开/etc/fstab文件
sudo nano /etc/fstab
添加文件交换配置(在文末添加)
/swapfile_new none swap sw 0 0
其中
-
/swapfile_new
:你创建的交换文件的路径。 -
none
:表示没有挂载点。 -
swap
:表示文件类型为交换空间。 -
sw
:表示挂载选项为swap
。 -
0 0
:表示不进行文件系统检查和备份。
验证/etc/fstab文件(检查是否有语法错误)
sudo mount -a
如果没有错误提示,则说明文件编辑成功
第二种:调整内存分配策略
当系统内存不足时,Linux 内核会通过 OOM Killer 终止占用内存最多的进程。为了避免这种情况,可以通过调整内存分配策略来优化系统的内存管理。
具体来说,可以通过修改以下两个内核参数来实现:
-
vm.overcommit_memory
:控制系统的内存分配策略。 -
vm.overcommit_ratio
:定义允许分配的内存总量。
参数说明
vm.overcommit_memory
-
0
(默认值):启发式超额分配。-
系统会尝试估算可用内存,并根据一定的策略决定是否允许内存分配。
-
如果系统认为内存不足,可能会拒绝某些内存分配请求。
-
-
1
:总是允许超额分配。-
系统总是允许内存分配,即使当前内存不足。
-
这可能会导致系统在内存耗尽时触发 OOM Killer 来终止进程。
-
-
2
:禁止超额分配。-
系统会拒绝超过一定比例的内存分配请求,比例由
overcommit_ratio
决定。 -
允许分配的内存总量为:
物理内存 × overcommit_ratio% + 交换空间
。
-
vm.overcommit_ratio
-
当
vm.overcommit_memory=2
时,定义系统允许分配的内存总量。 -
默认值通常是
50
(即 50%)。
如何调整参数?
临时调整(重启后失效)【建议】
sudo sysctl vm.overcommit_memory=2
sudo sysctl vm.overcommit_ratio=98
注:参数值根据情况进行设定
永久调整(重启后依旧生效)
如果你希望调整后的参数在系统重启后依然生效,可以编辑 /etc/sysctl.conf
文件
打开 /etc/sysctl.conf
文件:
sudo nano /etc/sysctl.conf
在文件末尾添加以下内容:
vm.overcommit_memory=2
vm.overcommit_ratio=98
保存并退出编辑器
运行以下命令使配置生效:
sudo sysctl -p
验证参数是否生效
cat /proc/sys/vm/overcommit_memory
cat /proc/sys/vm/overcommit_ratio