Linux系统小技巧(1):/dev/random设备可能导致java程序启动慢或者操作耗时不正常

致因

Linux系统上的设备/dev/random和/dev/urandom是不同的。这点可以使用下面的命令测试出来(执行会耗费几分钟时间,请有心理准备)

for dev in /dev/random /dev/urandom;do
  echo "test ${dev}: "
  time dd if=${dev} bs=512 count=1 > /dev/null 2>&1
  time dd if=${dev} bs=512 count=1 > /dev/null 2>&1
done

比如,如下是上面命令的一个输出结果

造成这种差异的原因在于,/dev/random设备提供的不是伪随机数据,而是基于环境中的真实随机因素(即背景噪声作为熵源)的随机数据。所以,/dev/random不像设备/dev/urandom。后者是一个伪随机数据生成器,能按照请求快速生成所需数量的数据。/dev/random能生成多少内容由环境中的噪声决定。数据不足时,/dev/random只能等待。

所以,在内容不足时,/dev/random会将读操作阻塞,直至收集到足够的随机数据。这就是测试结果差异产生的原因,/dev/random阻塞第二次的读操作将近1分钟时间。

所以,对于使用了/dev/random设备的而言,都有被阻塞的可能。被阻塞时,上层应用可能表现为启动慢或者执行耗时不正常。因为/dev/random行为与环境背景有关,行为随机。所以也导致上层应用因之引发的问题表现随机,不易排查。

比如,在Java社区,/dev/random设备引致的问题早在jdk-1.4版本时就已经有bug报告。但是还是有客户不知道类似问题的致因和解决方案

解决方案简单说,就是除非有明确的理由,必须要使用/dev/random设备。否则,使用/dev/urandom设备即可。

对于jdk而言,需要的是把配置文件中$JAVA_HOME/jre/lib/security/java.security中的

securerandom.source=file:/dev/random

改为

securerandom.source=file:/dev/urandom

排查建议

对于Java程序启动慢,或者进程耗时不正常,请优先排查是不是/dev/random的问题。步骤如下

  1. 确认是不是使用的是设备/dev/random。这只要检查$JAVA_HOME/jre/lib/security/java.security对应的配置就好。
  2. 如果是,则变更配置。
  3. 重启Java程序确认是否问题解决。
时间: 2024-05-26 10:08:47

Linux系统小技巧(1):/dev/random设备可能导致java程序启动慢或者操作耗时不正常的相关文章

Linux问题情报分享(1):内核Stack Clash补丁导致Java程序启动失败

关于Stack Clash,缺少耐心的读者,请参考Stack Clash 漏洞正粉碎 Linux 防御危及 root 权限,较全面的介绍请参考Stack Guard Page Circumvention Affecting Multiple Packages. 各个Linux发行版都已经发布了升级,合并了上游补丁. 上游补丁通过增大stack guard gap(堆栈保护措施,更多请参考Buffer overflow protection)尺寸到1M的方式,修复了Linux Kernel Sta

Linux系统小技巧(2):利用ps工具统计CPU消耗高的进程和统计消耗CPU或者内存的百分比

CPU消耗高往往是系统异常的一种表现.因为平常检查系统运行有哪些进程,都是使用ps工具.因此,出现这种情况时,如果能够通过ps工具搜寻出CPU消耗高的线程,则对进一步搜寻线索或者排查应该有帮助. 下面我们讨论两个相关的小技巧. 首先,我们得了解一下进程的概念.我们都很熟悉进程了,那么,线程是什么呢?引用Andrew S. Tanenbaum的话,就是 进程认为自己独占一台主机:线程认为自己独占一颗CPU. 所以,一个进程可能包含多个线程.但是考察CPU消耗问题,只考虑进程而不考虑线程是不够的.就

Linux系统小技巧(6):刀锋组合-strace和wireshark工具

