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性能应该高得多,对吧? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |