rngd随机数性能问题的解决办法
【问题描述】
某产品应用模块在ARM平台上测试时,应用处理业务性能处理表现变差了一些,后台环境上也发现rngd服务进程占用较高,高峰时甚至达到单CPU 100%。
【原因分析】
该模块业务代码运行中大量使用了随机数(调用/dev/random获取),会消耗系统随机数熵池。
/dev/random产生随机数的原理是利用当前系统的熵池(random pool)来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。如果随机池数据太少,则调用/dev/random会阻塞,等待随机池数据被填充。
而rngd系统服务的作用是负责动态补充该熵池资源,从测试环境问题情况来看,很有可能由于业务对随机数大量获取,导致rngd服务过载,性能成为瓶颈,从而反过来拖慢了业务的运行。
【rngd对比测试】
(1)X86下测试rngd随机数性能,1000个随机数,耗时15秒:
(2)ARM下测试rngd随机数性能,1000个随机数,耗时36秒:
可以看到,在使用rngd服务补充熵池情况下,随机数产生的速度并不快,同时在ARM平台上比X86表现更差一些。因此rngd自身性能不足(高占用CPU),是此问题的主要原因。
【解决方法】
改用haveged服务来替代rngd,haveged有更好的性能(并低占用CPU)。
1、停用rngd
systemctl stop rngd
systemctl disable rngd
2、下载安装haveged
wget https://download-ib01.fedoraproject.org/pub/epel/7/aarch64/Packages/h/haveged-1.9.1-1.el7.aarch64.rpm
rpm -ivh haveged-1.9.1-1.el7.aarch64.rpm
3、启用haveged
systemctl enable haveged
systemctl start haveged
再次测试随机数的产生,耗时大大的缩短:
随机数的获取加快,业务处理的性能也达到了预期,问题解决。
附-【关于随机数性能-滴池检查】
1、查看系统熵池的容量:cat /proc/sys/kernel/random/poolsize // 默认4096
2、查看从熵池中读取熵的阀值:cat /proc/sys/kernel/random/read_wakeup_threshold
3、查看当前系统熵池中拥有的熵数: cat /proc/sys/kernel/random/entropy_avail (当entropy_avail中的值少于read_wakeup_threshold阀值,这时读取/dev/random会被阻塞)