gpt4 book ai didi

clojure - Clojure(或 JCE,或 JVM,或...?)会自动引入并行性吗?

转载 作者:行者123 更新时间:2023-12-03 22:12:24 24 4
gpt4 key购买 nike

我正在 Intellij Idea 中运行一些 CPU 密集型 Clojure 代码(我认为这并不重要 - 它似乎只是产生一个进程)。根据 htop 和 top 的说法,它在我的笔记本电脑上使用了所有 4 个内核(好吧,2 个 + 超线程)。尽管我在代码中没有任何明确的并行性。

更详细一点:top 显示了一个 CPU 使用率约为 380% 的单个进程,而 htop 显示了一个“父”进程,然后是 4 个“子”进程,每个进程占用 1/4 的时间和约 100% 的 CPU。

这是正常的吗?或者这是否意味着我在某个地方出了点问题?该代码涉及许多惰性序列,但其核心修改了可变数据结构(可变的 - 不是 Clojure 数据结构 - 累积结果的哈希)。 我没有使用任何明确的并行性。

在 JCA/JCE(加密库)中可能花费了大量时间(我没有分析过)——我在 CTR 模式下使用多个 AES 密码,每个密码作为安全随机字节流( code here ),实现为懒惰的序列。也许这是并行化的?

更随意的想法:这可能与IO有关吗?我在加密的 SSD 上运行,该程序正在处理来自磁盘的数据,因此需要大量读取。但是 htop 将系统时间显示为红色,而这些是绿色的。

抱歉问了这么模糊的问题。如果需要,我可以发布更多信息。这是 64 位 Linux (JDK 1.7.0_05) 上的 Clojure 1.4。正在执行的代码是 here但它非常困惑(更抱歉)并且分布在各种文件中(大部分 CPU 时间都花在了 nearest-in-dump 的代码中)。注意 - 请不要浪费时间尝试运行代码来重现,因为它期望预先存在的数据转储在磁盘上(不在 git 中)。

调试器 在调试器中运行(谢谢,A-M)显示四个线程(如果我正确理解调试器),但只有一个正在执行程序。它们被标记为终结器、main(程序)、引用处理程序和信号调度程序。 Finalizer + ref handler 处于等待状态;信号调度程序没有可用的帧。我暂时认为这意味着并行性处于较低级别,也许在加密实现中?

啊哈我认为它是并行 GC(Java 现在有一个并发收集器)。一开始,当实际进程暂停时,CPU 使用率会上升(它打印出一个常规的滴答声)。并且由于它正在处理大量数据,因此它生成了大量短期对象(通过使用 -XX:+UseSerialGC 确认,这将 CPU 使用率降低到 100%)

最佳答案

好吧,我觉得发布这个有点愚蠢,因为它现在看起来很明显,但它似乎是并行 GC。我正在处理大量数据(从 SSD 中提取)并生成大量短期对象。看来 JVM 具有并行 GC。见 http://blog.ragozin.info/2011/12/garbage-collection-in-hotspot-jvm.html

这也可能是问题的征兆 - What is going on with java GC? PermGen space is filling up? - 我明天将调查(我没有提到它 - 虽然回想起来我应该有 - 但这是内存不足的临界点)。

更新 :使用 -XX:+UseSerialGC 运行将 CPU 总使用率降低到 100%(即 1 个核心)。但我并不是说上面的两个解释是排他性的,只是通过更好的配置和/或代码我可以减少 GC 的数量。

关于clojure - Clojure(或 JCE,或 JVM,或...?)会自动引入并行性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11371541/

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