- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 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/
我们认为 Cloud Foundry 中的一组虚拟机存在 Azure SNAT 耗尽问题。这些机器不经过负载平衡器。 我已经浏览过这份文件: https://learn.microsoft.com/e
我正在使用 onSceneTouchEvent 在 TMX map 上移动玩家: @Override public Scene onCreateScene() { ...
关于这篇文章:Python del Statement , 我最近遇到了以下片段: # custom_process.py import threading import subprocess myL
我有一个具有多个线程的 python 应用程序,其中线程 2 到 n 可能会打开任意数量的文件。我想确保当线程 1 尝试打开文件时,它绝对不会因为文件描述符耗尽而失败。简而言之,我想保留文件描述符而不
我开发了一个 c# .net 4 应用程序,它每天对组织中的每台计算机(超过 70,000 台)执行 WMI 查询。由于与此线程无关的原因,我无法从服务器运行该应用程序,而是从我的 Windows X
我正在尝试在 pytorch 中实现 Yolo-v2。但是,我似乎只是通过网络传递数据而耗尽了内存。该模型很大,如下所示。但是,我觉得我在用我的网络做一些愚蠢的事情(比如不在某处释放内存)。网络在 c
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我在这里查看了几个与“太多客户”相关的主题,但仍然无法解决我的问题,所以我必须针对我的具体情况再次询问。 基本上,我设置了本地 Postgres 服务器并需要进行数万次查询,所以我使用了 Python
我正在使用 std::random_device 并想检查它的剩余熵。根据 cppreference.com: std::random_device::entropy double entropy()
我有以下 docker-compos.yml 文件: web: build: . ports: - "4200:4200" - "35729:35729" vo
如果 Linux 操作系统用完进程 ID 会怎样?是否会删除较旧的进程以释放空间以适应 future 的请求? 最佳答案 我假设您问的是达到进程限制时会发生什么。在这种情况下,系统不允许创建新进程,直
我们将 Azure SQL 用作单个数据库并在 DTU 定价模型下使用。我们有一个包含约 50M 条记录的表,我们想在单个字符串属性上添加一个新的非聚集索引。 问题是这是一个生产数据库。如果我使用简单
我们有多个服务总线监听器在应用服务内作为连续的 Azure Webjobs 运行。总共有 12 个监听器 Web 作业在同一个 S1 应用服务计划上运行。环境很小,每天总共大约有~1000-10000
Der Azure 网络专家, 我们的 Web 应用程序经常耗尽出站 TCP 连接。大多数出站连接实际上是 Azure 内部连接(SQL、BlobStore、后端服务)。但我们还没有虚拟网络和专用端点
我下载了一个简单的静态网络服务器的源代码 http://www.ibm.com/developerworks/systems/library/es-nweb/sidefile1.html 但是,我对第
我已经查看了有关 SO 的其他类似问题,但无法很好地将所有内容拼凑在一起。我有一个 Rails 应用程序(在 Heroku 上),它使用具有多进程和多线程的 Puma。我的应用程序还使用 Redis
在此代码中,如果我对 ParseForm() 调用进行注释,请求将按预期工作 package main import ( "fmt" "net/http" "net/url"
我不明白。 XSLX 表大约有 3MB 大,但即使是 1024MB 的 RAM 也不足以让 PHPExcel 将其加载到内存中吗? 我这里可能做错了什么: function ReadXlsxTable
我已配置 CachingConnectionFactory包装了一个 MQTopicConnectionFactory和 MQQueueConnectionFactory每个缓存大小设置为 10。 这
我正在检查 CodeEval 中的一些问题并在 PHP 中遇到这个奇怪的错误。我没有用其他语言遇到过这样的事情,所以我不知道为什么会发生这种情况。不包括整个答案(请不要帮我找到解决方案,除了 PHP
我是一名优秀的程序员,十分优秀!