Оптимізація розміру логічного сектору для фізичного розміру 4096 HDD


20

З багатьма новими жорсткими дисками фізичний розмір сектора становить 4096. Чи можна було б змусити систему використовувати логічний розмір сектору того ж розміру, а не розмір логічного сектора за замовчуванням 512?

Чи прискорить це масове читання та запис? Де це можна налаштувати?


Дивіться unix.stackexchange.com/a/18542/1131 для коментарів щодо питань вирівнювання. Останні версії програми mkfs.*повинні автоматично використовувати оптимальний розмір сектору. Ви можете зробити кілька mkfs.*тестів і перевірити результат (або у багатослівному виведенні mkfs, або у відповідній програмі fs).
maxschlepzig

Дякую, але жодних проблем із вирівнюванням
Матан

Відповіді:


29

512 байт насправді не є типовим розміром сектора. Це залежить від вашого обладнання.

Ви можете відобразити, які фізичні / логічні сектори розміщують звіти вашого диска через /sysпсевдофайлову систему, наприклад:

# cat /sys/block/sda/queue/physical_block_size
4096
# cat /sys/block/sda/queue/logical_block_size
512

Яка різниця між цими двома значеннями?

  • physical_block_sizeЄ мінімальним розміром блоку привід має можливість писати в атомарної операції.
  • logical_block_sizeНайменший розмір диск здатний писати (див документації ядра Linux).

Таким чином, якщо у вас диск 4k, має сенс, що ваш стек зберігання даних (файлова система тощо) використовує щось рівне або більше, ніж розмір фізичного сектора.

Ці значення також відображаються в останніх версіях fdisk, наприклад:

# fdisk -l /dev/sda
[..]
Sector size (logical/physical): 512 bytes / 4096 bytes

У поточних дистрибутивах Linux такі програми (які повинні піклуватися про оптимальний розмір сектору), як-от mkfs.xfs, виберуть оптимальний розмір сектору за замовчуванням (наприклад, 4096 байт).

Але ви також можете чітко вказати це за допомогою параметра, наприклад:

# mkfs.xfs -f -s size=4096 /dev/sda

Або:

# mkfs.ext4 -F -b 4096 /dev/sda

У будь-якому випадку, більшість mkfsваріантів також відображатиме використаний розмір блоку під час виконання.

Для існуючої файлової системи розмір блоку можна визначити за допомогою команди типу:

# xfs_info /mnt
[..]
meta-data=                       sectsz=4096
data     =                       bsize=4096
naming   =version 2              bsize=4096
log      =internal               bsize=4096
         =                       sectsz=4096
realtime =none                   extsz=4096

Або:

# tune2fs -l /dev/sda
Block size:               4096
Fragment size:            4096

Або:

# btrfs inspect-internal dump-super /dev/sda | grep size
csum_size             4
sys_array_size        97
sectorsize            4096
nodesize              16384
leafsize              16384
stripesize            4096
dev_item.sector_size  4096

Створюючи файлову систему на розділі, ще одна річ, яку потрібно перевірити, - це те, чи дійсно адреса початкового розділу розділена на фізичний розмір блоку. Наприклад, подивіться на fdisk -lвихід, конвертуйте початкові адреси в байти, розділіть їх на фізичний розмір блоку - якщо нагадування вирівняно, нагадування має бути нульовим.


Дякую, ваше роз'яснення того, що Linux описує як логічний та фізичний розміри блоків, було дуже корисним. Нещодавно я потрапив у ситуацію, коли той самий жорсткий диск 8 ТБ виявився як 512-байтний блок в одному USB-корпусі, а 4К-блок - в іншому, як логічний, так і фізичний. Я подумав, що щось не так, тому що Linux не бачив карту розділів, коли я міняв корпуси, але тоді я виявив, що GPT запускається на другому логічному блоці, тому він був просто в неправильному місці для нового вирівнювання. Я використовував gdisk для відтворення одного єдиного великого розділу, і всі мої дані все ще були там (ext4 з 4K блоками).
Raptor007

Надійний описаний вами метод перевірки вирівнювання? Я використав утиліту "розірваний", і вона повідомила, що hdd-розділ вирівнюється, але з вашим підходом я запитав фізичний розмір блоку, отримав 512, потім взяв стартову адресу розділу fdisk -l, поділив його на 8, а потім на 512. залишок не був 0, тому розділ, схоже, не вирівняно
user907860

1
@ user907860 Чому ви ділитесь на 8? А fdisk -lзвіти Units = sectors of 1 * 512 = 512 bytesв одному з моїх систем Linux - таким чином, для 512/4096 логічного / фізичного диска з 2 - ма перегородками , починаючи з 2048 і 1026048 я обчислюю 2048*512%4096і 1026048*512%4096- наприклад , в оболонці Python. Оскільки обидва вирази дорівнюють нулю, ці розділи вирівнюються в 4 к.
maxschlepzig

велике дякую за пояснення, я не помітив, що кількість була секторами, а не бітами. Я відповів на відповідь пару місяців тому, на жаль, не можу зробити це знову
user907860

2

Ні, це неможливо, і не мало б значення, якби це було. IO, як правило, робиться в одиницях щонайменше 4096 байтів, і, як правило, набагато більше.


