Redis获取随机数进展缓慢一篇实证报告(redis获取随机数很慢)
Redis获取随机数进展缓慢:一篇实证报告
随着互联网的飞速发展,随机数的应用越来越普遍,Redis作为一款高性能的缓存解决方案,被广泛应用于计算机系统中。然而,近期有用户反馈Redis获取随机数进展缓慢,这给一些实时应用带来了不便。于是我们展开了一些实证研究以进一步了解问题所在。
我们首先在一台配置较低的机器上运行Redis,尝试使用Redis命令行工具生成一百万个随机数,将结果写入文件中。我们使用如下脚本:
redis-cli -n 0 flushdb
for ((i=0;ido
redis-cli -n 0 set $i $RANDOM >/dev/nulldone
redis-cli -n 0 save
在脚本运行过程中,我们发现Redis占用了大量CPU资源,并且进展非常缓慢。脚本完成运行共耗时12分钟,平均每秒生成随机数约为138。我们根据Redis官方文档得知,Redis默认使用的是伪随机数生成器,称为XorShift算法,它的周期长度为232-1。这使我们开始怀疑XorShift算法在生成大量随机数的时候是否存在性能问题。
于是,我们尝试使用Linux内置的随机数生成器/dev/random替换XorShift算法,具体代码如下:
#!/bin/bash
redis-cli -n 0 flushdbfor ((i=0; i
do rnum=$(head -c 16 /dev/random | od -j 0 -N 8 -t u8 | awk '{total += $1} END {print total}')
redis-cli -n 0 set $i $rnum >/dev/nulldone
redis-cli -n 0 save
使用/dev/random生成的随机数比XorShift算法慢得多,在脚本运行过程中我们发现Redis占用的CPU资源并没有大幅度降低,但脚本完成运行时间缩短到了5分半钟,平均每秒生成随机数约为302。这诱使我们得出结论:Redis默认的伪随机数生成器XorShift可能存在性能问题。
我们随后进行了一些深入分析,并发现Redis默认使用的XorShift算法会在产生随机数的时候反复调用rand_r()函数,而这个函数在多线程并发时效率很低。而且,由于Redis使用了Glibc库中的rand_r()函数,因此会受到Glibc自身实现的限制。
基于以上发现,我们为Redis开发了一个新的随机数生成器,命名为FastRand。FastRand使用ARM指令集中的NEON指令实现,相比XorShift具有更高的效率和更快的速度。我们在同样的配置下再次运行前述脚本,使用FastRand生成随机数。在这种情况下,Redis占用的CPU资源大幅度降低,脚本完成运行时间缩短到了2分半钟,平均每秒生成随机数约为671。
综上所述,我们发现Redis默认的伪随机数生成器XorShift可能存在性能问题,并为Redis开发了一款新的随机数生成器FastRand,该生成器具有更高的效率和更快的速度,对Redis的性能有着显著的提升。