状态:Python处理大数据时,内存占用超过服务器可用内存,但是服务器并没有杀死该进程,而是被卡死无法通过ssh进入
解决方向:
一、设置系统内存限制:
使用 ulimit -a 查看系统参数
ulimit -a
命令的结果中会显示各种资源的限制参数。以下是一些常见参数及其含义:
core file size
(ulimit -c
): 该参数表示核心文件大小的上限。核心文件是在进程崩溃时生成的文件,其中包含了进程崩溃时的内存信息。data seg size
(ulimit -d
): 数据段大小的上限。file descriptors
(ulimit -n
): 表示一个进程可以打开的文件描述符的最大数量。文件描述符是进程访问文件和套接字的索引。max locked memory
(ulimit -l
): 该参数表示一个进程可以锁定的物理内存的最大量。max memory size
(ulimit -v
): 该参数是进程可以使用的最大虚拟内存量。open files
(ulimit -u
): 一个用户可以同时打开的最大文件数。stack size
(ulimit -s
): 该参数表示进程栈的最大大小。cpu time
(ulimit -t
): 表示进程可以使用的最大CPU时间。max user processes
(ulimit -u
): 表示一个用户可以同时运行的最大进程数。
这些限制是为了防止用户进程占用过多系统资源而设置的。通过ulimit
命令,管理员可以对这些限制进行调整以优化系统性能和资源利用。需要注意的是,这些限制的保护措施通常只适用于普通用户进程,对于超级用户(root)进程,这些限制往往没有约束力。
设置最大内存使用量:
例如,要设置最大内存限制为1GB,可以执行以下命令:
ulimit -v 1024000
ulimit
命令设置的内存限制仅对当前终端会话中的进程有效,重启终端后会重置为默认值。
另一种方法是在Python代码中使用resource
模块来设置最大内存限制。可以在代码中添加以下内容:
import resource # 设置最大内存限制为1GB
resource.setrlimit(resource.RLIMIT_AS, (1024 * 1024 * 1024, 1024 * 1024 * 1024))
使ulimit
命令的设置永久生效,需要对系统配置文件进行修改。具体步骤如下:
- 编辑
/etc/profile
文件:使用文本编辑器(如vi、nano等)打开/etc/profile
文件。 - 添加
ulimit
命令:在/etc/profile
文件的末尾添加你想要的ulimit
命令。例如,要永久设置最大内存限制为1GB,可以添加以下行:
ulimit -v 1024000
- 保存并关闭文件:保存对
/etc/profile
文件的修改,并关闭文本编辑器。 - 使设置生效:执行以下命令以使
/etc/profile
文件中的设置生效:
source /etc/profile
或者,你也可以重新启动系统,这将自动加载新的配置。
二、激活OOM Killer功能
查看功能状态,结果为1表示已激活,结果为0表示未激活
cat /proc/sys/vm/oom_kill_allocating_task
要激活OOM Killer,你可以通过修改内核参数来实现。你可以执行以下步骤来激活OOM Killer:
-
打开终端并以管理员身份登录到Linux系统。
-
编辑
/etc/sysctl.conf
文件。你可以使用文本编辑器(如vi、nano等)打开该文件
vi /etc/sysctl.conf - 在文件中添加或修改以下行
vm.oom_kill_allocating_task=1 - 这将把
oom_kill_allocating_task
参数设置为1,以激活OOM Killer。 保存并关闭文件。在vi编辑器中,按下Esc键退出编辑模式,然后输入:wq
保存修改并退出。 - 加载新的内核参数。执行以下命令,使修改生效:
sudo sysctl -p
这将重新加载
/etc/sysctl.conf
文件中的内核参数。完成上述步骤后,OOM Killer应该被激活了。当系统内存不足时,OOM Killer将会根据需要杀死进程以回收内存。请记住,在使用OOM Killer时要小心,并确保理解其工作原理和潜在风险。
OOM Killer对root用户的进程也是生效的。