Memory 限制程序的可用内存

Memory 限制程序的可用内存,memory,memory-management,linux-kernel,ubuntu-18.04,Memory,Memory Management,Linux Kernel,Ubuntu 18.04,我正在对一个使用系统中所有可用内存的多线程程序进行性能分析。我的操作系统是Ubuntu 18.04。我试图将可用内存限制在32GB,即使我的服务器可能有128GB的可用内存。 没有找到可靠的解决方案。似乎ulimit并不是我想要的那样。 我还可以通过另一个进程阻塞内存(例如,一个可控制的进程将消耗64GB的RAM)。但即使出于这个目的,我也不知道如何可靠地阻塞内存 非常感谢您的想法。ulimit将限制进程内存,而不是系统内存 如果您想准确地模拟较小的机器,请在引导时将mem=32G添加到内核命令

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


非常感谢您的想法。

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


如果您想准确地模拟较小的机器,请在引导时将mem=32G添加到内核命令行。

cgroups是一种功能或现代linux内核,它允许您限制一组进程(或带有线程的单个进程)的内存等资源。有关cGroup的更多信息:

您的Ubuntu18.04内核应该已经启用了cgroups功能。下面介绍了如何使用cgroup限制内存:

  • 对于systemd托管服务:
  • 对于docker容器
    docker运行--内存=1G….
  • 对于带有
    cgcreate
    /
    cgset
    /
    cgexec
    的自定义进程树:类似
报告中也提到了这一点


PS:较旧的glibc版本(
malloc
new
)中的默认内存分配器对于释放的区域有着糟糕的行为:如果没有定期的
malloc\u trim()
库调用,它们就不会返回。您应该尝试将您的应用程序与libjemalloc或libtcmalloc链接,这将用一些更好的内存返回代码替换glibc的malloc实现。

谢谢。我不希望每次想用不同的内存配置运行新测试时都重新启动系统。当然这是一个可行的选择,但还有其他办法吗?我一直在读/dev/shm。不知道是否有解决方案。你可以分配一个hugepages段,这将完全从主内存分配器中删除它TW,刚好遇到RAM磁盘。你有过这样的经验吗?Ram磁盘不会有帮助,但你应该检查cgroups*(如果在你的内核中启用,它应该适用于ubuntu)。systemd托管服务说明:,对于docker
docker run--memory=1G…
,对于带有cgcreate/cgset/cgexec的自定义进程树:非常感谢您提供有关cGroup的信息。我正在检查您发送的链接,并将尝试它。尽管如此,RamDisk似乎正在工作。为什么你认为这没有帮助?所以我使用cgroup来限制我正在运行的程序的可用内存。然而,当我检查内存使用情况时,我可以看到,虽然分配的内存是1G,但程序使用的是3G+内存。我知道malloc可能有问题。我使用的版本是2.27-3。不确定那一个是否有你提到的问题。阿米尔,检查jemallor或tcmalloc。你是如何检查内存使用情况的,是VIRT RES SHR还是其他什么?我使用的是pmap,它实际上不是最好的。我最终使用smem,发现程序的PSS区域实际上在我设置的限制范围内。所以这很有效。
# 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"