限制每个进程的物理内存
Limit physical memory per process
我正在写一个算法来执行一些外部内存计算,即你的输入数据不适合主内存,你必须考虑I/O复杂性。
因为在我的测试中,我并不总是想使用实际输入,所以我想限制进程可用的内存量。我发现的是,我可以设置mem
内核参数来限制所有进程的物理使用内存(这是正确的吗?)
ulimit
,但它只限制每个进程的虚拟内存。有什么想法吗(也许我甚至可以在我的c++代码中以编程方式设置它)? 您可以尝试使用'cgroups'。要使用它们,以root用户的身份输入以下命令:
# mkdir /dev/cgroups
# mount -t cgroup -omemory memory /dev/cgroups
# mkdir /dev/cgroups/test
# echo 10000000 > /dev/cgroups/test/memory.limit_in_bytes
# echo 12000000 > /dev/cgroups/test/memory.memsw.limit_in_bytes
# echo <PID> > /dev/cgroups/test/tasks
要添加到cgroup的进程的PID。注意,该限制适用于分配给该c组的所有进程的总和。
从现在开始,进程被限制为10MB的物理内存和12MB的物理+交换空间。
在该目录中还有其他可调参数,但确切的列表将取决于您使用的内核版本。
你甚至可以创建层次结构的限制,只需创建子目录。
cgroup是在你fork/exec的时候被继承的,所以如果你从启动你的程序的地方添加shell到一个cgroup,它会被自动分配。
请注意,您可以将cgroups挂载到任何您想要的目录,而不仅仅是/dev/cgroups。
我将使用带有RLIMIT_AS参数的setrlimti来设置虚拟内存的限制(这就是ulimit所做的),然后让进程使用mlockall(MCL_CURRENT|MCL_FUTURE)来强制内核故障并锁定所有进程页面到物理RAM中,因此这个进程的虚拟内存数量==物理内存数量
我不能提供一个直接的答案,但是关于做这些事情,我通常写我自己的内存管理系统,这样我就可以完全控制内存区域和分配多少。当您为微控制器编写时,这通常也适用。
您考虑过在某种虚拟环境中尝试您的代码吗?虚拟机可能无法满足您的需求,但是User-Mode Linux之类的东西可能非常适合您。它将linux内核作为单个进程在常规操作系统中运行。然后,您可以提供一个单独的mem=
内核设置,以及一个单独的交换空间来进行受控实验。
内核mem=
启动参数限制了操作系统将使用多少内存。
这几乎不是用户想要的。
对于物理内存,有RSS rlimit,即RLIMIT_AS
。
正如其他海报已经指出的那样,setrlimit是最可能的解决方案,它控制进程环境中所有可配置方面的限制。使用以下命令查看shell进程中的这些单独设置:
ulimit -a
结果输出中与您的场景最相关的内容如下:
data seg size (kbytes, -d) unlimited
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
virtual memory (kbytes, -v) unlimited
查看手册页的setrlimit ("man setrlimit"),它可以从您的C/c++代码中以编程方式调用。我过去使用它来控制堆栈大小限制,效果很好。(顺便说一句,ulimit没有专门的手册页,它实际上是一个嵌入式bash命令,所以它在bash手册页中。)
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 可以读入进程内存的最大块大小是多少?
- 如何读取特定地址的进程内存?
- 如何删除列出的"QGraphicsPathItem"对象以控制进程内存使用情况?
- 如何在 WSL 2 中读取物理内存?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 静态局部变量没有物理内存
- Linux如何知道过程使用了多少物理内存
- 评估 C/C++ 内存泄漏时的虚拟与物理内存
- 运算符 new 在大量物理内存可用时引发异常
- std::矢量元素在物理内存中是否连续
- 关于c++指针和物理内存
- 从内存进程中获取信息
- 如何在Windows上直接从物理内存中读取
- 共享内存进程间通信
- 虚拟内存或物理内存
- 不断增加物理内存Visual c++ CryptMsgClose和CryptReleaseContext
- 如何获得windows中特定进程使用的物理内存和cpu
- WMI给我不完整的硬件信息(物理内存)
- 限制每个进程的物理内存