ตัวเลือก“ bs” ใน“ dd” ปรับปรุงความเร็วหรือไม่?


58

ทุกครั้งที่ผ่านมาฉันได้รับคำสั่งให้เพิ่มความเร็วของ "dd" ฉันควรเลือก "ขนาดบล็อก" ที่เหมาะสม

แม้ที่นี่บน ServerFault มีคนเขียนว่า " ... ขนาดบล็อกที่เหมาะสมที่สุดขึ้นอยู่กับฮาร์ดแวร์ ... " (iain)หรือ " ... ขนาดที่สมบูรณ์แบบจะขึ้นอยู่กับบัสระบบของคุณตัวควบคุมฮาร์ดไดรฟ์ฮาร์ดไดรฟ์เฉพาะ ตัวเองและไดรเวอร์สำหรับแต่ละเหล่านั้น ... " (chris-s)

เนื่องจากความรู้สึกของฉันแตกต่างกันเล็กน้อย ( BTW: ฉันคิดว่าเวลาที่ต้องปรับจูนพารามิเตอร์ bs นั้นสูงกว่าที่ได้รับมากในแง่ของการประหยัดเวลาและค่าเริ่มต้นนั้นสมเหตุสมผล ) วันนี้ฉันเพิ่งไป ผ่านการวัดประสิทธิภาพที่รวดเร็วและสกปรก

เพื่อลดอิทธิพลภายนอกฉันตัดสินใจอ่าน:

  • จากการ์ด MMC ภายนอก
  • จากพาร์ติชันภายใน

และ:

  • กับระบบไฟล์ที่เกี่ยวข้อง umounted
  • การส่งออกไปยัง / dev / null เพื่อหลีกเลี่ยงปัญหาที่เกี่ยวข้องกับ "ความเร็วในการเขียน";
  • หลีกเลี่ยงปัญหาพื้นฐานของการแคช HDD อย่างน้อยเมื่อเกี่ยวข้องกับ HDD

ในตารางต่อไปนี้ฉันได้รายงานสิ่งที่พบแล้วอ่านข้อมูล 1GB ด้วยค่าต่าง ๆ ของ "bs" ( คุณสามารถค้นหาหมายเลขดิบได้ที่ท้ายข้อความนี้ ):

ป้อนคำอธิบายรูปภาพที่นี่

โดยพื้นฐานแล้วมันก็อ้างว่า:

  • MMC: ด้วย bs = 4 (ใช่! 4 ไบต์) ฉันถึงปริมาณงาน 12MB / s ค่าที่อยู่ไม่ไกลมากไปจนถึงสูงสุด 14.2 / 14.3 ที่ฉันได้รับจาก bs = 5 ขึ้นไป

  • HDD: ด้วย a bs = 10 ฉันถึง 30 MB / s ต่ำกว่า 95.3 MB ได้อย่างแน่นอนด้วยค่าเริ่มต้น bs = 512 แต่ ... สำคัญเช่นกัน

นอกจากนี้เป็นที่ชัดเจนว่า CPU sys-time นั้นแปรผกผันกับค่า bs (แต่ฟังดูสมเหตุสมผลเมื่อยิ่ง bs ต่ำลงจำนวนของ sys-calls ที่สูงขึ้นจะยิ่งสูงขึ้นโดย dd)

ต้องบอกว่าทั้งหมดข้างต้นตอนนี้คำถาม: ใครสามารถอธิบาย (แฮกเกอร์เคอร์เนล?) สิ่งที่เป็นองค์ประกอบที่สำคัญ / ระบบที่เกี่ยวข้องกับปริมาณงานเช่นนี้และถ้ามันคุ้มค่าความพยายามในการระบุ bs สูงกว่าค่าเริ่มต้น?


กรณี MMC - หมายเลขดิบ

BS = 1M

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1M count=1000
1000+0 record dentro
1000+0 record fuori
1048576000 byte (1,0 GB) copiati, 74,1239 s, 14,1 MB/s

real    1m14.126s
user    0m0.008s
sys     0m1.588s

