我正在使用系统中所有可用内存的多线程程序进行性能分析。我的操作系统是Ubuntu 18.04。我正在尝试将可用内存限制为例如32GB,即使我的服务器可能有128GB可用内存。尚未找到可靠的解决方案。似乎ulimit
并没有完全按照我的要求进行。我还可以通过另一个进程(例如,将消耗64GB RAM的可控进程)阻塞内存。但是即使出于这个目的,我也不确定如何可靠地阻塞内存。
将不胜感激。
cgroups是现代Linux内核的功能部件,它允许您限制进程组(或带有线程的单个进程)的资源(如内存)。有关cgroup的更多信息:https://en.wikipedia.org/wiki/Cgroups https://man7.org/linux/man-pages/man7/cgroups.7.html
cgroups功能应该已经在ubuntu 18.04内核中启用。有一些描述如何使用cgroups限制内存:
docker run --memory=1G ….
cgcreate
/cgset
/cgexec
commands的自定义过程树:https://dev.to/vga/how-to-see-and-limit-memory-consumption-of-an-application-5bfl类似# 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版本(malloc
,new
)中的默认内存分配器对于已释放区域具有可怕的行为:如果不定期进行malloc_trim()
库调用,它们不会返回。您应该尝试将您的应用程序与libjemalloc或libtcmalloc链接,这将用一些代码在内存返回方面更好地替换glibc的malloc实现。
ulimit将限制进程内存,而不是系统内存。
如果要精确模拟较小的计算机,则在启动时将mem = 32G添加到内核命令行。