为什么在我的(低端笔记本电脑)系统上生成1 KiB文件需要5分钟而且负载很小?我怎样才能更快地生成随机二进制文件?
$ time dd if=/dev/random of=random-file bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 303.266 s, 0.0 kB/s
real 5m3.282s
user 0m0.000s
sys 0m0.004s
$
请注意dd if=/dev/random of=random-file bs=1024 count=1
不起作用。它生成一个随机长度的随机二进制文件,大多数运行在50 B以下。有没有人对此有解释?
答案 0 :(得分:27)
这是因为在大多数系统上/dev/random
使用来自环境的随机数据,例如来自外围设备的静态数据。它使用的真正随机数据(熵)池非常有限。在有更多数据可用之前,输出块。
使用/dev/urandom
重试您的测试(请注意u
),您会看到显着的加速。
有关详细信息,请参阅Wikipedia。 /dev/random
并不总是输出真正随机的数据,但显然在您的系统上输出。
/dev/urandom
的示例:
$ time dd if=/dev/urandom of=/dev/null bs=1 count=1024
1024+0 records in
1024+0 records out
1024 bytes (1.0 kB) copied, 0.00675739 s, 152 kB/s
real 0m0.011s
user 0m0.000s
sys 0m0.012s
答案 1 :(得分:12)
请尝试/dev/urandom
:
$ time dd if=/dev/urandom of=random-file bs=1 count=1024
来自:http://stupefydeveloper.blogspot.com/2007/12/random-vs-urandom.html
random和urandom之间的主要区别在于它们如何从内核中提取随机数据。随机总是从熵池中获取数据。如果池为空,则随机将阻止操作,直到池充满。在内核熵池为空的情况下,urandom将使用SHA(或任何其他算法,有时是MD5)算法来生成数据。 urandom永远不会阻止操作。
答案 2 :(得分:3)
我写了一个脚本来测试各种哈希函数的速度。为此,我想要“随机”数据的文件,我不想两次使用相同的文件,因此没有一个函数具有内核缓存优势。我发现/ dev / random和/ dev / urandom都很慢。我选择使用dd从随机偏移开始复制我的硬盘数据。如果你正在做与安全有关的任何事情,我绝不会建议使用它,但如果你需要的只是噪音,你得到它的地方并不重要。在Mac上使用/ dev / disk0在Linux上使用/ dev / sda
以下是完整的测试脚本:
tests=3
kilobytes=102400
commands=(md5 shasum)
count=0
test_num=0
time_file=/tmp/time.out
file_base=/tmp/rand
while [[ test_num -lt tests ]]; do
((test_num++))
for cmd in "${commands[@]}"; do
((count++))
file=$file_base$count
touch $file
# slowest
#/usr/bin/time dd if=/dev/random of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file
# slow
#/usr/bin/time dd if=/dev/urandom of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file
# less slow
/usr/bin/time sudo dd if=/dev/disk0 skip=$(($RANDOM*4096)) of=$file bs=1024 count=$kilobytes >/dev/null 2>$time_file
echo "dd took $(tail -n1 $time_file | awk '{print $1}') seconds"
echo -n "$(printf "%7s" $cmd)ing $file: "
/usr/bin/time $cmd $file >/dev/null
rm $file
done
done
这是“较慢的”/ dev / disk0结果:
dd took 6.49 seconds
md5ing /tmp/rand1: 0.45 real 0.29 user 0.15 sys
dd took 7.42 seconds
shasuming /tmp/rand2: 0.93 real 0.48 user 0.10 sys
dd took 6.82 seconds
md5ing /tmp/rand3: 0.45 real 0.29 user 0.15 sys
dd took 7.05 seconds
shasuming /tmp/rand4: 0.93 real 0.48 user 0.10 sys
dd took 6.53 seconds
md5ing /tmp/rand5: 0.45 real 0.29 user 0.15 sys
dd took 7.70 seconds
shasuming /tmp/rand6: 0.92 real 0.49 user 0.10 sys
以下是“慢”/ dev / urandom结果:
dd took 12.80 seconds
md5ing /tmp/rand1: 0.45 real 0.29 user 0.15 sys
dd took 13.00 seconds
shasuming /tmp/rand2: 0.58 real 0.48 user 0.09 sys
dd took 12.86 seconds
md5ing /tmp/rand3: 0.45 real 0.29 user 0.15 sys
dd took 13.18 seconds
shasuming /tmp/rand4: 0.59 real 0.48 user 0.10 sys
dd took 12.87 seconds
md5ing /tmp/rand5: 0.45 real 0.29 user 0.15 sys
dd took 13.47 seconds
shasuming /tmp/rand6: 0.58 real 0.48 user 0.09 sys
以下是“最慢的”/ dev / random结果:
dd took 13.07 seconds
md5ing /tmp/rand1: 0.47 real 0.29 user 0.15 sys
dd took 13.03 seconds
shasuming /tmp/rand2: 0.70 real 0.49 user 0.10 sys
dd took 13.12 seconds
md5ing /tmp/rand3: 0.47 real 0.29 user 0.15 sys
dd took 13.19 seconds
shasuming /tmp/rand4: 0.59 real 0.48 user 0.10 sys
dd took 12.96 seconds
md5ing /tmp/rand5: 0.45 real 0.29 user 0.15 sys
dd took 12.84 seconds
shasuming /tmp/rand6: 0.59 real 0.48 user 0.09 sys
您会注意到/ dev / random和/ dev / urandom的速度差别不大。但是,/ dev / disk0占用了1/2的时间。
PS。为了“简洁”,我减少了测试次数并删除了除2个命令之外的所有命令(并不是说我成功了)。
答案 3 :(得分:2)
旧线程,但像Tobbe提到的那样,我需要这样的东西才更好(更快)。
所以...这样做的shell方式相同,比随机/随机更快,在创建非常大的文件时非常有用,我承认不是完全随机的,但可能足够接近,取决于你的需求。
dd if=/dev/mem of=test1G.bin bs=1M count=1024
touch test100G.bin
seq 1 100 | xargs -Inone cat test1G.bin >> test100G.bin
这将从你的ram的内容创建一个100Gb文件(第一个1GB,我假设你有这么多ram :)) 请注意,共享此文件也可能不安全,因为它可能包含各种敏感数据,例如您的密码,因此仅将其用于您自己的原因:)哦,您需要以root身份运行它,原因相同。< / p>
答案 4 :(得分:0)
旧线程,但我只需要相同的东西。老朋友C来救援,因为我不想乱用脚本。这是我的解决方案,对我来说很好,也很快:
// usage: ./program <outfile> <size-in-bytes>
#include <stdio.h>
void main(int argc, char** argv){
long long i, s;
FILE* f = fopen(*(argv+1), "w");
srand(time(NULL));
sscanf(*(argv+2), "%lld", &s);
for(i=0;i<s;i++){
fputc(rand()%255,f);
}
fclose(f);
}