BS = 1k

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1k count=1000000
1000000+0 record dentro
1000000+0 record fuori
1024000000 byte (1,0 GB) copiati, 72,7795 s, 14,1 MB/s

real    1m12.782s
user    0m0.244s
sys     0m2.092s

BS = 512

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=512 count=2000000
2000000+0 record dentro
2000000+0 record fuori
1024000000 byte (1,0 GB) copiati, 72,867 s, 14,1 MB/s

real    1m12.869s
user    0m0.324s
sys     0m2.620s

BS = 10

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=10 count=100000000
100000000+0 record dentro
100000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 70,1662 s, 14,3 MB/s

real    1m10.169s
user    0m6.272s
sys     0m28.712s

BS = 5

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=5 count=200000000
200000000+0 record dentro
200000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 70,415 s, 14,2 MB/s

real    1m10.417s
user    0m11.604s
sys     0m55.984s

BS = 4

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=4 count=250000000
250000000+0 record dentro
250000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 80,9114 s, 12,4 MB/s

real    1m20.914s
user    0m14.436s
sys     1m6.236s

BS = 2

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=2 count=500000000
500000000+0 record dentro
500000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 161,974 s, 6,2 MB/s

real    2m41.976s
user    0m28.220s
sys     2m13.292s

BS = 1

root@iMac-Chiara:/tmp# time dd if=/dev/sdc of=/dev/null bs=1 count=1000000000
1000000000+0 record dentro
1000000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 325,316 s, 3,1 MB/s

real    5m25.318s
user    0m56.212s
sys     4m28.176s

กรณี HDD - หมายเลขดิบ

BS = 1

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1 count=1000000000
1000000000+0 record dentro
1000000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 341,461 s, 2,9 MB/s

real    5m41.463s
user    0m56.000s
sys 4m44.340s

BS = 2

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=2 count=500000000
500000000+0 record dentro
500000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 164,072 s, 6,1 MB/s

real    2m44.074s
user    0m28.584s
sys 2m14.628s

BS = 4

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=4 count=250000000
250000000+0 record dentro
250000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 81,471 s, 12,3 MB/s

real    1m21.473s
user    0m14.824s
sys 1m6.416s

BS = 5

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=5 count=200000000
200000000+0 record dentro
200000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 66,0327 s, 15,1 MB/s

real    1m6.035s
user    0m11.176s
sys 0m54.668s

BS = 10

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=10 count=100000000
100000000+0 record dentro
100000000+0 record fuori
1000000000 byte (1,0 GB) copiati, 33,4151 s, 29,9 MB/s

real    0m33.417s
user    0m5.692s
sys 0m27.624s

bs = 512 (ชดเชยการอ่านเพื่อหลีกเลี่ยงการแคช)

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=512 count=2000000 skip=6000000
2000000+0 record dentro
2000000+0 record fuori
1024000000 byte (1,0 GB) copiati, 10,7437 s, 95,3 MB/s

real    0m10.746s
user    0m0.360s
sys 0m2.428s

bs = 1k (ชดเชยการอ่านเพื่อหลีกเลี่ยงการแคช)

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1k count=1000000 skip=6000000
1000000+0 record dentro
1000000+0 record fuori
1024000000 byte (1,0 GB) copiati, 10,6561 s, 96,1 MB/s

real    0m10.658s
user    0m0.164s
sys 0m1.772s

bs = 1k (ชดเชยการอ่านเพื่อหลีกเลี่ยงการแคช)

root@iMac-Chiara:/tmp# time dd if=/dev/sda3 of=/dev/null bs=1M count=1000 skip=7000
1000+0 record dentro
1000+0 record fuori
1048576000 byte (1,0 GB) copiati, 10,7391 s, 97,6 MB/s

real    0m10.792s
user    0m0.008s
sys 0m1.144s

11
สิ่งที่ดีจริง ๆ คือมีbs=autoคุณลักษณะddที่จะตรวจจับและใช้พารามิเตอร์ bs ที่เหมาะสมจากอุปกรณ์

