emmc 파티션의 최적 정렬을 달성하는 방법은 무엇입니까?

emmc 파티션의 최적 정렬을 달성하는 방법은 무엇입니까?

우리는 eMMC를 포함하는 bbb 기반의 맞춤형 보드를 가지고 있습니다.
우리는 다음과 같은 파티션을 만들었습니다.

parted --script -a minimal /dev/mmcblk0 \
  mklabel gpt \
  mkpart primary 131072B 262143B \
  mkpart primary 262144B 393215B \
  mkpart primary 393216B 524287B \
  mkpart primary 524288B 1572863B \
  mkpart primary 1572864B 2621439B \ 
  mkpart primary 2621440B 3145727B \
  mkpart primary 3145728B 3276799B \ 
  mkpart primary 3276800B 8519679B \
  mkpart primary 8519680B 13762559B \
  mkpart primary 13762560B 19005439B \
  mkpart primary 19005440B 19267583B \
  mkpart primary 19267584B 19529727B \
  mkpart primary 19529728B 19791871B \
  mkpart primary 20MiB 31MiB \
  mkpart primary ext4 32MiB 232MiB \
  mkpart primary ext4 232MiB 432MiB \
  mkpart primary ext4 432MiB 532MiB \
  mkpart primary ext4 532MiB 592MiB \
  mkpart primary ext4 592MiB 792MiB \
  mkpart primary ext4 792MiB 827MiB \
  mkpart primary ext4 827MiB 3650MiB \

위 명령을 사용하면 eMMC를 분할할 수 있지만 정렬을 최소로 설정할 수 있습니다. 어떻게 최적의 정렬을 달성할 수 있는지 확인하고 싶습니다. 최적의 정렬을 달성하면 어떤 이점이 있습니까? 나는 언급했다이것링크하지만 parted -a opt /dev/sdb mkpart primary 0% 100%다음 구조가 필요하기 때문에 유사한 솔루션을 사용할 수 없습니다.

# parted --list
Model: MMC MMC04G (sd/mmc)
Disk /dev/mmcblk0: 3842MB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number  Start   End     Size    File system  Name        Flags
 1      131kB   262kB   131kB                
 2      262kB   393kB   131kB                
 3      393kB   524kB   131kB                
 4      524kB   1573kB  1049kB               
 5      1573kB  2621kB  1049kB               
 6      2621kB  3146kB  524kB                
 7      3146kB  3277kB  131kB                
 8      3277kB  8520kB  5243kB               
 9      8520kB  13.8MB  5243kB               
10      13.8MB  19.0MB  5243kB               
11      19.0MB  19.3MB  262kB                
12      19.3MB  19.5MB  262kB                
13      19.5MB  19.8MB  262kB                
14      21.0MB  32.5MB  11.5MB               
15      33.6MB  243MB   210MB   ext4         
16      243MB   453MB   210MB   ext4         
17      453MB   558MB   105MB   ext4         
18      558MB   621MB   62.9MB  ext4         
19      621MB   830MB   210MB   ext4         
20      830MB   867MB   36.7MB  ext4         
21      867MB   3827MB  2960MB  ext4         

현재 명령의 경우 다음 minimal으로 바꾸면 optimalparted에서 다음 메시지가 표시됩니다.

Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.
Warning: The resulting partition is not properly aligned for best performance.

최적의 정렬을 달성하기 위한 조언/제안/수정 사항이 있습니까?

제안대로이것링크 다음 값을 추출했습니다.

# cat /sys/class/mmc_host/mmc1/mmc1\:0001/block/mmcblk0/queue/optimal_io_size
0
# cat /sys/class/mmc_host/mmc1/mmc1\:0001/block/mmcblk0/queue/minimum_io_size
512
# cat /sys/class/mmc_host/mmc1/mmc1\:0001/block/mmcblk0/alignment_offset
0
# cat /sys/class/mmc_host/mmc1/mmc1\:0001/block/mmcblk0/queue/physical_block_siz
e
512

mmc utils는 다음과 같은 출력을 제공합니다.

# ./mmc extcsd read /dev/mmcblk0
=============================================
  Extended CSD rev 1.5 (MMC 4.41)
=============================================

