libaio虽然是异步direct-io,但某些情况下仍然会被阻塞。

测试环境,
硬盘信息:ATA HGST硬盘,6.0 Gbps SATA HDD,容量5.46TiB(6.00TB);
逻辑盘信息:RAID0,容量5.457TiB,条带大小256KB,读策略Read ahead,写策略Write back;
[[email protected] ~]# lsscsi
[0:2:0:0]    disk    AVAGO    MR9361-8i        4.68  /dev/sda

fio测试命令:
./fio -ioengine=libaio -bs=8k -direct=1 -numjobs 16 -rw=read -size=10G -filename=/dev/sda2 -name="Max throughput" -iodepth=128 -runtime=60

查看系统调用耗时(如果被阻塞,libaio系统调用耗时会比较大,'--duration 1'表示如果系统调用耗时大于1ms则输出):
perf trace -p `pidof -s fio` --duration 1

查看fio线程被调度出去的原因(即因libaio系统调用被阻塞而被调度出去):
offcputime -K -p `pgrep -nx fio`

sda请求队列长度128(默认):
cat  /sys/block/sda/queue/nr_requests  

由于块设备层的request资源有限(默认128),在fio多任务测试下,由于request资源不够用,导致io_submit系统调用被阻塞在request资源上。

在nr_requests调整为256后,系统调用io_submit几乎不阻塞,在修改为512后,完全不阻塞;
但随着nr_requests加大,io_getevents会越来越阻塞,与io_submit的阻塞情况完全相反。

nr_requests = 128时的测试日志:

io_submit可能被阻塞的原因

io_submit可能被阻塞的原因

nr_requests = 256时的测试日志:

io_submit可能被阻塞的原因

io_submit可能被阻塞的原因

相关文章: