J'ai actuellement des problèmes avec dd
invoqué avec un fichier clairsemé comme entrée ( if
) et un fichier comme sortie ( of
) avec conv=sparse
. dd
semble utiliser Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
uniquement un cœur du processeur ( 4 cœurs + 4 Intel Hyperthreads) (100% d'un cœur), donc je me demandais s'il était possible de paralléliser dd
. J'ai été
- regarder
info dd
etman dd
et il semble y avoir une fonction intégrée dans la version de corutils 8.23 - vérification à
sgp_dd
partir dusg3-utils
package (sans comprendre si cela convient à mes besoins), mais il ne semble pas être capable de gérer des fichiers clairsemés dcfldd
ne semble pas avoir de capacités de parallélisation
Autant que je sache
- une version / fork améliorée avec une gestion interne des parties du programme dans plusieurs threads (éviter les changements de contexte tuant les performances d'E / S) est préférable à
- une solution avec GNU
parallel
fonctionnant localement est préférable à - un fragment de code personnalisé (éventuellement non testé)
Comment éviter que le CPU soit le goulot d'étranglement d'une opération intensive d'E / S? Je voudrais exécuter la commande sur Ubuntu 14.04 avec Linux 3.13 et gérer les images disque de fichiers épars avec elle sur n'importe quel système de fichiers prenant en charge les fichiers épars (au moins la solution ne devrait pas être liée à un système de fichiers spécifique).
Contexte: J'essaie de créer une copie d'un fichier fragmenté de 11 To (contenant environ 2 To de données) sur un zfs (version instable de zfsonlinux 0.6.4, peut-être un bug et la cause du goulot d'étranglement du processeur (éventuellement recherche de trous lents)). Cela ne devrait rien changer à la question de savoir comment paralléliser dd (de manière très générique).
la source
dd
monopolise le CPU par défaut en raison de la petite taille des blocs. l'agrandir, commebs=1M
.Réponses:
Testé en Bash:
Vous devrez probablement ajuster 1000.
la source
Un sniplet de code personnalisé et non testé à venir:
Cela devrait logiquement partitionner le fichier en quatre blocs de 3 To et les traiter en parallèle. (
skip=
ignore les blocs d'entrée;seek=
recherche les blocs de sortie.) La quatrième commande lira, bien sûr, jusqu'à la fin de l'ancien fichier, donc lecount=
paramètre n'est pas strictement nécessaire.la source
conv=notrunc
conv=notrunc
est impliqué parseek=
une valeur positive.