如何限制Python程序物理内存占用,使其优先使用交换内存?
限制Python程序物理内存至4G并优先使用交换内存(Ubuntu 20.04)
针对你的需求,在Ubuntu 20.04上可以通过以下几种方式实现:
方法1:用ulimit临时限制(会话级)
ulimit可以快速限制当前终端会话内进程的物理内存占用,操作简单:
- 先在终端执行:
这里的ulimit -m 41943044194304是4G对应的KB数(410241024),-m参数专门限制进程的常驻物理内存(RSS)。 - 接着在同一个终端启动你的Python程序:
python3 your_script.py - 说明:当程序物理内存占用触达4G上限后,系统会自动将超出的内存页转存到swap分区,不会直接终止进程。但这个限制只对当前终端会话有效,关闭终端后就失效了。
方法2:用prlimit单独管控进程(更灵活)
prlimit可以精准针对单个进程设置内存限制,无需影响整个终端会话:
- 启动程序时直接设置:
prlimit --rss=4G:4G python3 your_script.py--rss=4G:4G表示将物理内存的软、硬限制都设为4G,软限制是进程会收到警告的阈值,硬限制是绝对上限。 - 给已运行的进程加限制:
- 先通过
ps aux | grep python3找到目标Python进程的PID; - 然后执行:
prlimit --rss=4G:4G -p <你的进程PID>
- 先通过
方法3:用cgroup v2实现持久化限制
如果需要长期固定这个内存限制,或者要管理多个进程,cgroup v2是更合适的方案(Ubuntu 20.04默认支持):
- 创建专属的cgroup内存控制组:
sudo mkdir -p /sys/fs/cgroup/memory/python_mem_limit - 设置该组的物理内存上限为4G:
sudo bash -c 'echo 4G > /sys/fs/cgroup/memory/python_mem_limit/memory.max'memory.max参数控制该组内进程能使用的最大物理内存,超出后系统会自动使用swap。 - 将Python进程加入这个控制组:
- 启动程序时直接加入:
sudo cgexec -g memory:/python_mem_limit python3 your_script.py - 给已运行的进程加入:
sudo bash -c 'echo <你的进程PID> > /sys/fs/cgroup/memory/python_mem_limit/cgroup.procs'
- 启动程序时直接加入:
- 说明:cgroup的配置会保留到系统重启,若要开机自动生效,可以把上述设置命令写入
/etc/rc.local或者创建一个systemd服务。
额外注意点
- 先确认你的swap分区已正常挂载并可用,用
free -h命令即可查看swap的使用状态; - 当程序频繁使用swap时,运行速度会明显变慢——这是磁盘IO远慢于物理内存的正常现象,若对性能有要求,可能需要优化程序本身的内存占用;
- 如果你的Python程序会创建子进程,
ulimit和prlimit的限制会被子进程继承,cgroup则会统一管控组内所有进程的总内存占用。
内容的提问来源于stack exchange,提问作者ToughMind
相关产品推荐
相关产品推荐