首先声明下,此处wireshark,可以替换为tcpdump.同样,strace偶尔也可以替换为ltrace,只要熟悉库函数就好. wireshark和strace,对于黑客而言,都是工具箱中的必备工具.有过排查和诊断经历的工程师,谁没有抓包和分析包的经历呢? 相对而言,strace的名气要小一些,毕竟有意愿.有能力追踪并且能够分析进程执行路径的不多.而且常见的系统调用也有二三十个. 系统调用如此强力,why? 让我们先明确下为什么strace工具颇具威力,看图 虽然Linux已经足够复杂,而且

Linux系统小技巧(5):如何列出和排序正在读写的进程?

哪些进程这在对写?试试iotop.但是有时候并不方便安装部署iotop,而且iotop的输出也容易进一步分析处理. 那么,有没有其他方式方便做到这一点呢?有.在说出答案前,我们先看看一个实际/proc/<pid>/io文件的内容 rchar: 951610978 wchar: 1180044763 syscr: 133011 syscw: 120643 read_bytes: 77246464 write_bytes: 735604736 cancelled_write_bytes: 9830

Linux系统小技巧(4):环境变量JAVA_TOOL_OPTIONS简介

有关此环境变量的官方文档在此,本不用再饶舌,但是似乎不少人不知道这个变量及其文档.为传播计,还是记录一下. 首先,这个变量名字里虽然又"TOOL"字眼,但是,其角色却是"JAVA_OPTIONS".只不过因缘巧合,名不符实罢了. 平时见惯了有冲击力的java命令行.比如,这样的 当然,良好实践也是必不可少的,比如,Java VM Options You Should Always Use in Production. 但是,偶尔还是会有这样的情况,正如上面官方文档提

一些 Linux 桌面小技巧

我已经写过 Linux 提示和技巧 系列的一篇文章.写这篇文章的目的是让你知道这些小技巧可以有效地管理你的系统/服务器. 在Linux中创建 Cdrom ISO 镜像和监控用户 在这篇文章中,我们将看到如何使用 CD/DVD 驱动器中载入的碟片来创建 ISO 镜像:打开随机手册页学习:看到登录用户的详细情况和查看浏览器内存使用量,而所有这些完全使用本地工具/命令,无需任何第三方应用程序/组件.让我们开始吧-- 用 CD 碟片创建 ISO 映像 我们经常需要备份/复制 CD/DVD 的内容.如果你

老司机浅谈linux系统学习技巧

Linux 起源于 20 世纪 70 年代,是一种优秀的操作系统系统.初次接触到 linux 这个系统是在大学期间,这样才发现除了 windows 外的另外一个有趣系统.开始抱着好奇的心态去了解,随着深入学习,笔者被它独有的魅力所吸引.即使它的可视化窗口操作模式并不如 Windows 操作系统那样完美,可是它的可维护性.操作系统低占用率.可扩展性却让它在服务器操作系统方面已经成为资深服务器工程师的首选的操作工具. 笔者刚开始学习 linux 的时候,也不是一帆风顺的,下面笔者就开始分享这两年多的

12条实用 Windows 7系统小技巧

以下是从网上收集的12条实用 Windows7 小技巧,其实Win7的快捷键组合功能有很多,咱只学最最实用的.如果你也有同样的小技巧,就拿出来大家一起分享吧-- 一.Windows键 + 空格键"Space" [作用]:透明化所有窗口,快速查看桌面(并不切换) [快捷键]:win+空格 [小结]:当你打开了很多程序窗口的时候,这招非常有用,而且桌面还会有华丽的光影效果哦.没用过的赶紧试试先 二.Windows键 + D [作用]:最小化所有窗口,并切换到桌面,再次按又重新打开刚才的所有

php获取网卡的MAC地址支持WIN/LINUX系统_php技巧

复制代码 代码如下: <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetMacAddr{ var $return_array = array(); // 返回带有MAC地址的字串数组 var $mac_addr; function GetMacAddr($os_type){ switch ( strtolower($os_type) ){ case "linux": $this->for