我发现一个非常奇怪的问题是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缓存未命中来自上下文切换,睡眠情况导致更多上下文切换; 第二,代码路径分配然后释放内存,如果在没有睡眠的情况下运行,本回合的内存可以在下一轮重复使用。在睡眠时,其他线程可以使用只是空闲的内存。