限制程序的可用内存
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限制内存的说明:
- 对于 systemd 托管服务:https://www.paranoids.at/cgroup-ubuntu-18-04-howto/、
- 用于 docker 个容器
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 was also mentioned in https://dev.to/vga/how-to-see-and-limit-memory-consumption-of-an-application-5bfl
PS:旧 glibc 版本(malloc
、new
)中的默认内存分配器对于释放区域有糟糕的行为:它们不会在没有定期 malloc_trim()
的情况下返回图书馆电话。您应该尝试 link 您的应用程序使用 libjemalloc 或 libtcmalloc,这将用内存返回中更好的代码替换 glibc 的 malloc 实现。
我正在对使用系统中所有可用内存的多线程程序进行性能分析。我的 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限制内存的说明:
- 对于 systemd 托管服务:https://www.paranoids.at/cgroup-ubuntu-18-04-howto/、
- 用于 docker 个容器
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 was also mentioned in https://dev.to/vga/how-to-see-and-limit-memory-consumption-of-an-application-5bfl
PS:旧 glibc 版本(malloc
、new
)中的默认内存分配器对于释放区域有糟糕的行为:它们不会在没有定期 malloc_trim()
的情况下返回图书馆电话。您应该尝试 link 您的应用程序使用 libjemalloc 或 libtcmalloc,这将用内存返回中更好的代码替换 glibc 的 malloc 实现。