sinnfrei und doch interessant
Dedup mit /dev/random
https://blogs.oracle.com/scottdickson/entry/sillyt_zfs_dedup_experiment
Jetzt weiß ich wie das funktioniert.
Weitere Tests:
Code:
# zpool create test als Datenquelle
#
zpool create -O sync=disabled -O atime=off test c0t5000C50041AC279Fd0 c0t5000C50041AC31C3d0 c0t5000C50041AC3D77d0 c0t5000C50041AC1C0Bd0 c0t5000C50041AC1A5Fd0 c0t5000C50041AC0F3Bd0
# 8 Dateien die jeweils als 1 Block gespeichert werden können
#
dd if=/dev/random bs=1024 count=128 of=/test/b1
dd if=/dev/random bs=1024 count=128 of=/test/b2
dd if=/dev/random bs=1024 count=128 of=/test/b3
dd if=/dev/random bs=1024 count=128 of=/test/b4
dd if=/dev/random bs=1024 count=128 of=/test/b5
dd if=/dev/random bs=1024 count=128 of=/test/b6
dd if=/dev/random bs=1024 count=128 of=/test/b7
dd if=/dev/random bs=1024 count=128 of=/test/b8
cd /test/
# 8 Blöcke aus 8 unique pattern
cat b1 b2 b3 b4 b5 b6 b7 b8 > f1
# 64 Blöcke aus 8 unique pattern
cat f1 f1 f1 f1 f1 f1 f1 f1 > f2
# 512 Blöcke aus 8 unique pattern
cat f2 f2 f2 f2 f2 f2 f2 f2 > f3
# 4096 Blöcke aus 8 unique pattern
cat f3 f3 f3 f3 f3 f3 f3 f3 > f4
# 32768 Blöcke aus 8 unique pattern
cat f4 f4 f4 f4 f4 f4 f4 f4 > f5
# 262144 Blöcke aus 8 unique pattern
cat f5 f5 f5 f5 f5 f5 f5 f5 > f6
# 2097152 Blöcke aus 8 unique pattern
cat f6 f6 f6 f6 f6 f6 f6 f6 > f7
# ls --block-size=128k -l
# zpool create warmup - für cache füllen, festplatte auf Touren bringen
zpool create -O sync=disabled warmup mirror c0t5000C50041ABF6A7d0 c0t5000C50041ABF84Fd0
# zpool create dedup
zpool create -O dedup=on dedup mirror c0t5000C50041AACD77d0 c0t5000C50041AADDCFd0
# zpool create default
zpool create default mirror c0t5000C50041ABDFBFd0 c0t5000C50041ABE86Fd0
Die in "https://blogs.oracle.com/scottdickson/entry/sillyt_zfs_dedup_experiment" beschriebenen Dateien habe ich in Pool test erstellt und mit folgende Script:
Code:
for POOL in warmup default dedup
do
echo "**************************************************"
echo "Pool $POOL:"
echo "* Lesen der Dateien und schreiben auf Pool: $POOL"
echo ""
for i in {1..8}
do
echo ">>>>"
echo ""
echo "dd if=/test/b$i of=/$POOL/b$i bs=128k"
dd if=/test/b$i of=/$POOL/b$i bs=128k
done
for i in {1..7}
do
echo ">>>>"
echo ""
echo "dd if=/test/f$i of=/$POOL/f$i bs=128k"
dd if=/test/f$i of=/$POOL/f$i bs=128k
done
done
in die erstellten Pools: warmup, default und dedup kopiert.
Abgesehen von langweiligen Werten wie z.B. Schreibperformance konnte ich ein interessante Festststellung machen:
Code:
root@otarget:~# zdb -S default
Simulated DDT histogram:
bucket allocated referenced
______ ______________________________ ______________________________
refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
------ ------ ----- ----- ----- ------ ----- ----- -----
256K 8 1M 1M 1M 2.29M 293G 293G 293G
Total 8 1M 1M 1M 2.29M 293G 293G 293G
dedup = 299594.00, compress = 1.00, copies = 1.00, dedup * compress / copies = 299594.00
Die Simulation lieferte exakte Ergebnisse hier(bearbeitet: in diesem Fall jedenfalls). Für jemanden der mit dem Gedanken "Dedup" liebäugelt vieleicht interessant zu wissen.
Was noch zu erwähnen ist - allerdings nicht relevant, da solche Files in einem realen working set nicht vorhanden sind - ist folgende Tatsache:
Lesende Zugriffe auf ein File der Größe 256Gbyte werden vom meinen System(64Gbyte RAM) aus dem ARC bedient:
Code:
root@otarget:/test# dd if=/dedup/f7 of=/dev/null bs=128k
2097152+0 records in
2097152+0 records out
274877906944 bytes (275 GB) copied, 74,5025 s, 3,7 GB/s
Andererseits kann man daraus den Schluss ziehen das ein working set mit dedup(trotz RAM Nutzung für Dedup selber) ab einer Dedup ratio n weniger ARC Speicher belegt oder anders gesagt mehr Files im ARC gehalten werden können.
Gibt es eine Möglichkeit die Dedup ratio der derzeitig im ARC gehaltenen Blöcke zu ermitteln?
Habe ich eine Dedup ratio 100, vielleicht erreichbar durch n-Installationen von Linux-Distribution X in ein Pool, stellt sich immer noch die Frage:
1 Terrabyte Platz im Pool sparen oder den ARC Speicher nicht verkleinern?
Gibt es eine Möglichkeit den "verwendeten RAM für Dedup von Pool X" zu ermitteln?