java响应很慢排插_服务响应时间慢:Java SecureRandom和/ dev / random - java

我正在尝试调试Tomcat上部署的应用程序提供的一些慢速响应。

现在,我主要关注SecureRandom和/dev/random(其他一些可能的原因已被调查并排除)。

模式如下:

第一个调用恰好在Tomcat重新启动后(即使请求在启动后4分钟到达)也仅需30.0 xy秒

稍后,某些调用恰好需要15.0 pq秒(没有可以建立的特定模式,pq是TP99中花费的时间)。

服务调用涉及加密和解密(AES / ECB / PKCS5Padding)。

SecureRandom初始化/重新填充是否有可能导致这种情况?

(尽管在catalina.log中写了一个日志,上面写着"Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [28,760] milliseconds.")

另外,为了检查是否正在使用/dev/random或/dev/urandom,我使用了this question的测试。令我惊讶的是,与链接问题中发生的情况不同,我没有看到它们中的任何一个。

这些是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

3561 unlink("/tmp/hsperfdata_xxxx/3560") = 0

那么,什么用于播种SecureRandom?

fyi,java -version

java version "1.6.0_32"

OpenJDK Runtime Environment (IcedTea6 1.13.4) (rhel-7.1.13.4.el6_5-x86_64)

OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)

参考方案

我无法检查您的OpenJDK具体版本,但可以检查jdk6-b33。

SecureRandom使用SeedGenerator获取种子字节

public byte[] engineGenerateSeed(int numBytes) {

byte[] b = new byte[numBytes];

SeedGenerator.generateSeed(b);

return b;

}

SeedGenerator从SunEntries获取seedSource(字符串)

String egdSource = SunEntries.getSeedSource();

SunEntries尝试首先从系统属性java.security.egd获取源,如果找不到,则尝试从securerandom.source属性文件获取java.security属性,如果找不到该属性,则返回空白字符串。

// name of the *System* property, takes precedence over PROP_RNDSOURCE

private final static String PROP_EGD = "java.security.egd";

// name of the *Security* property

private final static String PROP_RNDSOURCE = "securerandom.source";

final static String URL_DEV_RANDOM = "file:/dev/random";

final static String URL_DEV_URANDOM = "file:/dev/urandom";

private static final String seedSource;

static {

seedSource = AccessController.doPrivileged(

new PrivilegedAction() {

public String run() {

String egdSource = System.getProperty(PROP_EGD, "");

if (egdSource.length() != 0) {

return egdSource;

}

egdSource = Security.getProperty(PROP_RNDSOURCE);

if (egdSource == null) {

return "";

}

return egdSource;

}

});

}

SeedGenerator检查此值以初始化实例

// Static instance is created at link time

private static SeedGenerator instance;

private static final Debug debug = Debug.getInstance("provider");

final static String URL_DEV_RANDOM = SunEntries.URL_DEV_RANDOM;

final static String URL_DEV_URANDOM = SunEntries.URL_DEV_URANDOM;

// Static initializer to hook in selected or best performing generator

static {

String egdSource = SunEntries.getSeedSource();

// Try the URL specifying the source

// e.g. file:/dev/random

//

// The URL file:/dev/random or file:/dev/urandom is used to indicate

// the SeedGenerator using OS support, if available.

// On Windows, the causes MS CryptoAPI to be used.

// On Solaris and Linux, this is the identical to using

// URLSeedGenerator to read from /dev/random

if (egdSource.equals(URL_DEV_RANDOM) || egdSource.equals(URL_DEV_URANDOM)) {

try {

instance = new NativeSeedGenerator();

if (debug != null) {

debug.println("Using operating system seed generator");

}

} catch (IOException e) {

if (debug != null) {

debug.println("Failed to use operating system seed "

+ "generator: " + e.toString());

}

}

} else if (egdSource.length() != 0) {

try {

instance = new URLSeedGenerator(egdSource);

if (debug != null) {

debug.println("Using URL seed generator reading from "

+ egdSource);

}

} catch (IOException e) {

if (debug != null)

debug.println("Failed to create seed generator with "

+ egdSource + ": " + e.toString());

}

}

// Fall back to ThreadedSeedGenerator

if (instance == null) {

if (debug != null) {

debug.println("Using default threaded seed generator");

}

instance = new ThreadedSeedGenerator();

}

}

如果来源是

final static String URL_DEV_RANDOM = "file:/dev/random";

要么

final static String URL_DEV_URANDOM = "file:/dev/urandom"

在Windows上使用NativeSeedGenerator尝试在Linux上使用本机CryptoAPI该类只是扩展了SeedGenerator.URLSeedGenerator

package sun.security.provider;

import java.io.IOException;

/**

* Native seed generator for Unix systems. Inherit everything from

* URLSeedGenerator.

*

*/

