现象描述
在Ubuntu 10.04系统中执行以下命令时,观察到明显的性能波动:
dd if=/dev/random bs=1k count=1
测试500次得到的时间统计如下(单位:秒):
Minimum Maximum Average Median
00.002 89.999 4.50402 2.275
问题定位
对比测试发现:
- /dev/null读取稳定在毫秒级
- /dev/urandom表现稳定
- 问题在物理机和VirtualBox虚拟机中均复现
根本原因
/dev/random的设计机制导致:
- 依赖系统熵池,当熵不足时会阻塞
- Linux内核的熵收集机制在虚拟机环境中效率较低
- Ubuntu 10.04使用的2.6.32内核熵管理较保守
解决方案
临时解决方案
使用urandom替代(适合非加密场景):
dd if=/dev/urandom bs=1k count=1
永久优化方案
1. 安装haveged服务增加熵源:
sudo apt-get install haveged
sudo service haveged start
2. 内核参数调整(需root权限):
echo 1024 > /proc/sys/kernel/random/read_wakeup_threshold
监控脚本示例
以下脚本可实时监控熵池状态:
#!/bin/bash
while true; do
entropy=$(cat /proc/sys/kernel/random/entropy_avail)
poolsize=$(cat /proc/sys/kernel/random/poolsize)
printf "熵池: %d/%d (%.1f%%)\n" $entropy $poolsize $(echo "$entropy/$poolsize*100" | bc -l)
sleep 1
done
进阶测试
改进后的基准测试方法:
for i in {1..100}; do
{ time dd if=/dev/random bs=1k count=1 2>/dev/null; } 2>&1 | \
awk '/real/ {print $2}' | \
sed 's/m//;s/s//'
done | sort -n | \
awk 'NR==1 {min=$1} NR==50 {median=$1} NR==100 {max=$1} {sum+=$1} END {print "Min:",min,"Max:",max,"Avg:",sum/100,"Median:",median}'
注意事项
- 生产环境加密操作建议使用专用硬件熵源
- 虚拟机环境建议安装virtio-rng设备
- 关键系统不建议完全禁用random的阻塞特性