Den Hardware-Zahlengenerator hatte ich bis jetzt noch nie getestet. Hab ihn dann mal eingerichtet, um ihn zu testen.
Testergebnisse:
QuoteDisplay Morecnc@cnc:~ $ python speedtest.py
Model : Raspberry Pi Zero W Rev 1.1
Total read size: 1 MiB
Testing: /dev/random -> 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
Testing: /dev/urandom -> 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768
Testing: /dev/hwrng -> 1 2 4 8 16 32 64 128 256
/dev/random:
128 KiB 24.7 MiB/s
8 MiB 24.4 MiB/s
32 MiB 24.4 MiB/s
16 MiB 24.3 MiB/s
4 MiB 24.3 MiB/s
256 KiB 24.3 MiB/s
64 KiB 24.2 MiB/s
32 KiB 24.0 MiB/s
2 MiB 24.0 MiB/s
1 MiB 23.5 MiB/s
512 KiB 23.4 MiB/s
16 KiB 23.2 MiB/s
8 KiB 21.8 MiB/s
4 KiB 19.2 MiB/s
2 KiB 17.5 MiB/s
1 KiB 16.4 MiB/s
/dev/urandom:
256 KiB 24.9 MiB/s
128 KiB 24.6 MiB/s
64 KiB 24.5 MiB/s
32 MiB 24.4 MiB/s
8 MiB 24.3 MiB/s
16 MiB 24.3 MiB/s
4 MiB 24.2 MiB/s
32 KiB 24.2 MiB/s
2 MiB 24.0 MiB/s
1 MiB 23.5 MiB/s
512 KiB 23.5 MiB/s
16 KiB 23.4 MiB/s
8 KiB 21.8 MiB/s
4 KiB 19.4 MiB/s
2 KiB 17.4 MiB/s
1 KiB 15.8 MiB/s
/dev/hwrng:
64 KiB 115.7 KiB/s
2 KiB 115.6 KiB/s
256 KiB 115.6 KiB/s
128 KiB 115.5 KiB/s
8 KiB 115.4 KiB/s
16 KiB 115.4 KiB/s
4 KiB 115.2 KiB/s
32 KiB 115.1 KiB/s
1 KiB 114.7 KiB/s
Testcode:
import time
def get_model():
with open("/proc/cpuinfo") as fd:
for line in fd:
if line.startswith("Model"):
return line.strip()
def prefix(value, unit):
for prefix in ("", "Ki", "Mi", "Gi", "Ti", "Pi"):
if value < 1024:
break
value /= 1024
return (
f"{value:.0f} {prefix}{unit}"
if value.is_integer()
else f"{value:.1f} {prefix}{unit}"
)
def random_speed(blocksizes_kb, total):
retval = {}
print(f"Total read size: {prefix(total, 'B')}")
for random_dev in ("/dev/random", "/dev/urandom", "/dev/hwrng"):
print(f"Testing: {random_dev} ->", end=" ", flush=True)
results = []
for blocksize in blocksizes_kb:
if random_dev == "/dev/hwrng" and blocksize > 256:
break
print(blocksize, end=" ", flush=True)
blocksize *= 1024
received = 0
start = time.monotonic()
with open(random_dev, "rb") as fd:
while received < total:
received += len(fd.read(blocksize))
results.append((blocksize, received / (time.monotonic() - start)))
results = dict(sorted(results, key=lambda e: e[1], reverse=True))
results = {
prefix(blocksize, unit="B"): prefix(speed, unit="B/s")
for blocksize, speed in results.items()
}
retval[random_dev] = results
print()
return retval
print(get_model())
size_mib = 1
results = random_speed([2**x for x in range(16)], size_mib * 1024 ** 2)
for path in results:
print(f"{path}:")
for blocksize, speed in results[path].items():
print(f"{blocksize:<20}{speed}")
print()
Display More
/dev/random sollte blockieren, wenn die Entropie ausgeht.
/dev/urandom blockiert nicht, wenn die Entropie ausgeht.
/dev/hwrng blockiert, wenn die Entropie ausgeht und ist auch nur eine Entropie-Quelle, weswegen die Geschwindigkeit viel geringer ist.
random und urandom bekommen den Zufall aus mehreren Quellen.