我在运行OSX 10.9.4,1.7GHz i7,8GB内存的Macbook Air上运行以下Java程序.我安装了Java Cryptography Extension(JCE).
import javax.crypto.Mac;
public class Main {
public static void main(String[] args) throws Exception {
Mac.getInstance("HmacSHA1");
}
}
Run Code Online (Sandbox Code Playgroud)
运行这个简单的程序会导致运行时间超过5秒!
$ javac -version
javac 1.7.0_45
$ javac Main.java
$ java -version
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
$ time java Main
real 0m5.326s
user 0m0.390s
sys 0m0.033s
Run Code Online (Sandbox Code Playgroud)
我做了很多搜索,但没有找到解决方法或解释的方法.
HmacSHA1的Mac.getInstance()需要很长时间才能执行
这听起来类似我的问题,但我读过的所有消息来源指出,/dev/random与/dev/urandom上OSX相同.
再次讨论SecureRandom的随机性来源,但似乎并不适用于OSX.
以前有人听说过这个问题吗?或者知道一种方法让我调试正在发生的事情?当你的单位测试一直持续到目前为止,对你的单位测试给予5秒的惩罚是非常令人沮丧的.
编辑: 这是程序内部的时间安排和安全提供程序列表:
import java.security.Provider;
import java.security.Security; …Run Code Online (Sandbox Code Playgroud) 通过使用 Blockhound io.projectreactor.tools blockhound-junit-platform我发现 UUID.randomUUID 是一个阻塞调用,这对我们来说是一个问题,因为我们使用的是 Spring Boot Webflux 版本 2.2.2.RELEASE
有没有其他方法可以以非阻塞方式获取随机 uuid,或者是否有任何其他 Java 库推荐用于非阻塞生成随机字符串。
来自blockhound的堆栈跟踪:
java.lang.Error: Blocking call! java.io.FileInputStream#readBytes
at reactor.blockhound.BlockHound$Builder.lambda$new$0(BlockHound.java:196) ~[blockhound-1.0.1.RELEASE.jar:na]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
|_ checkpoint ? org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain][ExceptionHandlingWebHandler]
Stack trace:
at reactor.blockhound.BlockHound$Builder.lambda$new$0(BlockHound.java:196) ~[blockhound-1.0.1.RELEASE.jar:na]
at reactor.blockhound.BlockHound$Builder.lambda$install$6(BlockHound.java:318) ~[blockhound-1.0.1.RELEASE.jar:na]
at reactor.blockhound.BlockHoundRuntime.checkBlocking(BlockHoundRuntime.java:46) ~[na:na]
at java.base/java.io.FileInputStream.readBytes(FileInputStream.java) ~[na:na]
at java.base/java.io.FileInputStream.read(FileInputStream.java:279) ~[na:na]
at java.base/java.io.FilterInputStream.read(FilterInputStream.java:133) ~[na:na]
at java.base/sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424) ~[na:na]
at java.base/sun.security.provider.NativePRNG$RandomIO.ensureBufferValid(NativePRNG.java:526) ~[na:na]
at java.base/sun.security.provider.NativePRNG$RandomIO.implNextBytes(NativePRNG.java:545) ~[na:na]
at java.base/sun.security.provider.NativePRNG.engineNextBytes(NativePRNG.java:220) ~[na:na]
at java.base/java.security.SecureRandom.nextBytes(SecureRandom.java:741) ~[na:na]
at java.base/java.util.UUID.randomUUID(UUID.java:150) ~[na:na]
Run Code Online (Sandbox Code Playgroud) java uuid reactive-programming project-reactor spring-webflux
在Java项目中,我使用的是ojdbc6 jar
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.1.0</version>
<scope>compile</scope>
</dependenc>
Run Code Online (Sandbox Code Playgroud)
我运行一天的第一次,dataSource.getConnection()很快.第二次通常没关系.接下来的几次大约需要45秒.之后,需要几分钟.一旦我有一个给定应用程序运行的FIRST连接,我得到的任何新连接都非常快.此延迟仅为给定运行获取FIRST连接.
是什么让我的第一次连接变得如此缓慢?
我正在观看netstat并且在成功运行后看不到任何连接.尝试了几个不同的连接池(DBCP,C3PO)没有运气.通过源代码调试,org.springframework.jdbc.datasource.DataSourceUtils的延迟是100%:
Connection con = dataSource.getConnection();
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑了更多细节
1)我正在使用连接池(DBCP或C3PO),它可以保存连接以备将来使用.当我谈到获得新连接时,我的意思是在第一个连接正在使用时......我需要转到数据库并获得新连接.当然,我可以一遍又一遍地从连接池返回并获得相同的连接.但同时获得第二个也很快.
2)我不知道我的DB允许我登录多少个连接.知道这个属性在oracle中的位置吗?
我正在使用jbcrypt来哈希项目中的密码.验证我正在使用的硬件上的密码时性能大约为500毫秒(log_rounds设置为12).然而,经过一段时间的常规使用后,表演时间突然下降到惊人的15秒.下降非常突然,没有累积,并且在重新启动过程之前保持不变.
分析显示在密钥(..)方法中使用了额外的时间.
来源:http://jbcrypt.googlecode.com/svn/tags/jbcrypt-0.3m/src/main/java/org/mindrot/jbcrypt/BCrypt.java
此方法仅使用xor,shift等基本函数计算哈希值.没有对象分配,外部资源的使用,随机数生成等.
在同一进程中,性能不会因其他功能而下降.内存分配稳定且低.不涉及完整的GC.
有没有人见过这个或为什么会发生这种情况的任何线索?我可以理解一种可变性能在某种程度上取决于其他情况,但这是一个非常突然和稳定的下降,从大约500ms.到大约15000毫秒.
我正在尝试调试部署在Tomcat上的应用程序提供的一些慢响应.现在,我侧重于SecureRandom和/dev/random(其他一些可能的原因进行了调查和排除).模式如下:
服务调用涉及加密和解密(AES/ECB/PKCS5Padding).
SecureRandom init/repopulating是否可能导致这种情况发生?
(虽然有一个用catalina.log写的日志说"Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [28,760] milliseconds.")
此外,为了检查是否/dev/random或/dev/urandom正在使用,我到测试使用的这个问题.令我惊讶的是,我没有看到其中任何一个的读取,不像链接问题中发生的那样.这些是strace日志中的最后几行:
3561 lstat("/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/jsse.jar", {st_mode=S_IFREG|0644, st_size=258525, ...}) = 0
3561 open("/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre/lib/jsse.jar", O_RDONLY) = 6
3561 stat("/dev/random", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 8), ...}) = 0
3561 stat("/dev/urandom", {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 9), ...}) = 0
3561 open("/dev/random", O_RDONLY) = 7
3561 open("/dev/urandom", O_RDONLY) = 8 …Run Code Online (Sandbox Code Playgroud) Java是否SecureRandom.nextLong()返回所有可能的值,因为它继承了Random仅使用48位的值?如果没有,我是否仍然可以通过修改Random类以及如何进行Java来实现它?我只想使用所有随机长数字生成器,如果可能的话,可以返回所有可能的长值.
我遇到了一个问题,当使用SSL时java很慢.解决方案是添加
-Djava.security.egd=file:/dev/./urandom到命令行的java.由于我有多个JVM,我不想修改每个JVM以包含此字符串,因此希望将其添加到文件中
$JAVA_HOME/jre/lib/security/java.security
现在,java.security文件已经包含了
securerandom.source=file:/dev/urandom
两个问题:
java ×7
random ×3
tomcat ×2
aes ×1
bcrypt ×1
cryptography ×1
datasource ×1
generator ×1
hmac ×1
jbcrypt ×1
jboss ×1
jdbc ×1
long-integer ×1
macos ×1
oracle ×1
performance ×1
security ×1
strace ×1
uuid ×1
weblogic ×1