À l'occasion, j'ai vu des commentaires en ligne du type "assurez-vous de définir" bs = "car la valeur par défaut prendra trop de temps" et mes propres expériences extrêmement non scientifiques de ", cela semblait prendre plus de temps que cet autre le temps passé la semaine dernière "semble le confirmer. Ainsi, chaque fois que j'utilise 'dd' (généralement dans la plage de 1 à 2 Go), je m'assure de spécifier le paramètre bytes. Environ la moitié du temps que j’utilise la valeur spécifiée dans le guide en ligne à partir duquel je copie; le reste du temps, je choisirai un nombre qui ait du sens dans la liste 'fdisk -l' pour ce que je suppose être le support le plus lent (par exemple, la carte SD sur laquelle je vous écris).
Pour une situation donnée (type de support, taille du bus ou autre chose qui compte), existe-t-il un moyen de déterminer la "meilleure" valeur? Est-ce facile à déterminer? Sinon, y a-t-il un moyen facile d'obtenir 90 à 95% du trajet? Ou est-ce que "choisissez juste quelque chose plus grand que 512" est même la bonne réponse?
J'ai pensé essayer l'expérience moi-même, mais (en plus de mon travail), je ne sais pas quels facteurs ont un impact sur la réponse, je ne sais donc pas comment concevoir une bonne expérience.
la source
Réponses:
dd
date de l'époque où il était nécessaire de traduire les anciennes bandes d'ordinateurs centraux IBM et que la taille du bloc devait correspondre à celle utilisée pour écrire la bande, sinon les blocs de données seraient ignorés ou tronqués. (Les cassettes 9 pistes étaient capricieux. Soyez heureux qu'elles soient mortes depuis longtemps.) Ces jours-ci, la taille du bloc devrait être un multiple de la taille du secteur du périphérique (généralement 4Ko, mais sur des disques très récents, ils peuvent être beaucoup plus grands et très petits. les disques peuvent être plus petits, mais 4 Ko est un terrain d’entente raisonnable, peu importe) et plus grand est le meilleur pour la performance. J'utilise souvent des tailles de bloc de 1 Mo avec des disques durs. (Nous avons beaucoup plus de mémoire à jeter ces jours-ci aussi.)la source
@Gilles
si vous souhaitez que je sois averti de votre réponse au commentaire, voir Comment fonctionne le commentaire @ réponses? . Depuis que je suis passé par là: le noyau va tout gérer de toute façon. Votre affirmation selon laquelle «ce travail supplémentaire peut considérablement réduire le temps de copie» ne correspond pas à mes critères de référence, mais des systèmes différents peuvent avoir des comportements différents, alors merci de contribuer également au minutage!Il n'y a qu'un moyen de déterminer la taille optimale du bloc, et c'est un point de repère. Je viens de faire un repère rapide. La machine de test est un PC sous Debian GNU / Linux, avec le noyau 2.6.32 et coreutils 8.5. Les deux systèmes de fichiers impliqués sont ext3 sur des volumes LVM sur une partition de disque dur. Le fichier source est de 2 Go (2040000k pour être précis). La mise en cache et la mise en mémoire tampon sont activées. Avant chaque course, j'ai vidé le cache avec
sync; echo 1 >|/proc/sys/vm/drop_caches
. Les temps d'exécution n'incluent pas de finalesync
pour vider les tampons; la finalesync
prend environ 1 seconde. Lessame
exécutions étaient des copies sur le même système de fichiers; lesdiff
exécutions étaient des copies sur un système de fichiers sur un disque dur différent. Par souci de cohérence, les temps rapportés sont les temps d’horloge murale obtenus avectime
utilité, en secondes. Je n'ai exécuté qu'une seule fois chaque commande, donc je ne sais pas à quel point il y a de la variance dans le timing.Conclusion: une taille de bloc importante (plusieurs mégaoctets) peut aider, mais pas de façon spectaculaire (beaucoup moins que ce à quoi je m'attendais pour les copies avec un même lecteur). Et
cat
etcp
ne performez pas si mal. Avec ces chiffres, je ne trouve pas ladd
peine de s’inquiéter. Allez aveccat
!la source
>|
est la même chose que>
sauf qu'en dessousset -o noclobber
, le shell se plaint que le fichier existe si vous l'utilisez>
.cat
. Pourquoi cherchez-vous un meilleur moyen? Quel est le problème aveccat
?cat
copie simplement son entrée dans sa sortie. Si vous souhaitez copier des supports non fiables, ignorer des parties illisibles ou réessayer plusieurs fois, le problème est différent etddrescue
fonctionne très bien.lsof
. La vitesse instantanée n'est pas très pertinente avec une copie de disque car elle est uniforme, vous pouvez donc diviser les octets transférés par le temps écoulé. si vous voulez quelque chose de mieux, vous pouvez utiliserpv
.Je suis d'accord avec geekosaur que la taille devrait être un multiple de la taille du bloc, qui est souvent 4K.
Si vous voulez trouver la taille du bloc,
stat -c "%o" filename
c'est probablement l'option la plus simple.Mais dites que vous faites
dd bs=4K
, cela signifie que ça le faitread(4096); write(4096); read(4096); write(4096)
...Chaque appel système implique un changement de contexte, ce qui implique une surcharge et, en fonction du planificateur d'E / S, les lectures avec des écritures intercalées peuvent amener le disque à effectuer de nombreuses recherches. (Ce n’est probablement pas un problème majeur avec le planificateur Linux, mais il faut quand même réfléchir.)
Ainsi, si vous le faites
bs=8K
, vous autorisez le disque à lire deux blocs à la fois, qui sont probablement proches l'un de l'autre sur le disque, avant de chercher un autre moyen d'effectuer l'écriture (ou de gérer les E / S pour un autre processus).Par cette logique,
bs=16K
c'est encore mieux, etc.Ce que j'aimerais savoir, c'est s'il existe une limite supérieure à partir de laquelle les performances commencent à se dégrader ou si elles ne sont limitées que par la mémoire.
la source
Comme Gilles le dit, vous pouvez déterminer le paramètre optimal pour l' option bs à dd en procédant à une analyse comparative. Cela pose cependant la question suivante: comment comparer facilement ce paramètre?
Ma tentative de réponse à cette question est la suivante: utilisez dd-opt , l’utilitaire sur lequel j’ai récemment commencé à travailler pour résoudre précisément ce problème :)
la source
dd-opt
longtemps. Cependant, il s'agit d' un logiciel libre sous licence AGPLv3 . Alors, n'hésitez pas à l'améliorer et à évaluer sa sensibilité / précision!J'ai optimisé pour le lecteur de carte SD usb2.0 qui semble fonctionner le mieux
bs=10M
. J'ai essayé 4k, sur 16M, après 8-10M sans amélioration. Vous pouvez voir comment la mesure du taux de transfert se dégrade ... probablement en raison du chargement des mémoires tampons sur le périphérique, puis de l'attente du transfert du périphérique sur le support réel.la source