2012-05-08 1 views
3

У меня есть приложение для пользовательского пространства, которое генерирует большие записи SCSI (подробности ниже). Однако, когда я смотрю на команды SCSI, которые достигают цели SCSI (т. Е. Хранилища, связанные с FC), что-то разделяет эти записи на 512K кусков.Linux: записи разделены на 512K кусков

Применение в основном делает 1M размера прямых операций записи непосредственно в устройство:

fd = open("/dev/sdab", ..|O_DIRECT); 
write(fd, ..., 1024 * 1024); 

Этот код вызывает два SCSI Пишет для отправки, 512К каждый.

Однако, если я выдаю прямую команду SCSI, без слоя блока, запись не будет разделена. я следующую команду из командной строки:

sg_dd bs=1M count=1 blk_sgio=1 if=/dev/urandom of=/dev/sdab oflag=direct 

Я могу видеть одну единственную 1M размером WRITE SCSI.

Вопрос в том, что разделяет запись и, что более важно, настраивается ли она? Линейный блок Linux кажется виноватым (потому что SG_IO не проходит через него), а 512K кажется слишком произвольным числом, чтобы не быть каким-то настраиваемым параметром.

ответ

1

Вина действительно находится на блочном уровне, сам уровень SCSI мало относится к размеру. Вы должны убедиться, что базовые слои действительно могут передать ваш запрос, особенно в отношении прямого io, поскольку это может быть разделено на множество небольших страниц и требует, чтобы список сборок рассеяния был длиннее, чем то, что может поддерживаться аппаратным или даже просто драйверы (libata/несколько ограничена).

Вы должны посмотреть и настроить/sys/class/block/$ DEV/queue, там есть разнообразные файлы, и, скорее всего, вам будет нужно max_sectors_kb, но вы можете просто попробовать его и посмотреть, что сработает для вас. Вам также может понадобиться также настроить переменные разделов.

0

Если вы посмотрите на следующие файлы, сообщите, не отличается ли размер логического блока, возможно, 512 в вашем случае. Однако я не уверен, что вы можете записать эти файлы, чтобы изменить эти значения. (размер логического блока, который есть)

/sys/block/<disk>/queue/physical_block_size 
/sys/block/<disk>/queue/logical_block_size 
+0

Нет, размеры блоков не имеют значения - это разбивает данные на 512 - ** кило ** байт глыбы, а не 512 байт из них. – Leonid99

0

В блоке драйвера имеется атрибут макс. секторов на запрос. Я должен проверить, как его изменить. Раньше вы могли получить это значение через blockdev --getmaxsect, но я не вижу параметр -getmaxsect на блоке блока.

0

попробовать IOCTL (FD, BLKSECTSET, & блоки)