这里有些行为我很难理解。我编写了一个实用程序,该实用程序接受N个文件名,在线程中打开每个文件名,然后尽可能快地从它们中读取()以对管道吞吐量,文件系统带宽等进行基准测试。如果我从同一文件中读取,注意到饥饿问题,此gif说明了这一点:
您可以看到前两个线程基本上获得了所有I / O时间,直到它们完成读取文件为止,然后其余的线程都可以继续前进。我本来希望Linux中的CFQ能够更公平地分配I / O时间。其他线程的速率没有在 all 处更新的事实,告诉我它在read调用本身中被阻止。
每个线程将其各自的文件open()设置为O_RDONLY | O_DIRECT(以避免对页面缓存进行基准测试),然后将1MB(2 ^ 20字节)读取()到暂存缓冲区中,将其丢弃。读取调用的时间用于计算吞吐量,该吞吐量由另一个线程显示。
难道没有任何头脑高明的人会导致这种饥饿行为吗?我是一个具有4个物理核心的系统,如果需要的话,可以从消费级SSD(SATA)中读取数据。内核是4.15.0-20通用的
编辑:手动更改为noop或截止时间调度程序可以解决该问题,并且分配更加均匀(这是noop的实现):