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

简介: Linux系统设备/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

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

_2017_07_17_12_04

造成这种差异的原因在于,/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程序确认是否问题解决。
相关文章
|
5月前
|
移动开发 监控 小程序
java家政平台源码,家政上门清洁系统源码,数据多端互通,可直接搭建使用
一款基于Java+SpringBoot+Vue+UniApp开发的家政上门系统,支持小程序、APP、H5、公众号多端互通。涵盖用户端、技工端与管理后台,支持多城市、服务分类、在线预约、微信支付、抢单派单、技能认证、钱包提现等功能,源码开源,可直接部署使用。
401 24
|
5月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
466 8
|
5月前
|
安全 前端开发 Java
使用Java编写UDP协议的简易群聊系统
通过这个基础框架,你可以进一步增加更多的功能,例如用户认证、消息格式化、更复杂的客户端界面等,来丰富你的群聊系统。
241 11
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
Java与生成式AI:构建内容生成与创意辅助系统
生成式AI正在重塑内容创作、软件开发和创意设计的方式。本文深入探讨如何在Java生态中构建支持文本、图像、代码等多种生成任务的创意辅助系统。我们将完整展示集成大型生成模型(如GPT、Stable Diffusion)、处理生成任务队列、优化生成结果以及构建企业级生成式AI应用的全流程,为Java开发者提供构建下一代创意辅助系统的完整技术方案。
324 10
|
5月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
739 4
|
6月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
723 1
二、Linux文本处理与文件操作核心命令
|
6月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
430 137
|
6月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
1093 58
|
5月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
1013 2