Card Supported Command sets [S_CMD_SET: 0x01]
HPI Features [HPI_FEATURE: 0x03]: implementation based on CMD12
Background operations support [BKOPS_SUPPORT: 0x01]
Background operations status [BKOPS_STATUS: 0x02]
1st Initialisation Time after programmed sector [INI_TIMEOUT_AP: 0x7a]
Power class for 52MHz, DDR at 3.6V [PWR_CL_DDR_52_360: 0x00]
Power class for 52MHz, DDR at 1.95V [PWR_CL_DDR_52_195: 0x00]
Minimum Performance for 8bit at 52MHz in DDR mode:
 [MIN_PERF_DDR_W_8_52: 0x00]
 [MIN_PERF_DDR_R_8_52: 0x00]
TRIM Multiplier [TRIM_MULT: 0x06]
Secure Feature support [SEC_FEATURE_SUPPORT: 0x15]
Secure Erase Multiplier [SEC_ERASE_MULT: 0x02]
Secure TRIM Multiplier [SEC_TRIM_MULT: 0x03]
Boot Information [BOOT_INFO: 0x07]
 Device supports alternative boot method
 Device supports dual data rate during boot
 Device supports high speed timing during boot
Boot partition size [BOOT_SIZE_MULTI: 0x10]
Access size [ACC_SIZE: 0x06]
High-capacity erase unit size [HC_ERASE_GRP_SIZE: 0x08]
 i.e. 4096 KiB
High-capacity erase timeout [ERASE_TIMEOUT_MULT: 0x01]
Reliable write sector count [REL_WR_SEC_C: 0x01]
High-capacity W protect group size [HC_WP_GRP_SIZE: 0x01]
 i.e. 4096 KiB
Sleep current (VCC) [S_C_VCC: 0x08]
Sleep current (VCCQ) [S_C_VCCQ: 0x08]
Sleep/awake timeout [S_A_TIMEOUT: 0x10]
Sector Count [SEC_COUNT: 0x00728000]
 Device is block-addressed
Minimum Write Performance for 8bit:
 [MIN_PERF_W_8_52: 0x08]
 [MIN_PERF_R_8_52: 0x08]
 [MIN_PERF_W_8_26_4_52: 0x08]
 [MIN_PERF_R_8_26_4_52: 0x08]
Minimum Write Performance for 4bit:
 [MIN_PERF_W_4_26: 0x08]
 [MIN_PERF_R_4_26: 0x08]
Power classes registers:
 [PWR_CL_26_360: 0x00]
 [PWR_CL_52_360: 0x00]
 [PWR_CL_26_195: 0x00]
 [PWR_CL_52_195: 0x00]
Partition switching timing [PARTITION_SWITCH_TIME: 0x01]
Out-of-interrupt busy timing [OUT_OF_INTERRUPT_TIME: 0x02]
Card Type [CARD_TYPE: 0x07]
 HS Dual Data Rate eMMC @52MHz 1.8V or 3VI/O
 HS eMMC @52MHz - at rated device voltage(s)
 HS eMMC @26MHz - at rated device voltage(s)
CSD structure version [CSD_STRUCTURE: 0x02]
Command set [CMD_SET: 0x00]
Command set revision [CMD_SET_REV: 0x00]
Power class [POWER_CLASS: 0x00]
High-speed interface timing [HS_TIMING: 0x01]
Erased memory content [ERASED_MEM_CONT: 0x00]
Boot configuration bytes [PARTITION_CONFIG: 0x00]
 Not boot enable
 No access to boot partition
Boot config protection [BOOT_CONFIG_PROT: 0x00]
Boot bus Conditions [BOOT_BUS_CONDITIONS: 0x00]
High-density erase group definition [ERASE_GROUP_DEF: 0x01]
Boot write protection status registers [BOOT_WP_STATUS]: 0x00
Boot Area Write protection [BOOT_WP]: 0x00
 Power ro locking: possible
 Permanent ro locking: possible
 ro lock status: not locked
User area write protection register [USER_WP]: 0x00
FW configuration [FW_CONFIG]: 0x00
RPMB Size [RPMB_SIZE_MULT]: 0x01
Write reliability setting register [WR_REL_SET]: 0x00
 user area: existing data is at risk if a power failure occurs during a write operation
 partition 1: existing data is at risk if a power failure occurs during a write operation
 partition 2: existing data is at risk if a power failure occurs during a write operation
 partition 3: existing data is at risk if a power failure occurs during a write operation
 partition 4: existing data is at risk if a power failure occurs during a write operation
