Ho fatto un po 'di benchmarking con le operazioni di scrittura in un dispositivo di loopback. Ecco la conclusione:
- Se esegui la sincronizzazione dopo ogni scrittura, un dispositivo di loopback ha prestazioni significativamente peggiori (quasi due volte più lente).
- Se si consente alla cache del disco di uno scheduler IO di fare il proprio lavoro, allora non c'è praticamente alcuna differenza tra l'utilizzo di un dispositivo di loopback e l'accesso diretto al disco.
Risultati benchmark
Innanzitutto, ho eseguito un benchmark su un dispositivo di loopback in tmpfs di 8 GB e un dispositivo di loopback all'interno di quel dispositivo di loopback ( con sincronizzazione dopo ogni operazione di scrittura ):
ext4 in tmpfs:
Measured speed: 557, 567, 563, 558, 560, 559, 556, 556, 554, 557
Average speed : 558.7 MB/s (min 554 max 560)
ext4 in extf in tmpfs:
Measured speed: 296, 298, 295, 295, 299, 297, 294, 295, 296, 296
Average speed : 296.1 MB/s (min 294 max 299)
Chiaramente, c'è qualche differenza nelle prestazioni quando si utilizzano dispositivi di loopback con sincronizzazione su scrittura.
Quindi ho ripetuto lo stesso test sul mio HDD.
ext4 (HDD, 1000 MB, 3 volte):
Measured speed: 24.1, 23.6, 23.0
Average speed : 23.5 MB/s (min 23.0 max 24.1)
ext4 in ext4 (HDD, 945 MB):
Measured speed: 12.9, 13.0, 12.7
Average speed : 12.8 MB/s (min 12.7 max 13.0)
Stesso benchmark su HDD, ora senza sincronizzazione dopo ogni scrittura ( time (dd if=/dev/zero bs=1M count=1000 of=file; sync)
, misurato come <size>
/ <time in seconds>
).
ext4 (HDD, 1000 MB):
Measured speed: 84.3, 86.1, 83.9, 86.1, 87.7
Average speed : 85.6 MB/s (min 84.3 max 87.7)
ext4 in ext4 (HDD, 945 MB):
Measured speed: 89.9, 97.2, 82.9, 84.0, 82.7
Average speed : 87.3 MB/s (min 82.7 max 97.2)
(sorprendentemente, il benchmark di loopback ha un aspetto migliore rispetto al benchmark del disco crudo, presumibilmente a causa delle dimensioni più ridotte del dispositivo di loopback, quindi meno tempo viene impiegato sull'effettiva sincronizzazione su disco)
Impostazione benchmark
Innanzitutto, ho creato un filesystem di loopback di 8G in my / tmp (tmpfs):
truncate /tmp/file -s 8G
mkfs.ext4 /tmp/file
sudo mount /tmp/file /mnt/
sudo chown $USER /mnt/
Quindi ho stabilito una baseline riempiendo il file loopback montato con i dati:
$ dd if=/dev/zero bs=1M of=/mnt/bigfile oflag=sync
dd: error writing '/mnt/bigfile': No space left on device
7492+0 records in
7491+0 records out
7855763456 bytes (7.9 GB) copied, 14.0959 s, 557 MB/s
Dopo averlo fatto, ho creato un altro dispositivo di loopback nel precedente dispositivo di loopback:
mkdir /tmp/mountpoint
mkfs.ext4 /mnt/bigfile
sudo mount /mnt/bigfile /tmp/mountpoint
sudo chown $USER /tmp/mountpoint
E ha eseguito nuovamente il benchmark, dieci volte:
$ dd if=/dev/zero bs=1M of=/tmp/mountpoint/file oflag=sync
...
7171379200 bytes (7.2 GB) copied, 27.0111 s, 265 MB/s
e quindi ho smontato il file di prova e rimosso:
sudo umount /tmp/mountpoint
sudo umount /mnt
(allo stesso modo per il test sull'HDD, tranne che ho anche aggiunto count=1000
per impedire al test di riempire il mio intero disco)
(e per il test di non scrittura su sincronizzazione, ho eseguito il cronometraggio dd
e l' sync
operazione)