2
Не впевнений, як це твердження стосується мого питання. Логічний розмір сектора може означати менші шматки в якійсь частині трубопроводу IO, а також непотрібну емуляцію прошивки жорсткого диска. Хочете уточнити?
Матан

2
@Matan, я взагалі не можу мати сенсу з вашого коментаря. Я пояснив, що IO не виконує 512 байтів одночасно, тому той факт, що диск адресується в 512 байтових секторах, не має значення. Єдиний раз, коли диск повинен виконати будь-яку емуляцію, це якщо ви спробуєте зробити запис, який не вирівняний у 4 кб, і оскільки IO зазвичай робиться у кількох розмірах 4k, а сучасні інструменти розділення переконайтеся, що розділ починається на межі 4k, цього не станеться.
psusi

1
Ця "відповідь" є цілком помилковою, як у своїх твердженнях, так і у висновках. Логічний розмір встановлюється під час форматування гучності. Невідповідність між логічним та фізичним розмірами має певну вартість у таких технологіях, як флеш-пам’ять.
Кріс Страттон

@ChrisStratton, ні, ви думаєте про розмір блоку / кластера файлової системи. Логічний розмір сектору - це розмір сектора, про який накопичувач повідомляє ОС, і він може читати і записувати одиниці такого розміру або кратні цього розміру, а сектори нумеруються одиницями такого розміру. Порівняйте з розміром фізичного сектора, де деякі накопичувачі фактично читають і записують внутрішньо 4 к сектори, але роблять вигляд, що вони використовують 512 байтові сектори для зворотної сумісності зі старими операційними системами, які не можуть мати справу з логічними секторами 4 к.
psusi

Неправильно. Проблема існує в будь-який час, коли програмне забезпечення намагається працювати на одиницях, менших за фізичний розмір системи зберігання. Особливо це стосується логічних одиниць, менших за розмір блоку флеш-стирання - програмне забезпечення в кінцевому підсумку потребує дублювання недоторканих частин до нового фізичного блоку, що вимагає стирання життя, незалежно від того, чи це робиться за допомогою файлового коду файлової системи операційної системи чи коду внутрішній для накопичувача.
Кріс Страттон

1

Так, можливо, однак це може призвести до наповнення накопичувача набагато швидше, ніж слід. Для файлів менше 512 Кб кожен файл забирає тоді цілі 4096 Кб (4 МБ) і заповнює решту сектору 0, через неможливість більшості файлових систем (NTFS тощо) дозволяти файлам ділитися секторами. Найкращим варіантом для файлової системи було б дозволити змінні розміри сектору, однак це збільшує розмір MFT (головна таблиця файлів) і збільшує ризик пошкодження даних, зменшуючи при цьому можливість легкого відновлення даних. Іншими словами, програмне забезпечення для відновлення не буде повністю відоме межі. Таким чином, хоча розмір логічного сектору 4096K є приголомшливим для великих файлів, для звичайного ПК для щоденного використання, це лише купа 0. Тепер, сказав, є можливість зберігання даних у самій MFT, якщо мова йде про дані, менші за розмір логічного сектора. Це, однак, означає, що ваш MFT стає величезним і дані будуть записуватися двічі (на вашому жорсткому диску є дві копії MFT). Вам також доведеться вказати максимальний розмір MFT, який може спричинити проблеми, коли ви досягнете його максимуму або використання накопичувача перевищує те, що було б безкоштовно для MFT. Все це засноване на використанні файлової системи NTFS. З іншого боку, NTFS дозволяє використовувати натиснене стискання файлів на рівні блоку для будь-якого логічного розміру сектору 4 Мб або менше. Це обмеження застосовується завдяки тому, як працює стиснення NTFS. Блоки 4 Мб читаються та стискаються незалежно від розміру логічного сектора. Це, звичайно,

Отже, чи це вам трохи зрозуміло?


Я думаю, що ця відповідь була б кращою, якби вона не використовувала NTFS як приклад файлової системи, оскільки (якщо все не змінилося за останні кілька років) вона не підтримується добре або взагалі під Unix та друзями
Fox

K означає Kilo, який є префіксом метричної одиниці, що означає тисячу. 4 МіБ - це 1024 сектори, а не 1, як ви пропонуєте. 4096 байт - 4 KiB або 0,00390625 MiB.
Ейюн

Це не відповідь. ОП говорить про розмір сектору жорсткого диска, а не про розмір блоку файлової системи. Це інший шар.
炸鱼 薯条 德里克

-1
Sector:

1) Logical Sector: Called Native Sector.

Manufacture default setting. user cannot change.

Before 2010 year: 512b/sector

After 2010 year: 4k/sector.

Few manufacture provide HDD tool to change native sector.

2) Physical Sector: Called Cluster(or allocation unit - FAT windows) or Block(Linux/Unix)

User can change physical sector size 512b,1k,2k,4k,... by format or partition tool. Physical sector contains one or few more native sectors.

(example1: if you have HDD 512b/native sector: user can set 4K/Physical sector. this mean 1 cluster = 4 native sector)

(example2: if you have HDD 4K/native sector: user can set 4K/Physical sector. this mead 1 cluster = 1 native sector)

3) File system deal with Physical sector(or block or Cluster) only.

Ви пропустили записати джерело цієї цитати. Іншими руками, я думаю, що це копія вашого попереднього коментаря тут: superuser.com/a/1372494/141252
andras.tim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.