Write reliability parameter register [WR_REL_PARAM]: 0x05
 Device supports writing EXT_CSD_WR_REL_SET
 Device supports the enhanced def. of reliable write
Enable background operations handshake [BKOPS_EN]: 0x00
H/W reset function [RST_N_FUNCTION]: 0x00
HPI management [HPI_MGMT]: 0x01
Partitioning Support [PARTITIONING_SUPPORT]: 0x03
 Device support partitioning feature
 Device can have enhanced tech.
Max Enhanced Area Size [MAX_ENH_SIZE_MULT]: 0x0001ca
 i.e. 1875968 KiB
Partitions attribute [PARTITIONS_ATTRIBUTE]: 0x00
Partitioning Setting [PARTITION_SETTING_COMPLETED]: 0x00
 Device partition setting NOT complete
General Purpose Partition Size
 [GP_SIZE_MULT_4]: 0x000000
 [GP_SIZE_MULT_3]: 0x000000
 [GP_SIZE_MULT_2]: 0x000000
 [GP_SIZE_MULT_1]: 0x000000
Enhanced User Data Area Size [ENH_SIZE_MULT]: 0x000000
 i.e. 0 KiB
Enhanced User Data Start Address [ENH_START_ADDR]: 0x000000
 i.e. 0 bytes offset
Bad Block Management mode [SEC_BAD_BLK_MGMNT]: 0x00

편집하다: "Глеб Майоров"에서 제안한 대로 최적의 정렬을 달성했으며 처음 3개 파티션(변경할 수 없음)을 제외하고 모든 작은 파티션을 최소 1MiB 크기로 변경했습니다. 그리고 3개의 파티션을 제외한 모든 파티션이 정렬된 것으로 보입니다. 이것은 eMMC에 대한 최신 파티셔닝 스크립트입니다. (참고하세요: 아래 스크립트에서는 위 스크립트에서 파티션 크기를 변경했습니다)

parted --script -a optimal /dev/mmcblk0 \
  mklabel gpt \
  mkpart primary 128KiB 255KiB \
  mkpart primary 256KiB 383KiB \
  mkpart primary 384KiB 511KiB \
  mkpart primary 1MiB 2MiB \
  mkpart primary 2MiB 3MiB \ 
  mkpart primary 3MiB 4MiB \
  mkpart primary 4MiB 5MiB \ 
  mkpart primary 5MiB 10MiB \
  mkpart primary 10MiB 15MiB \
  mkpart primary 15MiB 20MiB \
  mkpart primary 20MiB 21MiB \
  mkpart primary 21MiB 22MiB \
  mkpart primary 22MiB 23MiB \
  mkpart primary 23MiB 30MiB \
  mkpart primary ext4 30MiB 530MiB \
  mkpart primary ext4 530MiB 1030MiB \
  mkpart primary ext4 1030MiB 1130MiB \
  mkpart primary ext4 1130MiB 1190MiB \
  mkpart primary ext4 1190MiB 1720MiB \
  mkpart primary ext4 1720MiB 1755MiB \
  mkpart primary ext4 1755MiB 100%

답변1

eMMC 삭제 블록 크기를 일관성 있게 유지하세요. eMMC 데이터시트에 따라 일반적으로 0.5, 1, 2, 4, 8MiB와 같습니다. 블록 크기 정렬로 인해 메모리가 너무 많이 낭비되는 경우 일반적으로 4..16KiB 범위의 페이지 크기를 유지하세요.

파일 시스템이 첫 번째 또는 마지막 FS 블록을 쓸 때 메모리 카드가 다음/이전 파티션의 시작/끝을 지우고 다시 쓸 필요가 없도록 파티션 크기와 경계를 지우기 블록 크기의 배수로 만드십시오.

정렬 기능에 의존하지 말고 parted계산기, 펜, 종이를 사용하여 섹터 또는 바이트 단위로 올바른 경계를 파악하세요.

