Оптимизация размера логического сектора для размера физического сектора 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

Является ли метод, который вы описали, для проверки выравнивания надежным? Я использовал утилиту «parted», и она сообщила, что раздел жесткого диска выровнен, но с вашим подходом я запросил размер физического блока, получил 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
Не уверен, как это утверждение относится к моему вопросу. Размер логического сектора может означать меньшие фрагменты в некоторой части конвейера ввода-вывода, плюс ненужная эмуляция в прошивке жесткого диска. Хотите уточнить?
Матан

2
@ Матан, я вообще не могу понять твой комментарий. Я объяснил, что ввод-вывод не выполняется 512 байт за раз, поэтому тот факт, что диск адресован в 512-байтных секторах, не имеет значения. Единственный раз, когда накопителю приходится выполнять какую-либо эмуляцию, это если вы пытаетесь выполнить запись, которая не выровнена по 4 Кб, а поскольку IO обычно выполняется с кратностью 4 Кб, а современные инструменты разбиения гарантируют, что раздел начинается с границы 4 Кб, этого не произойдет.
Псуси

1
Этот «ответ» совершенно неверен как в своих утверждениях, так и в своих выводах. Логический размер устанавливается при форматировании тома. Несоответствия между логическим и физическим размером имеют определенную стоимость в таких технологиях, как хранение на флэш-памяти.
Крис Страттон

@ChrisStratton, нет, вы думаете о размере блока / кластера файловой системы. Размер логического сектора - это размер сектора, который диск сообщает ОС, и он может только читать и записывать единицы этого размера или кратные этому размеру, а сектора нумеруются в единицах этого размера. Сравните с размером физического сектора, где некоторые диски фактически читают и записывают 4-килобайтные секторы внутри, но делают вид, что используют 512-байтовые сектора для обратной совместимости со старыми операционными системами, которые не могут работать с 4-килобайтными логическими секторами.
Псуси

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

1

Да, это возможно, однако это приведет к тому, что накопитель заполнится гораздо быстрее, чем должен. Для файлов размером менее 512 КБ каждый файл будет занимать полные 4096 КБ (4 МБ) и заполнит остальную часть сектора нулями из-за невозможности для большинства файловых систем (NTFS и т. П.) Разрешить файлам совместно использовать сектора. Наилучшим вариантом для файловой системы было бы разрешение переменных размеров секторов, однако это увеличивает размер MFT (таблицы основных файлов) и увеличивает риск повреждения данных, одновременно снижая возможность легкого восстановления данных. Другими словами, программное обеспечение для восстановления не будет полностью знать границы. Таким образом, хотя размер логического сектора 4096 Кбайт великолепен для больших файлов, для обычного ПК для повседневного использования это всего лишь набор из 0. Теперь, с этим сказал, есть возможность хранить данные в самом MFT, когда речь идет о данных, меньших, чем размер логического сектора. Это, однако, означает, что ваш MFT становится огромным, и данные будут записываться дважды (на вашем жестком диске две копии MFT). Вам также нужно будет указать максимальный размер MFT, который может вызвать проблемы, когда вы достигнете его максимума или использование накопителя превысит то, что было бы бесплатным для использования MFT. Все это основано на использовании файловой системы NTFS. С другой стороны, NTFS позволяет вам использовать собственное сжатие для файлов на уровне блоков для любого логического сектора размером 4 МБ или меньше. Это ограничение применяется из-за того, как работает сжатие NTFS. Блоки 4 МБ считываются и сжимаются независимо от размера логического сектора. Это, конечно,

Итак, это немного проясняет ситуацию?


Я думаю, что этот ответ был бы лучше, если бы он не использовал NTFS в качестве примера файловой системы, поскольку (если не все изменилось за последние несколько лет) он не поддерживается хорошо или вообще не поддерживается в Unix и его друзьях
Fox

K обозначает Kilo, который является метрической единицей префикса, означающей тысячу. 4 МиБ - это 1024 сектора, а не 1, как вы предлагаете. 4096 байт - это 4 КиБ или 0,00390625 МиБ.
Aeyoun

Это не ответ. ОП говорит о размере сектора жесткого диска, а не о размере блока файловой системы. Это другой слой.
德里克 薯条 德里克

-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.