class NativeSeedGenerator extends SeedGenerator.URLSeedGenerator {

NativeSeedGenerator() throws IOException {

super();

}

}

并调用默认情况下加载/dev/random的超类构造函数

URLSeedGenerator() throws IOException {

this(SeedGenerator.URL_DEV_RANDOM);

}

因此,在没有在系统属性/dev/random或安全属性文件的java.security.egd属性中未设置其他值之前,OpenJDK默认使用securerandom.source。

如果要使用strace查看读取结果,可以更改命令行并添加trace=open,read表达式

sudo strace -o a.strace -f -e trace=open,read java class

您会看到类似的内容(我使用Oracle JDK 6进行了测试)

13225 open("/dev/random", O_RDONLY) = 8

13225 read(8, "@", 1) = 1

13225 read(3, "PK\3\4\n\0\0\0\0\0RyzB\36\320\267\325u\4\0\0u\4\0\0 \0\0\0", 30) = 30

....

....

如果您在启动过程中遇到延迟,请参阅“Tomcat Wiki”部分中有关加快启动速度的建议,使用/ dev / urandom之类的非阻塞熵源

更多信息:https://wiki.apache.org/tomcat/HowTo/FasterStartUp#Entropy_Source

希望这可以帮助。

Java-搜索字符串数组中的字符串 - java

