将可用内存限制到程序中

问题描述 投票:0回答:2

我正在使用系统中所有可用内存的多线程程序进行性能分析。我的操作系统是Ubuntu 18.04。我正在尝试将可用内存限制为例如32GB,即使我的服务器可能有128GB可用内存。尚未找到可靠的解决方案。似乎ulimit并没有完全按照我的要求进行。我还可以通过另一个进程(例如,将消耗64GB RAM的可控进程)阻塞内存。但是即使出于这个目的,我也不确定如何可靠地阻塞内存。

将不胜感激。

memory memory-management linux-kernel ubuntu-18.04
2个回答
1
投票

cgroups是现代Linux内核的功能部件,它允许您限制进程组(或带有线程的单个进程)的资源(如内存)。有关cgroup的更多信息:https://en.wikipedia.org/wiki/Cgroups https://man7.org/linux/man-pages/man7/cgroups.7.html

cgroups功能应该已经在ubuntu 18.04内核中启用。有一些描述如何使用cgroups限制内存:

# Create a group for memory named “limited_group_1”
cgcreate -g "memory:limited_group_1" -t USERNAME:GROUPNAME

# Specify memory limit to 1G for this group
cgset -r memory.limit_in_bytes=1G "limited_group_1"

# Launch the application in this group
cgexec -g "memory:limited_group_1" ./YOUR_APPLICATION

# If needed, we can remove the group
cgdelete "memory:limited_group_1"

https://unix.stackexchange.com/questions/44985/limit-memory-usage-for-a-single-linux-process/279175#279175中也提到了[https://dev.to/vga/how-to-see-and-limit-memory-consumption-of-an-application-5bfl

PS:较早的glibc版本(mallocnew)中的默认内存分配器对于已释放区域具有可怕的行为:如果不定期进行malloc_trim()库调用,它们不会返回。您应该尝试将您的应用程序与libjemalloc或libtcmalloc链接,这将用一些代码在内存返回方面更好地替换glibc的malloc实现。


0
投票

ulimit将限制进程内存,而不是系统内存。

如果要精确模拟较小的计算机,则在启动时将mem = 32G添加到内核命令行。

© www.soinside.com 2019 - 2024. All rights reserved.