我在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%来确认)
答案 0 :(得分:4)
它也可能是一个问题的标志 - What is going on with java GC? PermGen space is filling up? - 我将在明天调查(我没有提到它 - 虽然回想起来我应该 - 但这是边界耗尽内存)。< / p>
更新:使用-XX运行:+ UseSerialGC将总CPU使用率降低到100%(即1核心)。但我并不是说上面的两个解释都是排他性的,只有配置和/或代码更好,我才能减少GC的数量。