L'uso di dd per scrivere gli zeri sulla scheda CF sul lettore di schede USB causa molta lettura


2

Sto azzerando una scheda CF usando dd

dd if=/dev/zero of=/dev/sdg

Guardando il sistema usando gkrellm o iostat vedo un sacco di letture dal dispositivo della scheda CF, seguito da raffiche di scritture.

Con questo esempio:

# dd if=/dev/zero of=/dev/sdg count=200000
200000+0 records in
200000+0 records out
102400000 bytes (102 MB) copied, 46.1357 s, 2.2 MB/s

Iostat con intervallo di 1 secondo produce questo:

Linux 2.6.32-573.3.1.el6.x86_64
Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdg               0.00         0.00         0.00          0          0
sdg               0.00         0.00         0.00          0          0
sdg               0.00         0.00         0.00          0          0
sdg             406.00      3248.00         0.00       3248          0
sdg             719.00      5752.00         0.00       5752          0
sdg             738.00      5904.00         0.00       5904          0
sdg             721.00      5768.00         0.00       5768          0
sdg             735.00      5880.00         0.00       5880          0
sdg             715.00      5720.00         0.00       5720          0
sdg             732.00      5856.00         0.00       5856          0
sdg             717.00      5736.00         0.00       5736          0
sdg             732.00      5856.00         0.00       5856          0
sdg             717.00      5736.00         0.00       5736          0
sdg             732.00      5856.00         0.00       5856          0
sdg             715.00      5720.00         0.00       5720          0
sdg             732.00      5856.00         0.00       5856          0
sdg             714.00      5712.00         0.00       5712          0
sdg             733.00      5864.00         0.00       5864          0
sdg             716.00      5728.00         0.00       5728          0
sdg             732.00      5856.00         0.00       5856          0
sdg             715.00      5720.00         0.00       5720          0
sdg             732.00      5856.00         0.00       5856          0
sdg             712.00      5696.00         0.00       5696          0
sdg             732.00      5856.00         0.00       5856          0
sdg             715.00      5720.00         0.00       5720          0
sdg             734.00      5872.00         0.00       5872          0
sdg             715.00      5720.00         0.00       5720          0
sdg             734.00      5872.00         0.00       5872          0
sdg             715.00      5720.00         0.00       5720          0
sdg             732.00      5856.00         0.00       5856          0
sdg             715.00      5720.00         0.00       5720          0
sdg             732.00      5856.00         0.00       5856          0
sdg             715.00      5720.00         0.00       5720          0
sdg             733.00      5864.00         0.00       5864          0
sdg             716.00      5728.00         0.00       5728          0
sdg             733.00      5864.00         0.00       5864          0
sdg             444.00      3320.00      6960.00       3320       6960
sdg              71.00        56.00     15360.00         56      15360
sdg              81.00        72.00     17280.00         72      17280
sdg              83.00        80.00     17520.00         80      17520
sdg              81.00        80.00     17040.00         80      17040
sdg              82.00        72.00     17520.00         72      17520
sdg              81.00        72.00     17280.00         72      17280
sdg              83.00        80.00     17520.00         80      17520
sdg              81.00        80.00     17040.00         80      17040
sdg              82.00        72.00     17520.00         72      17520
sdg              82.00        80.00     17280.00         80      17280
sdg             204.00      1152.00     14352.00       1152      14352
sdg             718.00      5744.00         0.00       5744          0
sdg             160.00      1024.00      7328.00       1024       7328
sdg               0.00         0.00         0.00          0          0
sdg               0.00         0.00         0.00          0          0
sdg               0.00         0.00         0.00          0          0
sdg               0.00         0.00         0.00          0          0

Running strace su dd non rivela nulla di strano:

open("/dev/zero", O_RDONLY)             = 3
dup2(3, 0)                              = 0
close(3)                                = 0
lseek(0, 0, SEEK_CUR)                   = 0
open("/dev/sdg", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1)                              = 1
close(3)                                = 0
read(0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
read(0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
read(0, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512

Tuttavia lo stesso comportamento non è osservato usando

cat /dev/zero >/dev/sdg

iostat:

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdg               0.00         0.00         0.00          0          0
sdg               0.00         0.00         0.00          0          0
sdg               0.00         0.00         0.00          0          0
sdg              37.00         0.00      8880.00          0       8880
sdg              73.00         0.00     17520.00          0      17520
sdg              74.00         0.00     17528.00          0      17528
sdg              75.00         0.00     17304.00          0      17304
sdg              50.00         0.00     11768.00          0      11768
sdg              56.00         0.00     12976.00          0      12976
sdg              44.00         0.00     10328.00          0      10328
sdg              76.00         0.00     17544.00          0      17544
sdg              75.00         0.00     17536.00          0      17536
sdg              75.00         0.00     17536.00          0      17536

Cosa sta succedendo?


Prova a utilizzare una dimensione di blocco ragionevole (4K-64K)
qasdfdsaq

Risposte:


1

Sebbene la scheda CF sia segnalata come avente blocchi di 512 byte:

kernel: sd 11:0:0:0: [sdk] 15662304 512-byte logical blocks

L'utilizzo di una dimensione di blocco di 4k su df rimuove la lettura e quindi aumenta le prestazioni:

# dd if=/dev/zero of=/dev/sdk count=80000
80000+0 records in
80000+0 records out
40960000 bytes (41 MB) copied, 5.49363 s, 7.5 MB/s
# dd if=/dev/zero of=/dev/sdk count=10000 bs=4k
10000+0 records in
10000+0 records out
40960000 bytes (41 MB) copied, 2.82353 s, 14.5 MB/s

Immagino che il kernel potrebbe leggere la scheda per assemblare un blocco completo per la scrittura, ma non sembra un comportamento corretto.


Curioso, perché pensi che questo non sia il comportamento corretto? In quale altro modo potrebbe funzionare, se stai scrivendo solo una parte di un blocco?
ChrisInEdmonton

Buffer le scritture finché non chiudo il file o il buffer si riempie ..
Neik

Mi piace la risposta. Solo curioso, come sarebbero i risultati se imposti dimensioni di blocco superiori a 4k, ad esempio 8k o 16k? Supponevo che avrebbero rimosso la lettura e ottenere circa 14,5 MB / s.
xpt

Sì. Cambiare la dimensione del blocco con i valori suggeriti dà lo stesso risultato. Le dimensioni di blocco di 1k e 2k funzionano fino a 512 byte.
Neik

0

Il tuo dispositivo ha un piccolo buffer su di esso per velocizzare le cose. Quando si reindirizza utilizzando cat, il buffering viene eseguito dal sistema operativo. Puoi dire a dd di scrivere direttamente sul dispositivo senza cache. Per esempio:

dd if=/dev/zero of=/dev/sdg oflag=direct

Vedere man 5 open e leggere O_DIRECT. Naturalmente, questo sarà molto lento. Se vuoi accelerarlo, ma continua a goderti le funzionalità di dd, puoi fare qualcosa del genere:

dd if=/dev/zero | cat >/dev/sdg

Non vedo perché questo richiede la lettura dalla scheda CF però. Sto solo scrivendo su di esso. Inoltre sto subendo un enorme calo di prestazioni causato da tutte queste letture non necessarie.
Neik
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.