[linux][kernel]dev random生成随机数慢的问题

前言: 一般生成随机数,可以用glibc提供的random()函数,不过这个是伪随机的函数,所以一般会在使用使用random函数之前初始化种子:srandom(time()),或者使用srandom(getpid())。但是,两次使用的种子相同的情况下,会得到相同的随机数!简单做一个实验,使用同一个seed,两次生成100个随机数,它们是相同的数列!原因也很简单,通过相同的算法做hash或者移位或者加减,必然会得到同样的结果。 所以,/dev/random出现了。用来生成随机数,避免生成相同的数列的随机数!但是在使用dev random的时候,可能会遇到生成随机数非常慢的情况,如果只是为了解决问题,直接到第四步,如果希望看一下原理,可以选择从头开始看。 分析: 1,dev random block 一个小实验,期待生成很多的随机数,使用shell命令:cat /dev/random > out。 然而,情况并非如此,很长的时间,只生成了几个byte的数据。查一下原因:

居然sleep了。。 2,stack 继续分析,查看stack:

很显然,不是cat进程自己主动调用了sleep或者yield,而是因为调用read读取的时候,被block住了。 3,random_read_wait 有了地址,就好说了。使用命令:addr2line -e vmlinux -a 0xffffffff81513767来看看问题出在了哪里: 在linux-4.0.4/drivers/char/random.c中:

好吧,需要被唤醒。所以找到wake_up_interruptible(&random_read_wait);这个函数在哪里调用的,就可以知道怎么可以触发被唤醒了。 4,haveged 在google的时候,很可能会提示安装haveged这个包。 对于ubuntu:apt-get install haveged 对于centos:yum install -y haveged 安装上了haveged包,果然可以快速生成大量的随机数了。 下载haveged的源代码包:http://www.issihosts.com/haveged/haveged-1.9.1.tar.gz

可见,haveged使用死循环调用ioctl。找到对应的kernel代码,发现在RNDADDENTROPY的时候,会唤醒 random_read_wait,进一步唤醒通过/dev/random获取随机数的进程。 那么整个过程就分析完了。 后记: 对于解决dev random生成速度慢的问题,只用看4步骤就行了。 Good Luck~

原文发布于微信公众号 - AlwaysGeek(gh_d0972b1eeb60)

原文发表时间:2017-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

十图详解TensorFlow数据读取机制(附代码)

作者 | 何之源 在学习TensorFlow的过程中,有很多小伙伴反映读取数据这一块很难理解。确实这一块官方的教程比较简略,网上也找不到什么合适的学习材料。今天...

409110
来自专栏性能与架构

分方式缓存常用的一致性hash是什么原理

一致性hash是用来解决什么问题的? 先看一个场景 有n个cache服务器,一个对象object映射到哪个cache上呢? 可以采用通用方法计算objec...

38490
来自专栏云计算教程系列

如何在Ubuntu 14.04第1部分上查询Prometheus

Prometheus是一个开源监控系统和时间序列数据库。Prometheus最重要的一个方面是它的多维数据模型以及随附的查询语言。此查询语言允许您对维度数据进行...

13200
来自专栏烂笔头

Python检查xpath和csspath表达式是否合法

目录[-] 在做一个可视化配置爬虫项目时,需要配置爬虫的用户自己输入xpath和csspath路径以提取数据或做浏览器操作。考虑到用户的有时会输入错误的x...

36790
来自专栏生信宝典

Rfam 12.0+本地使用 (最新版教程)

Rfam是用来鉴定non-coding RNAs的数据库,常用于注释新的核酸序列或者基因组序列。 最新版本的Rfam (12.2),包含2588个RNA家族,其...

32650
来自专栏人工智能LeadAI

在TensorFlow中使用pipeline加载数据

前面对TensorFlow的多线程做了测试,接下来就利用多线程和Queue pipeline地加载数据。数据流如下图所示: ? 首先,A、B、C三个文件通过Ra...

45830
来自专栏梦里茶室

TensorFlow深度学习笔记 Tensorboard入门

Github工程地址:https://github.com/ahangchen/GDLnotes 官方教程:https://www.tensorflow.org...

22080
来自专栏AI深度学习求索

如何利用多张图片生成一张会自己动的gif图片?

看一下比较形象的卷积神经网络原理的图片和卷积操作原理的图片,显然,gif图片十分生动形象。然我们看一下如何自己制作gif图片吧,学会了可以自己制作表情包哦~

54030
来自专栏PaddlePaddle

PaddlePaddle发布v0.10.0版

我们非常高兴发布了PaddlePaddle V0.10.0版,并开放了新的Python API。 之前在v0.9.0版,完成一个训练或预测任务至少需要两份pyt...

38370
来自专栏ytkah

如何让dedecms文章点击量增加一定的数值

  用dedecms建站都知道有一个文章点击量这个参数,我们可不可以用这个浏览量做些延伸扩展呢?比如加上一个固定值变成另外一个指标。很多朋友已经想到了,如下图,...

92960

扫码关注云+社区

领取腾讯云代金券