我正在使用Hudson构建一个项目。我有一些jar文件,我想使用Ant SignJar任务使用时间戳对其进行签名。当没有时间戳时,它就像一个魅力——一个文件大约需要2-3秒。当我将"tsaurl"属性添加到SignJar任务时,问题出现了。然后,一个文件的时间戳只需要几分钟。我尝试使用不同的时间戳服务器,但没有帮助。有人知道为什么要花这么多时间吗?首先,有没有办法解决这个问题?
jarsign耗时过长(至少在Linux上)的主要问题是内核熵池干涸。在这一点上,这个过程会阻塞,直到更多的熵到来。这导致了您所看到的jarsigner进程坐在那里不占用CPU时间但也不怎么做的症状。
在某个时刻(从1.5到1.6 AFAIK),Java从使用/dev/urandom
变成了使用/dev/random
。真正的熵实际上是现代计算机上的稀缺资源——大量的RAM会减少磁盘活动,缓存东西的智能程序会减少网络活动。有人告诉我,在虚拟机上(就像许多构建服务器一样),熵收集率可能更低。
你可以选择
- 将Java重新配置为使用
/dev/urandom
(如果您不是偏执狂) - 部署一种向
/dev/random
注入额外熵的方法
我选择了选项B:我为我选择的发行版(Ubuntu)安装了randomsound
软件包。这对你的麦克风进行了白化采样,并在它变干时将其用于向/dev/random
注入熵。这样做的主要缺点是它挡住了麦克风的其他用途。还有其他获得额外熵的方法,比如将磁盘复制到/dev/null
,或者进行包更新(大量磁盘和网络流量)。你可能想在一个或多个服务器上安装一个硬件RNG,并安装一些可以为其他服务器提供入口即服务的东西。或者即使是USB声卡和randomsound
也能工作(服务器室里有很多白噪音…)
对于选项A,您可以设置属性
-Djava.security.egd=file:/dev/./urandom
(注意额外的点-这是为了解决一个"聪明"的代码,即使你没有这么说,也会假设你想要/dev/random
:请参阅:https://bugs.openjdk.java.net/browse/JDK-6202721)