在Java中,我们是否有任何方法可以发现特定字符串是字符串数组的一部分。我可以避免出现一个循环。例如String [] array = {"AA","BB","CC" }; string x = "BB" 我想要一个if (some condition to tell wheth…产生6位数的随机数 - java

我只想生成6位数的随机数,范围应从000000到999999。new Random().nextInt(999999)返回我的电话号码,但不是6位数字。 参考方案 就这么简单,您可以使用您的代码,并在此处做一件事String.format("%06d", number); 这将以字符串格式返回您的数字,因此“0”将为“000000”。这是…Java Scanner读取文件的奇怪行为 - java

因此,在使用Scanner类从文件读取内容时,我遇到了一个有趣的问题。基本上,我试图从目录中读取解析应用程序生成的多个输出文件,以计算一些准确性指标。基本上,我的代码只是遍历目录中的每个文件,并使用扫描仪将其打开以处理内容。无论出于何种原因,扫描程序都不会读取其中的一些文件(所有UTF-8编码)。即使文件不是空的,scanner.hasNextLine()在…Java Globbing模式以匹配目录和文件 - java

我正在使用递归函数遍历根目录下的文件。我只想提取*.txt文件,但不想排除目录。现在,我的代码如下所示:val stream = Files.newDirectoryStream(head, "*.txt") 但是这样做将不会匹配任何目录,并且返回的iterator()是False。我使用的是Mac,所以我不想包含的噪音文件是.DS_ST…直接读取Zip文件中的文件-Java - java

我的情况是我有一个包含一些文件(txt,png,...)的zip文件,我想直接按它们的名称读取它,我已经测试了以下代码,但没有结果(NullPointerExcepion):InputStream in = Main.class.getResourceAsStream("/resouces/zipfile/test.txt"); Buff…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广播多路访问链路上的OSPF

通过本实验可以了解: 1、 路由器OSPF的启动过程; 2、 启用路由接口,并通告网络所在路由; 3、 DR选举的控制; 4、 广播多路访问链路的特征; 实验拓扑图: 实验步骤: 配置各个路由器fa0…

最实用DOS命令参数的中文详解

From: http://hi.baidu.com/moodmusic/blog/item/888856ed309605d7b21cb141.html 一、DIR 命令的格式: dir [D:][PATH][NAME][[/A][:attrib]][/o:[sorted][/s][/l][/c[h] (1)dir /a:attrib 缺省包含所有文件(系统文件.隐含文件) attrib[:][h/-h]只显示隐含文件…

React开发(174):ant design按钮确认删除

<Popconfirmtitle"确认删除?"onConfirm{() > {this.handleDelete(row.code);}}><a style{{ marginLeft: 16 }}>删除</a></Popconfirm>

Android:生命周期案例

在学习Android应用生命周期章节中&#xff0c;书本上写的有点笼统&#xff0c;较难理解。为了理解的更深&#xff0c;写了个程序测试一下。 1、在layout文件夹中建一个dialog_layout.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout x…

vim cscope taglist 使用

From: http://blog.csdn.net/skywalkzf/article/details/5009329 一 . 安装 apt-get install exuberant-ctags cscope global cppcomplete 和 taglist 要到www.vim.org的扩展列表中下载 taglist 的下载地址: http://www.vim.org/scripts/script.php?script_id273 cppcom…

java面试没有全部答对_十道java基础面试题,你能保证全答对吗?

java初级开发面试中经常被问到的问题有好多&#xff0c;下面总结一下常见的问题&#xff0c;先给问题&#xff0c;大家思考一下再看答案。1.JDK 和 JRE 有什么区别&#xff1f;2. 和 equals 有什么区别&#xff1f;3.说说final在java中的作用。4.String类的常用方法有哪些&…

VMworld 2010旧金山胜利闭幕

一年一度的VMware的用户大会VMworld 2010上周在旧金山胜利闭幕&#xff0c;今年的VMworld&#xff0c;创造了有一个神奇&#xff0c;超记录的参加人数&#xff08;达到了17000人&#xff09;&#xff0c;超记录的实验数量&#xff08;超过15000个实验&#xff09;&#xff0c;超…

暂时停止更新博客

由于本人最近身体有恙&#xff0c;做了个小手术&#xff0c;暂时卧床休息&#xff0c;不能继续更新博客&#xff0c;还请他人谅解&#xff01;转载于:https://www.cnblogs.com/accordion/p/4458562.html

React开发(175):注意在回调里面重新渲染列表

handleDeleteOne (id, isBatch) > {console.log(id);this.props.dispatch({type: friendHelper/delBatch,payload: {idList: [id.id],},callback: (res) > {if (res.returnCode 0) {message.success(删除成功);this.getAssistList();}},});

vim 分割窗口

From: http://buaadallas.blog.51cto.com/399160/83607 Vim用户手册 - by Bram Moolenaar 译者&#xff1a;Nek_in [url]http://vimcdoc.sf.net[/url] 分割窗口 显示两个不同的文件&#xff1b;或者同时显示一个文件的两个不同地方&#xff1b;又或者并排比较两个文 件。…

scratch的积木相与java的_scratch课堂:积木块详解

scratch作为麻省理工学院推出的少儿编程工具&#xff0c;简单易用&#xff0c;十分好学。scratch不仅仅是将编程以积木的形式进行了表现&#xff0c;更是将程序的内容进行了打包处理&#xff0c;让我们只需要根据字面的意思进行拼接即可实现功能&#xff0c;不过scratch的代码还…

老生常谈–希望别再纠结了朋友

片幅大小与立体感的讨论--群里还有朋友在纠结升级机身FF还是买新24G 在网上的争论很多....各种讲法一堆看完后保证让你吐血不说&#xff0c;越看越迷糊 简单讲...立体感的差异之处在哪边关键就在于景深.... 简单明了我想很多人看完后依然不了一张照片要有立体与层次的感觉基本上…

java打包python到exe文件

最近想把写的python代码打包&#xff0c;以供没用安装python环境的同事使用&#xff0c;需求如下&#xff1a; 无python环境也可执行文件尽量少&#xff0c;不要太乱程序体积尽量小如果需要更新的话重复类库不用更新采用方案如下&#xff1a; 使用py2exe自动导入类库使用7-ZIP压…

React开发(173):ant design设置额外的展开行

expandedRowRender额外的展开行Function(record, index, indent, expanded):ReactNode

fail2ban封IP之Http

环境介绍&#xff1a;http是一个tomcat 的js程序 &#xff0c;设置的路径为/opt/tomcat5/logs/localhost_access_log.txt OS:centos 5.3 fail2ban版本:fail2ban-0.8.2-3.el5.rf.noarch.rpm 官方网站&#xff1a;http://www.fail2ban.org/wiki/index.php/Main_Page 背景&…

[Linux] VIM 代码折叠

From: http://www.cnblogs.com/abeen/archive/2010/08/06/1794197.html VIM 代码折叠 VIM代码折叠方式可以用"foldmethod"选项来设置&#xff0c;如: set foldmethodindent 有6种方式来折叠代码 1. manual //手工定义折叠 2. indent //用缩进表示折叠 3. expr  //…

linux time

time&#xff08;取得目前的时间&#xff09; 相关函数ctime&#xff0c;ftime&#xff0c;gettimeofday 表头文件#include<time.h> 定义函数time_t time(time_t *t); 函数说明此函数会返回从公元1970年1月1日的UTC时间从0时0分0秒算起到现在所经过的秒数。如果t 并非…

java 模拟登陆web系统_关于java模拟登陆WEB的问题。

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.HttpURLConnection;import java.net.URL;import javax.swing.JOptionPane;/** …

React开发(176):导出所有接口供使用

export * from ‘./order’; export * from ‘./wallet’; export * from ‘./walletAccount’; export * from ‘./walletTrade’;

微软Windows Mobile智能手机GPRS上网设置教程(转)

总是不断的有用户咨询GPRS的设置方法。并且由于中国移动的原因&#xff0c;人为的将一个GPRS网搞成了两个接入&#xff1a;CMNET和CMWAP&#xff0c;因此带来的问题更是多多。在昨日一个用户被移动强盗般的扣取了100多元的网络费后促使了这篇文章的加速出炉。之所以推荐新手必看…