gpt4 book ai didi

c++ - 如何防止并行代码耗尽所有可用的系统内存?

转载 作者:太空宇宙 更新时间:2023-11-04 04:14:08 26 4
gpt4 key购买 nike

我正在 Linux 上开发一个 C++ 代码,它可能会耗尽内存、进入交换并显着减慢速度,有时甚至崩溃。我想通过允许用户指定进程可以使用的总系统内存比例的限制来防止这种情况发生。如果程序超出此限制,则代码可能会输出一些中间结果,并干净地终止。

我可以通过从/proc/self/stat 读取驻留集大小来确定正在使用多少内存。然后,我可以对所有并行进程进行总结,得出程序的总内存使用情况。

可用的总系统内存可以通过调用 sysconf(_SC_PHYS_PAGES) 获得(请参阅 How to get available memory C++/g++? )。但是,如果我在并行集群上运行,那么这个数字可能只会给我当前集群节点的总内存。例如,我可能在 4 个集群节点(每个节点有 12 个核心)上运行 48 个进程。

所以,我真正的问题是如何找出给定进程正在哪个处理器上运行?然后,我可以总结在同一集群节点上运行的进程使用的内存,并将其与该节点上的可用内存进行比较,如果该内存超过了程序运行所在的任何节点上的指定百分比,则终止程序。我会为此使用 sched_getcpu() ,但不幸的是我正在使用 glibc 2.5 版本的系统上编译和运行,而 sched_getcpu() 仅在 glibc 2.6 中引入。另外,由于集群在旧的 Linux 操作系统(版本 2.6.18)上使用,我也无法使用 syscall() 来调用 getcpu() !是否有其他方法可以获取处理器编号或处理器的任何类型标识符,以便我可以分别对每个处理器使用的内存进行求和?

或者有更好的方法来解决这个问题吗?我愿意接受建议。

最佳答案

运行良好的集群会将您的作业置于某种形式的资源限制(RLIMIT_AS 或 cgroup)之下。您只需调用 setrlimit(RLIMIT_AS,...) 即可自行完成此操作。我认为您担心 sysconf 使事情变得过于复杂,因为在共享集群上,没有理由认为您的代码应该使用物理内存大小的固定部分。相反,您应该选择合理的内存要求(如果您的集群尚未提供 - 大多数调度程序都相当好地进行内存调度。)即使您坚持自己执行自动调整大小,您也不需要知道正在使用哪些核心:只需计算出节点上有多少个进程拷贝,然后进行适当的划分即可。 (当然,您需要弄清楚每个进程正在哪个节点(主机)上运行。)

值得指出的是,内核是RLIMIT_AS,而不是RLIMIT_RSS。当您达到此限制时,新的分配将会失败。

最后,我对使用无限内存的程序的设计提出质疑。你确定没有更好的算法吗?如果在投入大量时间进行计算之后,用户会发现你的程序使用起来非常烦人,它决定尝试分配更多,然后失败。有时,当人们错误地认为分配尽可能多的内存将为他们提供更好的 IO 缓冲时,他们会问这类问题(这对于页面缓存等来说是幼稚的)。

关于c++ - 如何防止并行代码耗尽所有可用的系统内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17639030/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com