สรุป
ฉันพยายามที่จะเข้าใจวิธีการคำนวณการจัดตำแหน่งของพาร์ทิชันที่ตามมาของการจัดตำแหน่งที่ดีที่สุด32MiB
( 65535
ภาค) ค่อนข้างปกติ1MiB
( 2048 sector
)
พื้นหลัง
ฉันเพิ่งซื้อSAMSUNG SSD 850 EVO (M.2 1TB)
,
# cat /sys/block/sdx/queue/optimal_io_size
> 33553920
# cat /sys/block/sdx/queue/minimum_io_size
> 512
# cat /sys/block/sdx/alignment_offset
> 0
# cat /sys/block/sdx/queue/physical_block_size
> 512
# cat /sys/block/sdx/queue/logical_block_size
> 512
# cat /sys/block/sdx/queue/hw_sector_size
> 512
# fdisk -l
> Disk /dev/sdx: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
> Units: sectors of 1 * 512 = 512 bytes
> Sector size (logical/physical): 512 bytes / 512 bytes
> I/O size (minimum/optimal): 512 bytes / 33553920 bytes
> Disklabel type: gpt
การคำนวณภาคแรกนั้นไม่ยาก
อนุญาตให้ GNU แยกส่วนเพื่อคำนวณการจัดตำแหน่งโดยอัตโนมัติ
(parted) mkpart primary 0% 100%
- https://wiki.archlinux.org/index.php/GNU_Parted#Alignment
- cf https://unix.stackexchange.com/questions/38164/create-partition-aligned-using-parted
ผลลัพธ์คือการจัดตำแหน่งที่เริ่มต้นที่เซกเตอร์65535
( 32MiB
)
คำนวณการจัดตำแหน่งด้วยตนเอง
(optimal_io_size + alignment_offset) / physical_block_size
- จากวิธีการจัดแนวพาร์ติชันเพื่อประสิทธิภาพที่ดีที่สุดโดยใช้ Partedโดย Ian Chard เมื่อวันที่ 30 มกราคม 2013อ้างอิง Red Hat Enterprise Linux 6 - การสร้างพาร์ติชัน 7TB โดยใช้ Parted แสดงให้เห็นเสมอ "พาร์ติชันที่ได้
การใช้ข้อมูลสำหรับSAMSUNG SSD 850 EVO (M.2 1TB)
และการใช้สูตรผลลัพธ์
(33553920 + 0) / 512 = 65 535
ปัญหา
โดยปกติเมื่อสร้างพาร์ติชันฉันเพียงแค่เพิ่มoffset + length
พาร์ติชั่นก่อนหน้าเป็นการเริ่มพาร์ติชั่นถัดไปตัวอย่างเช่น
(parted) mkpart primary 1MiB 2MiB
(parted) mkpart primary 2MiB 514MiB
(parted) mkpart primary 514MiB 1538MiB
...
พยายามทำสิ่งที่คล้ายกัน SAMSUNG SSD 850 EVO (M.2 1TB)
(parted) mkpart primary 65535s 67582s # OK ~32MiB 33MiB
(parted) mkpart primary 67583s 100%
or
(parted) mkpart primary 33MiB 100%
ผลลัพธ์ในคำเตือนต่อไปนี้:
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel?
วิธีการรักษา
ไดรฟ์ค่อนข้างพิถีพิถันและความพยายามที่ดีที่สุดของฉันคือการคำนวณภาคที่แน่นอน โชคไม่ดีที่สิ่งนี้ส่งผลให้เกิดการคำนวณที่ซับซ้อนซึ่งฉันไม่สามารถอธิบายได้ว่าเหตุใดพาร์ติชันจึงถูกจัดตำแหน่งอย่างเหมาะสม ( align-check optimal <partition number>
)
(parted) unit s
(parted) print free
Number Start End Size File system Name Flags
34s 65534s 65501s Free Space
1 65535s 67582s 2048s
67583s 131069s 63487s Free Space
2 131070s 1179645s 1048576s
1179646s 1245164s 65519s Free Space
3 1245165s 9633772s 8388608s
9633773s 9699179s 65407s Free Space
4 9699180s 1953467279s 1943768100s
1953467280s 1953525134s 57855s Free Space
เท่าที่ฉันสามารถบอกได้ว่าแต่ละภาคส่วนจะต้องเริ่มต้นใน65535
ช่วงเวลาหนึ่งซึ่งสอดคล้องกับ ~ 32MiB (หรือ65535+1 = 32MiB
) ฉันคิดว่าไบต์ชดเชยและไม่ได้0
1
ป.ร. ให้1MiB = 2048s
ไว้
ขนาดพาร์ทิชันแรกคือการเป็นจึงหยุดคือ1MiB
65535 + 2048 - 1 = 67582
(parted) mkpart primary 65535s 67582s
ถ้าพาร์ติชันที่ผ่านมาต่ำกว่าพาร์ทิชันต่อไปเพียงแค่เริ่มต้นที่32MiB
previous partition offset + 32MiB
สำหรับพาร์ติชัน2
ในตัวอย่างที่แยกส่วนด้านบนจะเริ่มต้นที่~64MiB
( 65535s * 2 = 131070s
) ขนาดที่จะเป็น512MiB
( 512 * 2048 = 1048576
) 131070 + 1048576 - 1 = 1179645
ดังนั้นหยุดคือ
(parted) mkpart primary 131070s 1179645s
จนถึงตอนนี้ดี แต่สิ่งที่จะเริ่มต้นที่ดีที่สุดสำหรับพาร์ทิชัน3
? ออฟเซ็ตใดเป็นช่วงเวลา 32MiB แรกที่มีอยู่
1179645 / 65535 ~= 18,000223
ขณะนี้ใช้ช่วงเวลา 18 และหกในวันที่ 19; พาร์ติชันถัดไปควรเริ่มต้นในช่วงเวลาที่ 19 หรือไม่
19 * 65535 = 1245165
ขนาดที่จะเป็น4096MiB
( 4096 * 2048 = 8388608
) 1245165 + 8388608 - 1 = 9633772
ดังนั้นหยุดคือ
(parted) mkpart primary 1245165s 9633772
สำหรับพาร์ติชั่นถัดไป
9633772 / 65535 ~= 147,0019
148 * 65535 = 9699180
และอื่น ๆ และอื่น ๆ.
ฉันไม่เคยพบการสนทนาใด ๆ เกี่ยวกับเรื่องนี้มาก่อนและรู้สึกเหมือนกำลังแบ่งพาร์ติชันมากเกินไป
gdisk verify disk
ผลลัพธ์ในCaution: Partition [1-4] doesn't begin on a 8-sector boundary. This may result in degraded performance on some modern (2009 and later) hard disks.