4
สิ่งที่จะเป็นสิ่งที่ดีมากคือกราฟที่มีหลายbsขนาดพล็อตกับความเร็วแทนที่จะเป็นบล็อคโค้ด 15 โหลในคำถามเดียว จะใช้พื้นที่น้อยลงและอ่านเร็วขึ้นอย่างไม่ จำกัด รูปภาพมีค่าอย่างแท้จริงสำหรับคำศัพท์สองคำ
MDMoore313

2
@BigHomie - ฉันคิดเกี่ยวกับการให้กราฟ แต่ ... มีปัญหา "การปรับขนาด" หลายอย่าง มันคงต้องเป็นมาตราส่วนลอการิทึมทั้งแกนและ ... ในขณะที่คิดสิ่งนี้ฉันก็คิดว่ามันไม่ใช่ปัญหาง่าย ๆ (และรวดเร็ว) ในการแก้ปัญหา ดังนั้นฉันจึงเปลี่ยนเป็นรุ่น "ตาราง" สำหรับ "... 15 บล็อคโค้ดโหล" ฉันต้องการให้ทุกคนมีโอกาสตรวจสอบ "หมายเลขดิบ" เพื่อหลีกเลี่ยงการรบกวนใด ๆ (ส่วนตัวของฉัน)
Damiano Verzulli

1
@DamianoVerzulli โต๊ะนั้นเจ๋งได้โปรดเพิกเฉยต่อคำพูดของฉันฉันให้คุณ upvote เพื่อพิสูจน์ความเชื่อโชคลางของเราต่อไปและฉันรู้ทันทีว่าการเล่นกับขนาดไบต์จะเปลี่ยนความเร็วฉันอาจใส่คำตอบลงไปด้วย
MDMoore313

1
@warren - เพื่อให้ได้ 4G คุณสามารถทำได้bs=8k count=512Kหรือbs=1M count=4Kฉันจำไม่ได้ว่าเป็นพลังของ 2 ที่ผ่านมา 65536
user313114

คำตอบ:


24

สิ่งที่คุณทำคือการทดสอบความเร็วในการอ่าน หากคุณกำลังคัดลอกบล็อกไปยังอุปกรณ์อื่นที่คุณหยุดการอ่านชั่วคราวในขณะที่อุปกรณ์อื่นกำลังรับข้อมูลที่คุณต้องการเขียนเมื่อสิ่งนี้เกิดขึ้นคุณสามารถประสบปัญหาความล่าช้าในการตอบสนองการหมุนของอุปกรณ์อ่าน (ถ้าเป็นฮาร์ดดิสก์) บ่อยครั้งที่การอ่าน 1M เร็วขึ้นอย่างมีนัยสำคัญเมื่อปิด HDD เนื่องจากคุณพบความล่าช้าในการหมุนน้อยลง

ฉันรู้เมื่อฉันคัดลอกฮาร์ดดิสก์ที่ฉันได้รับอัตราที่เร็วขึ้นโดยการระบุbs=1Mกว่าโดยใช้bs=4kหรือเริ่มต้น ฉันกำลังพูดถึงการปรับปรุงความเร็ว 30 ถึง 300 เปอร์เซ็นต์ ไม่จำเป็นต้องปรับแต่งมันให้ดีที่สุดอย่างแน่นอนเว้นแต่จะเป็นทุกสิ่งที่คุณทำทุกวัน แต่การเลือกสิ่งที่ดีกว่าค่าเริ่มต้นสามารถลดเวลาในการดำเนินการลงได้

เมื่อคุณกำลังใช้มันจริงลองตัวเลขที่แตกต่างกันไม่กี่และส่งddกระบวนการSIGUSR1สัญญาณจะได้รับมันในการรายงานสถานะเพื่อให้คุณสามารถดูว่ามันจะ

✗ killall -SIGUSR1 dd
1811+1 records in
1811+1 records out
1899528192 bytes (1.9 GB, 1.8 GiB) copied, 468.633 s, 4.1 MB/s

