限制程序的可用内存

Limit available memory to a program

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

非常感谢您的想法。

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

如果你想准确地模拟一个更小的机器,在启动的内核命令行中添加mem=32G。

cgroups 是功能或现代 linux 内核,它允许您限制进程组(或具有线程的单个进程)的内存等资源。关于 cgroups 的更多信息: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 was also mentioned in https://dev.to/vga/how-to-see-and-limit-memory-consumption-of-an-application-5bfl

PS:旧 glibc 版本(mallocnew)中的默认内存分配器对于释放区域有糟糕的行为:它们不会在没有定期 malloc_trim() 的情况下返回图书馆电话。您应该尝试 link 您的应用程序使用 libjemalloc 或 libtcmalloc,这将用内存返回中更好的代码替换 glibc 的 malloc 实现。