Linux io_submit延迟大

时间:2018-04-16 12:17:44

标签: aio blktrace

我发现一个非常奇怪的问题是io_submit延迟。

如果我写一个循环调用io_submit 5次,如下所示:

for (int i = 0; i < 5; i++) {
  gettimeofday(&start);
  io_submit(...);
  gettimeofday(&end);
}

除了第一个

之外,io_submit的延迟都非常小
io_submit cost: 9 us
io_submit cost: 2 us
io_submit cost: 2 us
io_submit cost: 3 us

但如果我在每次调用io_submit后睡觉,就像下面这样:

for (int i = 0; i < 5; i++) {
  gettimeofday(&start);
  io_submit(...);
  gettimeofday(&end);
  sleep(1);
}

io_submit的延迟非常大:

io_submit cost: 9 us
io_submit cost: 8 us
io_submit cost: 9 us
io_submit cost: 7 us

块设备是nvme ssd。我试过了 使用blktrace,但似乎blktrace在nvme上有一些问题,只有事件&#39; Q&#39;和&#39; A&#39;被抓住,这还不足以弄清楚这个问题。 我也尝试使用systemtap来追踪io_submit的代码中的某些点,但是这使得io_submit的延迟变得太大了将近50us,这使得上层情境之间的差异显然不大。

有没有人知道为什么会这样或提出一些建议来解决这个问题。

新进展:

使用systemptap,我发现延迟的增加来自代码路径的许多地方,而不是在一个地方。 两件事情。 首先,cpu缓存未命中来自上下文切换,睡眠情况导致更多上下文切换; 第二,代码路径分配然后释放内存,如果在没有睡眠的情况下运行,本回合的内存可以在下一轮重复使用。在睡眠时,其他线程可以使用只是空闲的内存。

0 个答案:

没有答案