【问题标题】:Limit available memory to a program限制程序的可用内存
【发布时间】:2020-03-31 15:01:22
【问题描述】:

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

非常感谢您的想法。

【问题讨论】:

  • Ram 磁盘没有帮助,但您应该检查 cgroups *(如果在您的内核中启用,它应该适用于 ubuntu)。 systemd 托管服务的描述:paranoids.at/cgroup-ubuntu-18-04-howto,对于 docker docker run --memory=1G ….,对于带有 cgcreate/cgset/cgexec 的自定义进程树:dev.to/vga/…
  • 非常感谢您提供有关 cgroups 的信息。我正在查看您发送的链接并将尝试一下。话虽如此,RamDisk 似乎正在工作。为什么你认为这没有帮助?

标签: memory memory-management linux-kernel ubuntu-18.04


【解决方案1】:

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

您的 ubuntu 18.04 内核中应该已经启用了 cgroups 功能。有一些描述如何使用 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 实现。

【讨论】:

  • 所以我确实使用 cgroups 来限制我正在运行的程序的可用内存。但是,当我检查内存使用情况时,我可以看到虽然分配的内存是 1G,但程序正在使用 3G+ 内存。我知道 malloc 可能有问题。我使用的版本是 2.27-3。不确定那个是否有你提到的问题。
  • 阿米尔,检查 jemallor 或 tcmalloc。您如何检查内存使用情况,是 VIRT RES SHR 还是其他?
  • 我使用的 pmap 实际上并不是最好的。我最终使用了 smem,发现程序的 PSS 区域实际上在我设置的限制范围内。所以效果很好。
【解决方案2】:

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

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

【讨论】:

  • 谢谢。每次我想使用不同的内存配置运行新测试时,我都希望不要重新启动系统。当然这是一个可行的选择,但还有其他方法吗?我一直在阅读 /dev/shm。想知道那里是否有解决方案。
  • 你可以分配一个大页面段,这会完全从主内存分配器中删除它
  • 顺便说一句,刚刚遇到 RAM Disk。你有这方面的经验吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 2018-11-03
  • 2017-08-01
  • 2014-08-05
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多