2014 Macbook คัดลอก Retina Pro เพื่อ USB3 ติดในอันดับที่ 90 MB / s เขียน: แสดงให้เห็นว่า$ sudo dd if=~/Downloads/Qubes-R4.0-rc4-x86_64.iso of=/dev/rdisk2 status=progress 6140928 bytes (6.1 MB, 5.9 MiB) copied, 23 s, 267 kB/sฉันยกเลิกสิ่งนี้เนื่องจากใช้เวลานานเกินไป ตอนนี้ระบุ bytesize: $ sudo dd if=~/Downloads/Qubes-R4.0-rc4-x86_64.iso of=/dev/rdisk2 bs=1M status=progressรายการ4558159872 bytes (4.6 GB, 4.2 GiB) copied, 54 s, 84.4 MB/s
Eric Duncan

9

อย่างน้อยก็ในเรื่องที่เกี่ยวกับฮาร์ดดิสก์ภายในเมื่อคุณอ่านจากอุปกรณ์เลเยอร์บล็อกอย่างน้อยต้องดึงข้อมูลเซ็กเตอร์หนึ่งอันซึ่งมีขนาด 512 ไบต์

ดังนั้นเมื่อจัดการอ่าน 1 ไบท์คุณจะอ่านจากดิสก์บนเซกเตอร์ที่ดึงข้อมูลด้วยไบต์เท่านั้น ส่วนที่เหลืออีก 511 ครั้งจะให้บริการโดยแคช

คุณสามารถพิสูจน์ได้ดังนี้ในตัวอย่างsdbนี้เป็นดิสก์ที่สนใจ:

# grep sdb /proc/diskstats
8      16 sdb 767 713 11834 6968 13710 6808 12970792 6846477 0 76967 6853359
...
# dd if=/dev/sdb of=/dev/null bs=1 count=512
512+0 records in
512+0 records out
512 bytes (512 B) copied, 0.0371715 s, 13.8 kB/s
# grep sedb /proc/diskstats
8      16 sdb 768 713 11834 6968 13710 6808 12970792 6846477 0 76967 6853359
...

คอลัมน์ที่สี่ (ซึ่งมีจำนวนการอ่าน) บ่งชี้ว่ามีการอ่านเกิดขึ้นเพียง 1 ครั้งถึงแม้ว่าคุณจะร้องขอการอ่าน 1 ไบต์ก็ตาม นี่เป็นพฤติกรรมที่คาดว่าจะเกิดขึ้นเนื่องจากอุปกรณ์นี้ (ดิสก์ SATA 2) จะต้องส่งคืนขนาดอย่างน้อยที่สุด เคอร์เนลก็คือการแคชภาคทั้งหมด

ปัจจัยที่ใหญ่ที่สุดที่เล่นในคำขอขนาดเหล่านี้คือค่าใช้จ่ายในการออกสายระบบสำหรับการอ่านหรือเขียน ความจริงแล้วการออกสายสำหรับ <512 นั้นไม่มีประสิทธิภาพ การอ่านที่มีขนาดใหญ่มากจำเป็นต้องใช้การเรียกของระบบน้อยกว่าด้วยค่าใช้จ่ายของหน่วยความจำเพิ่มเติมที่ใช้ในการทำ

โดยทั่วไปแล้ว 4096 จะเป็นหมายเลข 'ปลอดภัย' สำหรับการอ่านเนื่องจาก:

  • เมื่ออ่านโดยใช้แคช (ค่าเริ่มต้น) หน้าเว็บคือ 4k การเติมหน้าด้วยการอ่าน <4k มีความซับซ้อนมากกว่าการทำให้ขนาดการอ่านและขนาดหน้าเท่าเดิม
  • ขนาดบล็อกระบบไฟล์ส่วนใหญ่ตั้งไว้ที่ 4k
  • มีจำนวนไม่เพียงพอ (อาจเป็นเพราะ SSD ตอนนี้) ทำให้เกิดค่าใช้จ่ายสูงกว่า syscall แต่มีจำนวนไม่มากพอที่จะใช้หน่วยความจำจำนวนมาก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.