python使用虚拟内存_如何限制python进程的内存使用量

一个进程如果疯狂的使用内存,那么就会抢占服务器的资源导致其他任务无法正常执行,那么有没有什么办法可以限制进程所能使用的内存总量呢?本文以python为例,向你展示如何限制进程的内存。

1. 使用resource模块

python的resource模块提供了限制内存使用的功能,你可以设置进程所能申请的最大内存,当内存申请量超过限制时,进行会被kill掉,下面是一个简单的示例

import resource

import time

import psutil

p = psutil.Process()

print(p.pid)

def limit_memory(maxsize):

soft, hard = resource.getrlimit(resource.RLIMIT_AS)

resource.setrlimit(resource.RLIMIT_AS, (maxsize, hard))

limit_memory(1024*1024*180) # 限制180M ,可申请内存,对应虚拟内存

lst = []

while True:

lst.append("a"*1000000)

time.sleep(0.5)

执行脚本后,程序会输出自己的进行pid,使用命令 top -p pid, 就可以查看到这个进程的资源使用情况,重点关注VIRT 的数值,这个是虚拟内存,resource模块限制的正是这个数值,这个数值在显示时默认是字节,按一下e 键,就可以切换单位,切换到m更容易观察,当VIRT接近180M或者略微超出时,进程就被kill了。

这里有必要解释一下,为什么VIRT 小于所限制的数值时进程会被kill。我在程序里使用列表不停的append字符串,python里的列表与C++ STL 里的vector有一点像,列表会先申请一部分内存,当这部分内存快耗尽时,它会依据算法申请一块更大的内存备用,当VIRT 接近180M时,已经申请的内存不够用了,于是python再次申请,结果一下子超过了180M,终端来没有来得及显示最终的内存量,进程就被kill了。

resource.setrlimit 可以限制python进行对资源的使用,resource.RLIMIT_AS 是 进程可能占用的地址空间的最大区域,单位是字节,soft 和 hard 的数值,你不必去关心,在linux下,默认都是-1,其实getrlimit方法可以不调用,直接将hard替换成-1就行。

2. 使用cgroup

2.1 cgroup

Cgroup 是 Linux kernel 的一项功能:它是在一个系统中运行的层级制进程组,你可对其进行资源分配(如 CPU 时间、系统内存、网络带宽或者这些资源的组合),在使用前,你需要安装

yum install -y libcgroup libcgroup-tools

2.2 创建cgroup

cd /sys/fs/cgroup/memory/

mkdir memory_limit

cd memory_limit

mkdir 30m_limit

cd 30m_limit

echo 30m > memory.limit_in_bytes # 限制程序最多只能使用30M内存

/sys/fs/cgroup/memory/ 可以理解为限制内存使用的根目录,我创建memory_limit的目的,是为了在memory_l

你可能感兴趣的:(python使用虚拟内存)