linux – 为什么io调度程序没有合并请求?

前端之家收集整理的这篇文章主要介绍了linux – 为什么io调度程序没有合并请求?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在服务器重启后一段时间(或写入数据量)后,写入速度降至小于1 MB / s.这与文件系统(也是原始分区)无关,无论是HDD(硬件RAID)还是SSD(带有SSD的SW RAID连接到主板AHCI端口,而不是raid板).我们正在使用命令dd if = / dev / zero of = tst bs = 1M oflag = dsync进行测试(我也尝试了1k,也没有使用dsync,但性能并不好).

我注意到的唯一奇怪的事情是avostq-sz在iostat输出中仅为8(在其他测试的服务器上它超过600)并且req / s大约为100(也在SSD上).并行运行更多的dd给它们每个1 MB / s,每个都大约100 req / s.

示例iostat -xN 1输出

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdc               0.00     0.00    0.00  125.00     0.00   500.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00  124.00     0.00   496.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
sdc               0.00     3.00    0.00  128.00     0.00   524.00     8.19     0.00    0.00    0.00    0.00   0.00   0.00
sdc               0.00     6.00    0.00  124.00     0.00   728.00    11.74     0.00    0.00    0.00    0.00   0.00   0.00
sdc               0.00     0.00    0.00  125.00     0.00   500.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
sdc               0.00     3.00    0.00  128.00     0.00   524.00     8.19     0.00    0.00    0.00    0.00   0.00   0.00

运行8x dd的Iostat输出

sdc               0.00    64.00    0.00  959.00     0.00  7560.00    15.77     0.00    0.00    0.00    0.00   0.00   0.00

lsblk -O输出与其他服务器一致,没有这个问题(如MIN-IO,RQ-SIZE,LOG-SEC).当前内核是4.9.16-gentoo,但问题始于旧内核.用oflag = direct运行dd很快.

编辑:基于shodanshok的答案我现在看到请求确​​实很小,但问题是为什么io调度程序不会将它们合并为更大的请求?我已经尝试了cfq和截止日期调度程序.有什么我可以检查(或与其他服务器比较)?

使用oflag = direct运行时输出(速度正常):

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdc               0.00     0.00    2.00  649.00     8.00 141312.00   434.16     2.78    4.26    2.00    4.27   1.53  99.60
sdc               0.00     0.00    0.00  681.00     0.00 143088.00   420.23     2.71    3.99    0.00    3.99   1.46  99.20
sdc               0.00     0.00    2.00  693.00     8.00 146160.00   420.63     2.58    3.71    0.00    3.72   1.42  98.80
sdc               0.00    49.00    2.00  710.00     8.00 146928.00   412.74     2.68    3.76   22.00    3.71   1.39  99.20
sdc               0.00     0.00    1.00  642.00     4.00 136696.00   425.19     2.43    3.79   60.00    3.71   1.42  91.60

服务器是带有32 GB RAM的Dell PowerEdge R330,带HDD的LSI MegaRAID 3108控制器,连接到板载SATA的SSD,Intel E3-1270 cpu.文件系统ext3,但dd到原始分区也是如此.

输出lsblk(sdc是HW RAID HDD,sda / sdb SW RAID SSD):

NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sdb       8:16   0 223.6G  0 disk
|-sdb4    8:20   0     1K  0 part
|-sdb2    8:18   0   140G  0 part
| `-md1   9:1    0   140G  0 raid1 /
|-sdb5    8:21   0    25G  0 part
| `-md2   9:2    0    25G  0 raid1 /var/log
|-sdb3    8:19   0     1G  0 part
|-sdb1    8:17   0    70M  0 part
| `-md0   9:0    0    70M  0 raid1 /boot
`-sdb6    8:22   0  57.5G  0 part
  `-md3   9:3    0  57.5G  0 raid1 /tmp
sr0      11:0    1  1024M  0 rom
sdc       8:32   0   3.7T  0 disk
`-sdc1    8:33   0   3.7T  0 part  /home
sda       8:0    0 223.6G  0 disk
|-sda4    8:4    0     1K  0 part
|-sda2    8:2    0   140G  0 part
| `-md1   9:1    0   140G  0 raid1 /
|-sda5    8:5    0    25G  0 part
| `-md2   9:2    0    25G  0 raid1 /var/log
|-sda3    8:3    0     1G  0 part
|-sda1    8:1    0    70M  0 part
| `-md0   9:0    0    70M  0 raid1 /boot
`-sda6    8:6    0  57.5G  0 part
  `-md3   9:3    0  57.5G  0 raid1 /tmp

使用oflag = direct,速度没问题,但问题是应用程序不使用直接io,所以即使是普通的cp也很慢.

/sys/block/sdc/queue/hw_sector_size : 512
/sys/block/sdc/queue/max_segment_size : 65536
/sys/block/sdc/queue/physical_block_size : 512
/sys/block/sdc/queue/discard_max_bytes : 0
/sys/block/sdc/queue/rotational : 1
/sys/block/sdc/queue/iosched/fifo_batch : 16
/sys/block/sdc/queue/iosched/read_expire : 500
/sys/block/sdc/queue/iosched/writes_starved : 2
/sys/block/sdc/queue/iosched/write_expire : 5000
/sys/block/sdc/queue/iosched/front_merges : 1
/sys/block/sdc/queue/write_same_max_bytes : 0
/sys/block/sdc/queue/max_sectors_kb : 256
/sys/block/sdc/queue/discard_zeroes_data : 0
/sys/block/sdc/queue/read_ahead_kb : 128
/sys/block/sdc/queue/discard_max_hw_bytes : 0
/sys/block/sdc/queue/nomerges : 0
/sys/block/sdc/queue/max_segments : 64
/sys/block/sdc/queue/rq_affinity : 1
/sys/block/sdc/queue/iostats : 1
/sys/block/sdc/queue/dax : 0
/sys/block/sdc/queue/minimum_io_size : 512
/sys/block/sdc/queue/io_poll : 0
/sys/block/sdc/queue/max_hw_sectors_kb : 256
/sys/block/sdc/queue/add_random : 1
/sys/block/sdc/queue/optimal_io_size : 0
/sys/block/sdc/queue/nr_requests : 128
/sys/block/sdc/queue/scheduler : noop [deadline] cfq
/sys/block/sdc/queue/discard_granularity : 0
/sys/block/sdc/queue/logical_block_size : 512
/sys/block/sdc/queue/max_integrity_segments : 0
/sys/block/sdc/queue/write_cache : write through

解决方法

请求大小(avgrq-sz)很小,因为您发出的是小写请求.您的dd命令(尽管指定1 MB的块大小)正在访问pagecache,因此每个1 MB请求实际上是256 * 4 KB请求的集合.这反映在avgrq-sz中,以512字节为单位表示,与4 KB大小的页面条目完美对齐.此外,根据oflag = dsync的要求,即使SSD也可能在同步写入时性能不佳.也就是说,请注意I / O调度程序应该在较大的请求中合并这些小的4 KB大小的请求,但这不会发生.

有些事要检查:

>你看到发布cat / sys / block / sdc / queue / scheduler是什么?如果noop是选定的调度程序,请尝试选择截止日期>你的/ sys / block / sdc / queue / max_sectors_kb至少是1024吗?>尝试执行dd if = / dev / zero of = tst bs = 1M oflag = direct:I / O性能应该高得多,对吧?

猜你在找的Linux相关文章