Нераспределенные записи на блочных устройствах - PullRequest
0 голосов
/ 17 ноября 2018

Я читал, что запись блока размером без выравнивания может вызвать дополнительные операции чтения. Я имею в виду запись на блочные устройства в Linux. Зачем? Как я могу это увидеть?

1 Ответ

0 голосов
/ 03 декабря 2018

Блочные устройства могут быть записаны или прочитаны только при их собственном выравнивании блоков, которое для всего, с чем я когда-либо сталкивался, составляет либо 512 байт, либо 4096 байт.Вы можете увидеть размер блока вашего устройства в sysfs:

# cat /sys/block/sdb/queue/logical_block_size
512

Почему?Наборы команд NVMe, SCSI и ATA просто не поддерживают доступ к области, меньшей этой.Аргументы команды WRITE находятся в целочисленных блоках.

Если приложению необходимо записать область меньшего размера или невыровненную область, то ядро ​​выдает чтение для заполнения пробелов, а затем записываетбольший кусок.Например, скажем, вам нужно было записать 256 байтов в середине 512-байтового блока.Ядро считывает все 512 байт с диска, объединяет ваши данные для записи в правильное место, а затем записывает блок 512 байт.

Один простой способ контролировать чтение и запись в вашей системе - с помощью *Утилита 1009 *, которая входит в пакет sysstat как минимум в Centos / RHEL.

[root@bb-cluster-4 md]# iostat -xyz 1
...

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          32.29    0.00    7.61    0.00    0.00   60.10

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdd               0.00     0.00    1.00    0.00     4.00     0.00     8.00     0.00    1.00    1.00    0.00   1.00   0.10
...