问题标签 [memory-pressure]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parallel-processing - 并行运行 Akka Streams 阶段会显着增加内存压力
我正在尝试实现一个 Akka Stream,它从视频文件中读取帧并应用 SVM 分类器以检测每个帧上的对象。检测可以并行运行,因为视频帧的顺序无关紧要。我的想法是创建一个遵循 Akka Streams Cookbook(将工作平衡到固定的工人池)的图表,其中两个检测阶段标记为.async
.
它在一定程度上按预期工作,但我注意到我的系统的内存压力(只有 8 GB 可用)急剧增加,并且超出图表显着降低了系统速度。将其与使用.mapAsync
(Akka Docs)将三个演员集成到执行对象检测的流中的不同方法进行比较,内存压力显着降低。
我错过了什么?为什么并行运行两个阶段会增加内存压力,而三个并行运行的 Actor 似乎工作正常?
附加说明:我正在使用 OpenCV 读取视频文件。由于 4K 分辨率,每个类型Mat
的视频帧约为 26.5 MB。
并行运行两个阶段,.async
显着增加内存压力
.mapAsync
在不增加内存压力的情况下集成演员
linux - 即使在内存压力下,如何将可执行代码保留在内存中?在 Linux 中
这里的目标是在内存压力期间,在 Linux 中将每个正在运行的进程的可执行代码保留在内存中。
在 Linux 中,我可以
在 Qubes OS R4.0 Fedora 28 AppVM 内使用 24000MB 最大 RAM立即(1 秒)造成高内存压力并触发 OOM-killer stress --vm-bytes $(awk '/MemAvailable/{printf "%d\n", $2 + 4000;}' < /proc/meminfo)k --vm-keep -m 4 --timeout 10s
(代码来自此处)。EDIT4:也许相关,但我忘了提及,我没有启用交换(即CONFIG_SWAP
未设置)
dmesg 报告:
有趣的部分是active_file:94 inactive_file:72
它们以千字节为单位并且非常低。
这里的问题是,在内存压力期间,可执行代码正在从磁盘重新读取,导致磁盘抖动,从而导致OS 冻结。(但在上述情况下,它只发生不到 1 秒)
我在内核中看到一个有趣的代码:mm/vmscan.c
我认为,如果有人能指出如何改变这一点,而不是give them one more trip around the active list
我们得到它give them infinite trips around the active list
,那么应该完成工作。或者也许还有其他方法?
我可以修补和测试自定义内核。我只是不知道如何更改代码以始终将活动的可执行代码保留在内存中(我相信这实际上可以避免磁盘抖动)。
编辑:这是我到目前为止所做的工作(应用在内核 4.18.5 之上):
也可以在github 上看到,因为在上面的代码中,制表符被转换为空格!(mirror1,mirror2)
我已经测试了上面的补丁(现在在 4000MB 最大 RAM 上,是的,比以前少了 20G!)即使使用已知的 Firefox 编译磁盘会使操作系统永久冻结,并且它不再发生(oom-killer 几乎立即杀死了有问题的进程),同样使用上面的stress
命令现在产生:
也就是说active_file:26925 inactive_file:76
,将近 27 兆的活动文件...
所以,我不知道这有多好。我是否在内存中保留所有活动文件而不仅仅是可执行文件?在Firefox编译期间,我有500meg的Active(file)
(EDIT2:但这是根据:cat /proc/meminfo|grep -F -- 'Active(file)'
它显示的值与active_file:
dmesg的上述不同!!!)这让我怀疑它只是exes / libs ...
也许有人可以建议如何只保留可执行代码?(如果那不是已经发生的)
想法?
EDIT3:使用上面的补丁,似乎有必要(定期?)运行sudo sysctl vm.drop_caches=1
以释放一些陈旧的内存(?),这样如果我stress
在 Firefox 编译后调用我得到:active_file:142281 inactive_file:0 isolated_file:0
(142megs)然后删除文件缓存(另一种方式echo 1|sudo tee /proc/sys/vm/drop_caches
:)然后stress
再次运行,我得到:active_file:22233 inactive_file:160 isolated_file:0
(22megs) - 我不确定......
c# - 为了将对象的实例传递给“GC.AddMemoryPressure”方法,使用了哪些 C# 语言机制?
为了将对象的实例传递给GC.AddMemoryPressure
方法,使用了 C# 语言的哪些机制?
我通过 C# book在CLR中遇到了以下代码示例:
我不明白我们如何将一个对象的实例与它所增加的压力联系起来。我没有看到对象引用被传递给GC.AddMemoryPressure
. 我们是否将增加的内存压力 (amp) 与对象相关联?
另外,我看不出有任何理由调用GC.RemoveMemoryPressure(m_size);
. 从字面上看,它应该没有用。让我自己解释一下。有两种可能:对象实例之间存在关联,或者没有这种关联。
在前一种情况下,GC 现在应该m_size
确定优先级并决定何时进行收集。因此,它绝对应该自行消除内存压力(否则 GC 对 GC 意味着什么remove an object while taking into an account the amp
?)。
在后一种情况下,根本不清楚添加和移除放大器的用途。GC 只能使用定义为类实例的根。即GC只能收集对象。因此,如果对象和放大器之间没有关联,我看不出放大器如何影响 GC(所以我假设存在关联)。
sql-server - 由于内存压力,Google Cloud SQL Server 2017 被标记为卸载
我们正在使用一些数据库运行Google Cloud SQL Server 2017 Express 。经常会出现一个数据库崩溃,实例无法访问的情况,我们不得不重启实例才能恢复工作。我们已尝试更改最大服务器内存,但问题仍然存在。写在日志上的错误是:mssql master sys runtime .1) ismarked for unload due to memory pressure 。我将不胜感激您提出的解决方案。
sql-server - 为 SQL Server 2017 保留的内存中是否包含 CLR SSIS 模块的内存?
我的 SQL Server 2017 中有很多这样的问题:
Mensaje AppDomain 16 (SSISDB.dbo[runtime].26) 由于内存>压力而被标记为卸载。
我应该增加还是减少“最大内存”参数?
更一般地说,CLR SSIS 模块的内存是否包含在为 SQL Server 保留的内存中?
提前致谢