Linux io_submit задержка большая
Я нахожу одну очень странную проблему с задержкой 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, только события 'Q' и 'A' перехватываются, этого недостаточно, чтобы выяснить этот вопрос. Я также пытался использовать systemtap для отслеживания некоторой точки в коде io_submit, но это приводит к тому, что задержка io_submit становится слишком большой почти 50us, что делает разницу между верхними ситуациями не очевидной.
Кто-нибудь знает почему по этому поводу или дать несколько советов, чтобы разобраться в этом вопросе.
НОВЫЙ ПРОГРЕСС:
используя systemptap, я обнаружил, что увеличение задержки происходит из многих мест пути кода, а не из одного места. Две выпущенные вещи. во-первых, промах кэша процессора, возникающий из-за переключения контекста, приводит к большему переключению контекста; во-вторых, путь кода выделяет, а затем освобождает память; если запустить без сна, то свободная память в этот ход может быть повторно использована следующим ходом. в то время как во время сна, свободная память может использоваться другими потоками.