Kadang-kadang saya melihat komentar online di sepanjang baris "pastikan Anda menetapkan 'bs =' karena nilai default akan terlalu lama," dan pengalaman saya sendiri yang sangat tidak ilmiah, "nampaknya butuh waktu lebih lama daripada yang lain waktu minggu lalu "tampaknya mendukung hal itu. Jadi setiap kali saya menggunakan 'dd' (biasanya dalam kisaran 1-2GB) saya pastikan untuk menentukan parameter byte. Sekitar separuh waktu saya menggunakan nilai yang ditentukan dalam panduan online apa pun yang saya salin; sisa waktu saya akan memilih beberapa nomor yang masuk akal dari daftar 'fdisk-l' untuk apa yang saya asumsikan adalah media yang lebih lambat (misalnya kartu SD yang saya tulis).
Untuk situasi tertentu (jenis media, ukuran bus, atau apa pun yang penting), apakah ada cara untuk menentukan nilai "terbaik"? Apakah mudah ditentukan? Jika tidak, adakah cara mudah untuk mendapatkan 90-95% dari perjalanan ke sana? Atau "hanya memilih sesuatu yang lebih besar dari 512" bahkan jawaban yang benar?
Saya sudah berpikir untuk mencoba eksperimen sendiri, tetapi (selain menjadi banyak pekerjaan) saya tidak yakin faktor apa yang mempengaruhi jawaban, jadi saya tidak tahu bagaimana merancang eksperimen yang baik.
sumber
Jawaban:
dd
tanggal dari belakang ketika diperlukan untuk menerjemahkan kaset mainframe IBM lama, dan ukuran blok harus cocok dengan yang digunakan untuk menulis kaset atau blok data akan dilewati atau dipotong. (Kaset 9-track sangat rewel. Senang mereka sudah lama mati.) Belakangan ini, ukuran blok haruslah kelipatan dari ukuran sektor perangkat (biasanya 4KB, tetapi pada disk yang sangat baru mungkin jauh lebih besar dan dengan ibu jari yang sangat kecil) drive mungkin lebih kecil, tetapi 4KB adalah jalan tengah yang wajar terlepas) dan semakin besar semakin baik untuk kinerja. Saya sering menggunakan ukuran blok 1MB dengan hard drive. (Kami memiliki lebih banyak memori untuk dilemparkan hari ini juga.)sumber
@Gilles
jika Anda ingin saya diberitahu tentang balasan komentar Anda, lihat Bagaimana cara kerja comment @balasan? . Karena saya kebetulan lewat: kernel akan menangani semuanya. Klaim Anda bahwa "pekerjaan ekstra dapat mengurangi waktu penyalinan secara signifikan" tidak setuju dengan tolok ukur saya, tetapi sistem yang berbeda mungkin memiliki perilaku yang berbeda, jadi silakan berkontribusi juga waktunya!Hanya ada satu cara untuk menentukan ukuran blok optimal, dan itu tolok ukur. Saya baru saja membuat patokan cepat. Mesin uji adalah PC yang menjalankan Debian GNU / Linux, dengan kernel 2.6.32 dan coreutils 8.5. Kedua filesystem yang terlibat adalah ext3 pada volume LVM pada partisi hard disk. File sumber adalah 2GB (tepatnya 2040000kB). Caching dan buffering diaktifkan. Sebelum menjalankan, saya mengosongkan cache
sync; echo 1 >|/proc/sys/vm/drop_caches
. Waktu lari tidak termasuk finalsync
untuk menyiram buffer; finalsync
mengambil urutan 1 detik. Prosessame
adalah salinan pada sistem file yang sama; yangdiff
berjalan adalah salinan ke sistem file pada hard disk yang berbeda. Untuk konsistensi, waktu yang dilaporkan adalah jam dinding yang diperoleh dengantime
utilitas, dalam hitungan detik. Saya hanya menjalankan setiap perintah sekali, jadi saya tidak tahu berapa banyak perbedaan dalam pengaturan waktu.Kesimpulan: ukuran blok besar (beberapa megabyte) membantu, tetapi tidak secara dramatis (jauh lebih sedikit daripada yang saya harapkan untuk salinan drive yang sama). Dan
cat
dancp
jangan berkinerja buruk. Dengan angka-angka ini, saya merasa tidakdd
layak untuk diganggu. Pergi dengancat
!sumber
>|
sama dengan>
kecuali di bawahset -o noclobber
, shell akan mengeluh bahwa file tersebut ada jika Anda gunakan>
.cat
. Mengapa Anda mencari cara yang lebih baik? Ada apa dengan inicat
?cat
hanya menyalin inputnya ke outputnya. Jika Anda ingin menyalin dari media yang tidak dapat diandalkan, dan melewati bagian yang tidak dapat dibaca atau mencoba lagi beberapa kali, itu masalah yang berbeda, yangddrescue
berfungsi dengan cukup baik.lsof
. Kecepatan instan tidak terlalu relevan dengan salinan disk karena seragam sehingga Anda dapat membagi byte yang ditransfer berdasarkan waktu yang telah berlalu; jika Anda menginginkan sesuatu yang lebih baik, Anda bisa menggunakannyapv
.Saya setuju dengan geekosaurus bahwa ukurannya harus kelipatan dari ukuran blok, yang seringkali 4K.
Jika Anda ingin menemukan ukuran blok
stat -c "%o" filename
mungkin merupakan opsi termudah.Tapi katakanlah
dd bs=4K
, itu berartiread(4096); write(4096); read(4096); write(4096)
...Setiap panggilan sistem melibatkan saklar konteks, yang melibatkan beberapa overhead, dan tergantung pada penjadwal I / O, membaca dengan tulisan diselingi dapat menyebabkan disk melakukan banyak pencarian. (Mungkin bukan masalah besar dengan scheduler Linux, tapi tetap saja sesuatu untuk dipikirkan.)
Jadi jika Anda melakukannya
bs=8K
, Anda mengizinkan disk untuk membaca dua blok sekaligus, yang mungkin berdekatan pada disk, sebelum mencari tempat lain untuk melakukan penulisan (atau untuk melayani I / O untuk proses lain).Dengan logika itu,
bs=16K
bahkan lebih baik, dll.Jadi yang ingin saya ketahui adalah apakah ada batas atas di mana kinerja mulai memburuk, atau jika hanya dibatasi oleh memori.
sumber
Seperti yang dikatakan Gilles, Anda dapat menentukan parameter optimal untuk opsi bs menjadi dd dengan pembandingan. Ini, bagaimanapun, menimbulkan pertanyaan: bagaimana Anda bisa dengan mudah membandingkan parameter ini?
Jawaban sementara saya untuk pertanyaan ini adalah: gunakan dd-opt , utilitas yang baru saja saya mulai kerjakan untuk memecahkan masalah ini :)
sumber
dd-opt
dalam waktu yang lama. Namun, ini adalah perangkat lunak gratis yang dilisensikan di bawah AGPLv3 . Jadi, silakan memperbaikinya dan mengevaluasi sensitivitas / akurasinya!Saya dioptimalkan untuk usb2.0 sdcard reader yang tampaknya berjalan paling baik
bs=10M
. Saya mencoba 4k, hingga 16 juta, setelah 8-10 juta tidak ada perbaikan. Anda dapat melihat bagaimana pengukuran kecepatan transfer menurun ... kemungkinan besar karena memuat buffer pada perangkat kemudian menunggu perangkat untuk mentransfer ke media yang sebenarnya.sumber