我注意到的唯一奇怪的事情是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
解决方法
有些事要检查:
>你看到发布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性能应该高得多,对吧?