and*_*oke 5 parallel-processing jvm jce clojure
我在Intellij Idea中运行一些CPU密集型Clojure代码(我认为这不重要 - 它似乎只是产生一个进程).根据htop和top,它在我的笔记本电脑上使用了所有4个内核(好吧,2 +超线程).尽管我在代码中没有任何明确的并行性.
更多细节:top显示单个进程,CPU使用率约为380%,而htop显示"父"进程,然后是4个"子",每个进程有1/4的时间和~100%的CPU.
这是正常的吗?或者这是否意味着我在某处遇到了一些非常错误的事情?代码涉及许多惰性序列,但其核心修改了可变数据结构(可变 - 不是Clojure数据结构 - 累积结果的哈希). 我没有使用任何明确的并行性.
在JCA/JCE(加密lib)中花费了大量时间(我没有说过) - 我在CTR模式下使用多个AES密码,每个密码都是一个安全的随机字节流(这里是代码),实现为懒惰seqs.也许这是并行化的?
更随意的想法:这可能与IO有关吗?我正在运行加密的SSD,这个程序正在处理来自磁盘的数据,因此需要进行大量的阅读.但是htop将系统时间显示为红色,这些是绿色的.
对不起这个模糊的问题.如果需要,我可以发布更多信息.这是64位Linux(JDK 1.7.0_05)上的Clojure 1.4.正在执行的代码在这里,但是它非常混乱(更多的道歉)并且分布在各种文件中(大多数CPU时间花费在nearest-in-dump那里的代码中).注意 - 请不要浪费时间尝试运行代码来重现,因为它期望预先存在的数据转储在磁盘上(不在git中).
debugger在调试器中运行(感谢,AM)显示四个线程(如果我正确理解调试器),但只有一个正在执行程序.它们被标记为终结器,主(程序),参考处理程序和信号调度程序.Finalizer + ref处理程序处于等待状态; 信号调度员没有可用的帧.我暂时认为这意味着并行性处于较低的水平,也许在加密实现中?
啊哈,我认为它是并行GC(Java现在有一个并发收集器).在开始时,CPU使用会在实际进程暂停时跳跃(它打印出常规的勾号).而且由于它通过大量数据进行搅拌,因此会生成大量短期对象(通过使用-XX:+ UseSerialGC确认可将CPU使用率降低至100%)
好吧,我觉得发布这个有点愚蠢,因为它现在看起来很明显,但它似乎是并行 GC。我正在处理大量数据(从 SSD 中吸收数据)并生成大量短暂的对象。而且JVM似乎有并行GC。请参阅http://blog.ragozin.info/2011/12/garbage-collection-in-hotspot-jvm.html
这也可能是一个问题的征兆——java GC 发生了什么?PermGen 空间已满?- 我明天将进行调查(我没有提到它 - 尽管回想起来我应该有 - 但这是内存不足的边缘)。
更新:使用 -XX:+UseSerialGC 运行可将总 CPU 使用率降低至 100%(即 1 个核心)。但我并不是说上面的两个解释是排他性的,只是说通过更好的配置和/或代码我可以减少 GC 的数量。
| 归档时间: |
|
| 查看次数: |
371 次 |
| 最近记录: |