Clojure(或JCE,或JVM,或......?)是否自动引入并行性?

时间:2012-07-07 01:24:57

标签: clojure parallel-processing jvm jce

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

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

这是正常的吗?或者这是否意味着我在某处遇到了一些非常错误的事情?代码涉及许多惰性序列,但其核心修改了可变数据结构(可变 - 不是Clojure数据结构 - 累积结果的哈希)。 我没有使用任何明确的并行性。

在JCA / JCE(加密lib)中花费了大量时间(我没有分析过) - 我在CTR模式下使用多个AES密码,每个密码都是一个安全的随机字节流({{3} }),实现为懒惰的seqs。也许这是并行化的?

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

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

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

啊哈我认为它是并行GC(Java现在有一个并发收集器)。在开始时,CPU使用会在实际进程暂停时跳跃(它打印出常规的勾号)。由于它通过大量数据进行搅拌,因此会生成大量短期对象(通过使用-XX:+ UseSerialGC将CPU使用率降低到100%来确认)

1 个答案:

答案 0 :(得分:4)

好吧,我感觉有点愚蠢,因为它现在看起来非常明显,但它似乎是并行GC。我正在处理 lot 数据(从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? - 我将在明天调查(我没有提到它 - 虽然回想起来我应该 - 但这是边界耗尽内存)。< / p>

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