145 votes

dd : Comment calculer la taille de bloc optimale ?

Comment calculer la taille optimale des blocs lors de l'exécution d'un programme de gestion des blocs ? dd ? J'ai fait quelques recherches à ce sujet et je n'ai rien trouvé qui suggère comment cela pourrait être accompli.

J'ai l'impression qu'une taille de bloc plus importante se traduirait par une plus grande rapidité d'exécution. dd ... est-ce vrai ?

Je suis sur le point de dd deux disques durs Hitachi identiques de 500 Go fonctionnant à 7200 tr/min sur une machine équipée d'un Intel Core i3 et de 4 Go de RAM DDR3 1333mhz. J'essaie donc de déterminer la taille de bloc à utiliser. (Je vais démarrer Ubuntu 10.10 x86 à partir d'un lecteur flash, et l'exécuter à partir de cela).

0 votes

Adopté la réponse de @tdg5 pour macOS - macos_dd_ibs_test.sh y macos_dd_obs_test.sh

1 votes

La meilleure réponse serait de contribuer à une fonctionnalité de dd pour trouver la taille de bloc optimale tout en transférant le fichier

3 votes

Pourquoi ce sujet a-t-il été marqué hors sujet et n'a pas été transféré vers le superutilisateur ?

117voto

Lars Wirzenius Points 12197

La taille optimale des blocs dépend de plusieurs facteurs, dont le système d'exploitation (et sa version), ainsi que les différents bus et disques matériels concernés. Plusieurs systèmes de type Unix (y compris Linux et au moins certaines versions de BSD) définissent la taille de bloc optimale en fonction du système d'exploitation. st_blksize membre de la struct stat qui donne ce que le noyau pense être la taille optimale des blocs :

#include <sys/stat.h>
#include <stdio.h>

int main(void)
{
    struct stat stats;

    if (!stat("/", &stats))
    {
        printf("%u\n", stats.st_blksize);
    }
}

Le meilleur moyen est peut-être d'expérimenter : copiez un gigaoctet avec différentes tailles de blocs et chronométrez le tout. (N'oubliez pas d'effacer les caches des tampons du noyau avant chaque exécution : echo 3 > /proc/sys/vm/drop_caches ).

Cependant, en règle générale, j'ai constaté qu'une taille de bloc suffisamment grande permet de laisser dd font un bon travail, et les différences entre, disons, 64 KiB et 1 MiB sont mineures, comparées à 4 KiB contre 64 KiB. (Bien que, il faut l'admettre, cela fait un moment que je n'ai pas fait cela. J'utilise un mebibyte par défaut maintenant, ou je laisse juste dd choisissez la taille).

15 votes

Je suis vraiment désolé de ne pas avoir accepté cette réponse... merci !

1 votes

Excellente remarque sur le fait de ne pas oublier de supprimer les caches. Cela perturbait mes mesures ! (Bien que ce soit un problème mineur : c'est "drop_caches", avec un trait de soulignement. Apparemment, les modifications doivent comporter au moins 6 caractères... :( )

16voto

unfa Points 13

J'ai trouvé que la taille de bloc optimale était de 8 Mo (égale à la mémoire cache du disque). J'avais besoin de nettoyer (certains disent : laver) l'espace vide d'un disque avant d'en créer une image compressée. J'ai utilisé :

cd /media/DiskToWash/
dd if=/dev/zero of=zero bs=8M; rm zero

J'ai expérimenté des valeurs allant de 4K à 100M.

Après avoir laissé dd fonctionner pendant un moment, je l'ai tué (Ctrl+C) et j'ai lu la sortie :

36+0 records in
36+0 records out
301989888 bytes (302 MB) copied, 15.8341 s, 19.1 MB/s

Comme dd affiche le taux d'entrée/sortie (19,1 Mo/s dans ce cas), il est facile de voir si la valeur que vous avez choisie est plus performante que la précédente ou moins performante.

Mes scores :

bs=   I/O rate
---------------
4K    13.5 MB/s
64K   18.3 MB/s
8M    19.1 MB/s <--- winner!
10M   19.0 MB/s
20M   18.6 MB/s
100M  18.6 MB/s   

Remarque : Pour vérifier la taille de votre cache/tampon de disque, vous pouvez utiliser la commande suivante sudo hdparm -i /dev/sda

4 votes

Avez-vous exécuté chaque test une seule fois ? Je pense que ce que vous pourriez voir avec 64K, c'est que le tampon est déjà plein et que la différence est juste une variance aléatoire.

0 votes

J'ai entendu parler une fois de valeurs importantes susceptibles d'engorger le système. La personne travaillait avec un gros fichier. Ce serait bien si je pouvais en savoir plus à ce sujet.

1 votes

Mon expérience suggère également 8M est difficile à battre.

5voto

ssapkota Points 1781

Cela dépend totalement du système. Vous devez expérimenter pour trouver la solution optimale. Essayez de commencer avec bs=8388608 . (Comme les disques durs Hitachi semblent avoir un cache de 8MB).

6 votes

Beaucoup de versions de dd acceptent des raccourcis : i.e. bs=8M sur GNU/Linux ou bs=8m sur BSD

6 votes

Lol, je pensais que vous alliez dire "Essayez de commencer à bs=8388608 et décrémenter une fois par étape"

3voto

sampablokuper Points 1286

Vous pouvez essayer d'utiliser dd-opt un petit utilitaire que j'ai écrit.

(Améliorations/réflexions bienvenues !)

1voto

eadmaster Points 287
  • pour de meilleures performances, utilisez la plus grande taille de bloc que votre RAM peut accueillir (cela enverra moins d'appels E/S au système d'exploitation).
  • pour une meilleure précision et récupération des données, définissez la taille de bloc à la taille de secteur native de l'entrée.

Lorsque dd copie des données avec l'option conv=noerror,sync, toute erreur rencontrée entraîne le remplacement du reste du bloc par des octets nuls. Des blocs de plus grande taille seront copiés plus rapidement, mais chaque fois qu'une erreur est rencontrée, le reste du bloc est ignoré.

source

2 votes

Je pense que s'il y a des erreurs d'écriture, il faut remplacer le support, pas changer la taille des blocs...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X