Java UUID生成的性能影响 – fastthread


Java 开发人员倾向于使用“java.util.UUIDrandomUUID()” API 来生成 UUID(通用唯一标识符)编号(即“b8bbcbed-ca07-490c-8711-5118ee0af2f9”)。在某些情况下,使用此 API 可能会影响您的应用程序的可用性。让我们在这篇文章中用一个真实的例子来讨论这个 API。

java.util.UUIDrandomUUID() API是如何工作的?
java.util.UUIDrandomUUID() API内部使用操作系统中的 en[url=https://en.wikipedia.org/wiki/Entropy_(computing)]tropy[/url]来生成一个唯一的数字。
‘entropy’是什么意思?
Linux内核使用某些技术,如用户的鼠标动作、硬件风扇噪音的变化、设备驱动程序噪音的变化......来产生随机数。
当操作系统中缺乏 ‘entropy’时,随机数的生成就会变慢。当速度减慢时,调用'java.util.UUIDrandomUUID()'API调用的应用程序线程将被置于BLOCKED状态,它们将无法进一步发展。

如果你的应用程序在一个关键的代码路径中使用'java.util.UUIDrandomUUID()'API,而操作系统中缺乏‘entropy’,那么多个线程就会进入这个BLOCKED状态,使你的整个应用程序陷入停顿。

在Linux中检查entropy的状态
要检查Linux中entropy的可用性,请执行以下命令。

cat /proc/sys/kernel/random/entropy_avail

如果你看到这个值小于1000,那么它表明entropy的缺乏。这可能导致应用程序中的线程被封锁。


潜在的解决方案
如果您的应用程序中出现此问题,以下是解决这些问题的潜在解决方案:
1. RHEL 
此问题已在 RHEL 7 及以上版本中得到解决。如果您可以升级到 RHEL 7 或更高版本,请这样做。 
如果您在旧版本的 RHEL 上运行,则可以按照此处给出的建议来解决此问题


2. 在 Linux 中安装 Haveged
如果您的应用程序在 Linux 中运行,那么您可以考虑安装 'haveged' 库。“ haveged 项目”旨在提供一个基于HAVEGE 算法改编的易于使用、不可预测的随机数生成器。这是“已处理”项目GIT 存储库页面。以下是如何安装它:
在基于 Debian 的平台(Debian、Ubuntu)上:

sudo apt-get install rng-tools sudo update-rc.d haveged defaults

在 Redhat 平台(RHEL、Fedora、CentOS)上:
sudo yum install rng-tools sudo chkconfig haveged on


3. 使用 /dev/urandom 代替 /dev/random
类 Unix 操作系统提供了特殊文件“/dev/random”,用作伪随机数生成器。Java 使用这个文件来生成随机数。您可以将其配置为使用“/dev/urandom”而不是“/dev/random”。 
'/dev/urandom' 是另一个能够生成随机数的特殊文件。但是,由于随机性较小,它具有降低安全性的缺点。您可以通过在启动期间将以下 JVM 参数传递给您的应用程序来实现它:

-Djava.security.egd=file:/dev/./urandom