You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Ubuntu 24.04中限制RAM使用以强制进程使用Swap(用于基准测试)

如何在Ubuntu 24.04中限制RAM使用以强制进程使用Swap(用于基准测试)

刚好我之前也帮人处理过类似的基准测试需求,给你几个实用的方案,不管是单个进程(比如Jupyter里的Python任务)还是系统全局限制都能覆盖,完全适配Ubuntu 24.04的环境:

一、单个进程限制(适合Jupyter/IPython场景)

如果你只想针对某一个Python进程、IPython会话或者Jupyter Notebook做限制,这几个方法最方便:

1. 用prlimit命令直接启动进程

在终端里用prlimit给进程设置物理内存上限,超过的部分会自动被系统换到Swap里。比如你要启动一个限制为8G物理内存的Jupyter Notebook:

prlimit --rss=8192M jupyter notebook

解释一下:--rss参数控制的是常驻集大小(Resident Set Size),也就是进程实际占用的物理内存,设置为8192M(8GB)后,这个进程及其子进程最多只能用8G物理RAM,超出的内存数据会被系统自动迁移到Swap分区。

如果你是直接跑单个Python脚本,就改成:

prlimit --rss=8192M python3 your_benchmark_script.py

2. 在Jupyter Notebook内部动态限制

不想重启Jupyter的话,也可以在Notebook的代码单元格里用Python内置的resource模块给当前进程设置内存限制,直接运行这段代码即可:

import resource

# 把最大物理内存限制设为8GB(单位是KB,8*1024*1024=8388608)
resource.setrlimit(resource.RLIMIT_RSS, (8388608, 8388608))

设置后,这个Notebook里所有后续运行的代码都会受到这个限制,超过8G物理内存就会触发Swap。

3. 用cgroup v2精细化控制(适合多进程组)

如果你的基准测试涉及多个关联进程,用cgroup来分组限制更灵活:

# 1. 创建一个专门的cgroup目录(Ubuntu 24.04默认用cgroup v2,挂载在/sys/fs/cgroup)
sudo mkdir -p /sys/fs/cgroup/mem-limit-8g

# 2. 设置这个cgroup的物理内存上限为8G
sudo echo 8G > /sys/fs/cgroup/mem-limit-8g/memory.max

# 3. 让当前用户有权限在这个cgroup里启动进程
sudo chown $USER:$USER /sys/fs/cgroup/mem-limit-8g/cgroup.procs

# 4. 把要运行的进程放到这个cgroup里,比如Jupyter
cgexec -g memory:mem-limit-8g jupyter notebook

这种方法的好处是,所有在这个cgroup里的进程都会共享8G物理内存上限,非常适合测试多进程协作的场景。

二、系统级全局限制(模拟整个系统只有8G RAM)

如果你需要让整个系统都模拟8G物理内存的环境(所有进程加起来最多用8G RAM),可以用cgroup对全局进程做限制:

# 注意:这个操作需要root权限,会影响所有进程,测试完成后记得恢复!

# 1. 创建系统级的cgroup
sudo mkdir -p /sys/fs/cgroup/system-mem-8g

# 2. 设置物理内存上限为8G
sudo echo 8G > /sys/fs/cgroup/system-mem-8g/memory.max

# 3. 把所有正在运行的进程都移到这个cgroup里
sudo echo 1 > /sys/fs/cgroup/system-mem-8g/cgroup.procs

恢复方法:

要取消全局限制,只需要把所有进程移回根cgroup,然后删除创建的cgroup目录:

sudo echo 1 > /sys/fs/cgroup/cgroup.procs
sudo rmdir /sys/fs/cgroup/system-mem-8g

额外注意事项

  • 确保你的Swap空间足够大:基准测试前可以用swapon --show查看当前Swap大小,如果不够,临时创建一个大的Swap文件应急:
    # 创建16G的临时Swap文件
    sudo fallocate -l 16G /swap-temp
    sudo chmod 600 /swap-temp
    sudo mkswap /swap-temp
    sudo swapon /swap-temp
    # 测试完成后卸载并删除:sudo swapoff /swap-temp && sudo rm /swap-temp
    
  • 关闭OOM Killer的干扰:如果进程触发内存限制时被OOM Killer杀掉,可以临时调整vm.oom_kill_allocating_task参数:
    sudo sysctl -w vm.oom_kill_allocating_task=0
    # 恢复默认:sudo sysctl -w vm.oom_kill_allocating_task=1
    

备注:内容来源于stack exchange,提问作者qalis

火山引擎 最新活动