개인적으로 저는 너무 많은 메모리를 낭비하지 않고 모든 파티션이 특정 삭제 블록 크기에 관계없이 삭제 블록 경계에서 시작하고 끝나기 때문에 8MiB 경계에 정렬하는 것을 선호하므로 메모리 카드 문서를 검색할 필요가 없습니다.

최적의 정렬은 쓰기 증폭 요소를 줄여 메모리가 더 오래 지속됩니다.

답변2

대답은 디스크에 따라 다릅니다. parted오류 메시지 표시

not aligned: 2048s % 65535s != 0s

Kingston SA400M8120G를 파티션하려고 할 때. 그러나 Samsung 980 PRO 250GB는 경고 없이 임의로 파티션이 분할될 수 있습니다. dmesgKingston 드라이브를 연결하면(USB → NVMe 어댑터를 통해) 로그에 메시지가 나타납니다.

[81602.009178] scsi 6:0:0:0: Direct-Access     ASMT     2115             0    PQ: 0 ANSI: 6
[81602.010206] sd 6:0:0:0: Attached scsi generic sg1 type 0
[81602.021292] sd 6:0:0:0: [sda] 234441648 512-byte logical blocks: (120 GB/112 GiB)
[81602.021390] sd 6:0:0:0: [sda] Write Protect is off
[81602.021395] sd 6:0:0:0: [sda] Mode Sense: 43 00 00 00
[81602.021619] sd 6:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[81602.021903] sd 6:0:0:0: [sda] Optimal transfer size 33553920 bytes
[81602.061285] sd 6:0:0:0: [sda] Attached SCSI disk

가장 중요한 정보는 Optimal transfer size 33553920 bytes"최상의 정렬"을 위해 파티션이 33553920(= 65535 × 512) 바이트의 정수 배수에서 시작해야 한다는 것입니다.

기반으로최고의 성능을 위해 parted를 사용하여 파티션을 정렬하는 방법파일 시스템을 쿼리하여 정렬 문제를 해결했습니다 sys. 파티션할 디스크는 이고 /dev/sda, 시스템은 현재(2020-12-22) Archlinux, 커널 5.9.14-arch1-1, parted개정판 3.3입니다:

DISK="sda"
OPTIMAL_IO_SIZE=$(cat /sys/block/${DISK}/queue/optimal_io_size)
ALIGNMENT_OFFSET=$(cat /sys/block/${DISK}/alignment_offset)
PHYSICAL_BLOCK_SIZE=$(cat /sys/block/${DISK}/queue/physical_block_size)

이러한 변수를 사용하여 파티션의 시작 섹터를 계산할 수 있습니다. 값을 알고 조정하세요 OPTIMAL_IO_SIZE.PHYSICAL_BLOCK_SIZE마법11에서 128 사이의 숫자:

START_EFI=$(((OPTIMAL_IO_SIZE+ALIGNMENT_OFFSET)/PHYSICAL_BLOCK_SIZE))
START_SWAP=$((START_EFI+11*OPTIMAL_IO_SIZE/PHYSICAL_BLOCK_SIZE))
START_ROOT=$((START_SWAP+128*OPTIMAL_IO_SIZE/PHYSICAL_BLOCK_SIZE))

이 지식을 바탕으로 호출은 parted간단합니다.

parted -s -a optimal /dev/${DISK} mklabel gpt \
 mkpart "Efi"  fat32      ${START_EFI}s  $((START_SWAP-1))s \
 mkpart "Swap" linux-swap ${START_SWAP}s $((START_ROOT-1))s \
 mkpart "root" ext4       ${START_ROOT}s  100% \
 set 1 esp on \
 print

정렬이 올바른지 확인합니다.

parted /dev/sda align-check optimal 1 \
 align-check optimal 2 \
 align-check optimal 3

출력은 다음과 같습니다.

1 aligned
2 aligned
3 aligned

언급했듯이 위의 답변은 "Kingston SA400M8120G"에 대한 것입니다. 0과 다른 "최적 전송 크기"를 보고하는 다른 장치(SATA 드라이브, SDCard, NVMe 드라이브, USB 스틱)를 찾지 못했다는 점을 인정해야 합니다. 이것으로부터 후면 드라이브에는 특별한 정렬이 필요하지 않다는 결론을 내릴 수 있습니다. parted이에 대한 정렬 경고를 보고하지 않습니다 .

관련 정보