在服务器重启后一段时间(或写入的数据量)之后,写入速度降至1 MB / s以下。 这是无论哪个文件系统(也是原始分区),而不pipe是硬盘(HW RAID)还是SSD(SW RAID,SSD连接到主板AHCI端口,而不是RAID板)。 我们正在用命令dd if=/dev/zero of=tst bs=1M oflag=dsync
进行testingdd if=/dev/zero of=tst bs=1M oflag=dsync
(我也尝试过1k
,也没有dsync
,但性能并不好)。
我注意到的唯一奇怪的事情是avgrq-sz
在iostat输出中只有8个(在其他testing过的服务器上它是600多个),并且req / s大约是100(也在SSD上)。 并行运行更多的dd
给了他们每个1 MB / s和他们每个约100 req / s。
示例iostat -xN 1
输出:
Device: rrqm/s wrqm/sr/sw/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
Iostat输出与8倍dd
运行:
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
和deadline
调度程序。 有什么我可以检查(或比较其他服务器)?
用oflag=direct
(速度正常)运行时输出:
Device: rrqm/s wrqm/sr/sw/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
到raw分区也是一样的。
lsblk
输出(sdc是HW RAID硬盘,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
命令尽pipe指定了一个1MB的块大小,但正在打印页面caching,所以每个1MB请求实际上是一个256 * 4KB请求的集合。 这由avgrq-sz
反映,以512字节单位表示,与4 KB大小的页面条目完全alignment。 而且,甚至SSD也可能在同步写入方面performance不佳,正如oflag=dsync
所要求的那样。 也就是说,请注意,I / O调度程序应该将这些较小的4 KB大小的请求合并为较大的请求 ,但这种情况不会发生。
有些事情要检查:
cat /sys/block/sdc/queue/scheduler
什么? 如果noop
是选定的调度程序,请尝试selectdeadline
/sys/block/sdc/queue/max_sectors_kb
至less是1024吗? dd if=/dev/zero of=tst bs=1M oflag=direct
:I / O性能应该高得多吧?