### 认识rngd(熵服务)
> 在阿里云的tomcat下部署了一个Java服务,启动正常但是访问速度巨慢,刚开始还以为是webapps下有其他项目的原因,删除后就剩一个项目访问也是巨慢,看日志项目中SQL处理都是毫秒级。随Google了一下,最终调节了rngd(熵服务)大小,访问速度有了巨大提高。
从维基百科和[智库]([https://wiki.mbalib.com/wiki/%E9%A6%96%E9%A1%B5](https://wiki.mbalib.com/wiki/首页),得知信息熵和随机数:
#### 信息熵
什么是熵?在物理学中,熵(entropy)是一个描述系统混乱程度的物理量,熵越大说明系统越无序、越混乱,不确定性越大。简单来说就是表示系统中混乱(无序)的程度。
那么什么是信息熵?信息熵是描述信息的复杂程度,信息克服了多大的不确定性。**信息熵**是一个数学上颇为抽象的概念,在这里不妨把信息熵理解成某种特定信息的出现概率(离散随机事件的出现概率)。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。信息熵也可以说是系统有序化程度的一个度量
#### 随机数
在Linux内核中采用熵来描述数据的随机性。为了能产生足够高效随机数,Linux系统维护了一个专门用于收集噪声的熵池(entropy pool),熵池的信息来自外界的熵信息 如:设备驱动的噪音,鼠标点击的声音,设备风扇运作的噪音。将这些噪声收集起来被用于产生真正的随机数。如果熵池中没有足够的噪音资源,就需要等待熵池的收集。只要设备的物理混乱程度越大,熵增就越快,熵池的信息越饱和,随机性的效率就越高。
在测试机(CentOS7.6)中,/dev/random 是 Linux/Unix 操作系统中的一个设备文件,用来作为随机数发生器/伪随机数发生器。它允许程序访问来自设备驱动程序或其它来源的背景噪声,Linux是第一个以背景噪声产生真正的随机数的实现。这种设计使得/dev/random是真正的随机数发生器,提供了最大可能的随机数据熵。因为它是真正以熵池的背景噪音为种子产生随机数,所以在调用时可能会有堵塞,需要等待熵池有足够多的熵信息。
通过命令查看熵池大小:
> 一般如果服务器访问的速度很慢,这个服务器熵池的值也会很小;
```shell
cat /proc/sys/kernel/random/entropy_avail
```
发现熵池大小都是在30左右浮动,这样势必会导致tomcat从`/dev/random`读取随机数时产生了阻塞。通过这样的特点,一些攻击也可以通过这些来实现,不断的使用需要读取随机数的地方消耗系统的熵池,造成系统的阻塞。虽然说在Linux中使用`/dev/urandom`伪随机数生成设备也能在熵池较小的情况下完成随机数的生成,但是并没有使用`/dev/random`真随机数安全。
#### 优化熵池
##### 安装rngd(熵服务)
> 在CentOS6.5下
```shell
yum install rng-tools
```
##### 使服务自启动
```shell
systemctl enable rngd.service
```
##### 启动服务
```shell
systemctl start rngd.service
```
##### 编辑配置
```shell
cp /usr/lib/systemd/system/rngd.service /etc/systemd/system
vim /etc/systemd/system/rngd.service
#将ExecStart=/sbin/rngd -f 为ExecStart=/sbin/rngd -f -r /dev/urandom
```
##### 重载服务
```shell
systemctl daemon-reload
systemctl restart rngd.service
```
##### 重新查看熵池
```shell
cat /proc/sys/kernel/random/entropy_avail
```
#### 总结
修改熵服务参数后,现在熵池大小在3000上下,访问速度和启动速度都有很大程度提高。

认识rngd(熵服务)