LINUX.ORG.RU

Избранные сообщения ikuchmin

Блокируется чтение с раздела при активной записи

Форум — Admin

Всем добрый вечер.
Дистрибутив: Proxmox 2.1
Версия Debian: 6.0.6
Ядро: 2.6.32-17-pve
Утилита для тестирования: fio
Конфиг для записи: write.ini:
[writetest]
blocksize=4k
filename=/dev/sda2
rw=randwrite
#direct=1
buffered=1
ioengine=libaio
iodepth=4

Конфиг для чтения:
[readtest]
blocksize=4k
filename=/dev/sda2
rw=randread
#direct=1
buffered=1
ioengine=libaio
iodepth=4

Обращаю ваше внимание что тестируется не скорость записи или чтения, а отзывчивость системы и работа планировщика. Отзывчивость оценивается по количеству уровню iops операции чтения. Latency пока предлагаю не оценивать.

Планировщик: deadline
/sys/block/sda/queue/iosched/fifo_batch:16
/sys/block/sda/queue/iosched/front_merges:1
/sys/block/sda/queue/iosched/read_expire:500
/sys/block/sda/queue/iosched/write_expire:5000
/sys/block/sda/queue/iosched/writes_starved:2

NCQ:
/sys/block/sda/device/queue_depth:1

Проверяем в режиме простоя:
Чтение с раздела:
read : io=11328KB, bw=318406B/s, iops=77, runt= 36431msec
slat (msec): min=2, max=36, avg=12.86, stdev= 3.95
clat (usec): min=2, max=68510, avg=38565.74, stdev=7217.68
bw (KB/s) : min= 272, max= 347, per=100.12%, avg=310.38, stdev=15.79

iostat -mdx 1:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 0.00 78.00 0.00 0.30 0.00 8.00 1.00 12.78 12.78 99.70


Запись на раздел:
write: io=4643MB, bw=238160KB/s, iops=59540, runt= 19964msec
slat (usec): min=2, max=7661K, avg=15.69, stdev=9763.96
clat (usec): min=5, max=7661K, avg=50.75, stdev=16911.66
bw (KB/s) : min= 1530, max=973280, per=334.49%, avg=796625.82, stdev=381905.95

iostat -mdx 1:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 2.00 0.00 436.00 0.00 1.72 8.09 143.28 339.99 2.29 100.00

Естественно iostat продолжает показывать запись на диск даже после остановки fio:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 1.00 0.00 436.00 0.00 1.70 8.00 143.66 330.46 2.29 100.00

Пробуем прочитать данные с раздела /dev/sda1:
[readtest]
blocksize=4k
filename=/dev/sda1
rw=randread
#direct=1
buffered=1
ioengine=libaio
iodepth=4

Результаты:
read : io=3732KB, bw=61752B/s, iops=15, runt= 61885msec
slat (msec): min=40, max=157, avg=66.33, stdev=13.15
clat (usec): min=2, max=418926, avg=198389.78, stdev=29420.46
bw (KB/s) : min= 13, max= 70, per=99.68%, avg=59.81, stdev= 7.34

iostat -mdx 1:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 1.00 15.00 240.00 0.06 0.94 8.03 142.12 548.40 3.92 100.00

Видно, что чтение «худо - бедно» идет.

Пытаемся прочесть данные с /dev/sda2(Не повторяйте этого дома!):
[readtest]
blocksize=4k
filename=/dev/sda2
rw=randread
#direct=1
buffered=1
ioengine=libaio
iodepth=4

Результаты:
readtest: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=libaio, iodepth=4
Starting 1 process
Jobs: 1 (f=1): [r] [inf% done] [0K/0K /s] [0/0 iops] [eta 1158050441d:06h:59m:26s]

iostat -mdx 1:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 0.00 1.00 0.00 435.00 0.00 1.71 8.04 301.64 793.95 2.30 100.00
s

Как видим ни одного iops на чтение не потрачено. И это уже после остановки fio.

Пробуем читать с помощью dd:
dd if=/dev/sda2 of=/dev/null bs=4K
17403+0 records in
17402+0 records out
71278592 bytes (71 MB) copied, 98.3468 s, 725 kB/s

Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sda 187.00 3.00 4.00 330.00 0.75 1.29 12.48 302.52 920.32 2.99 100.00

Что-то мы смогли прочитать, но тратилось около 4-5 iops. Что на мой взгляд крайне низкая цифра.

Отключение в fio буфера и установка режима direct не дали никакого эффекта.
[readtest]
blocksize=4k
filename=/dev/sda2
rw=randread
direct=1
buffered=0
ioengine=libaio
iodepth=4

Эта ситуация сохраняется до тех пор пока весь кэш buffered не будет сброшен на диск.

Также прошу обратить внимание, что если операция чтения и записи выполняются в режиме direct, то блокировки чтения не происходит:

read : io=29780KB, bw=213850B/s, iops=52, runt=142598msec
slat (usec): min=2, max=25, avg= 5.00, stdev= 1.16
clat (msec): min=10, max=182, avg=76.59, stdev=26.05
bw (KB/s) : min= 162, max= 308, per=100.26%, avg=208.54, stdev=19.48

write: io=35432KB, bw=208744B/s, iops=50, runt=173812msec
slat (usec): min=2, max=27, avg= 5.21, stdev= 1.42
clat (usec): min=139, max=462406, avg=78472.54, stdev=61807.28
bw (KB/s) : min= 82, max= 1653, per=102.28%, avg=207.64, stdev=175.78

iostat -mdx 1:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
sdb 0.00 0.00 53.00 32.00 0.21 0.12 8.00 8.00 92.02 11.76 100.00

Обратите внимание что в этом случае количество io которое тратиться на чтение больше чем то, что тратится на запись.

Есть у кого-нибудь идеи почему так происходит? Что поковырять?

P.S.: Участвует ли планировщик в режиме записи/чтения direct?

 , ,

ikuchmin
()