Я пытаюсь выжать максимум производительности из драйвера блока Linux для высококачественного устройства хранения. Одна из проблем, которая меня немного затормозила на данный момент, заключается в следующем: если пользовательская задача запускает операцию ввода-вывода (чтение или запись) на одном ЦП, а прерывание устройства происходит на другом ЦП, я беру на себя около 80 микросекунд задержки перед задача возобновляет выполнение.Почему блокировка ввода-вывода занимает слишком много времени при пересечении ЦП?
Я вижу это, используя O_DIRECT для необработанного блочного устройства, поэтому это не относится к кешу страницы или файловой системе. Драйвер использует make_request
для приема операций, поэтому он не имеет очереди запросов и не использует планировщик ввода-вывода ядра (вам придется доверять мне, так будет быстрее).
Я могу показать себе, что проблема возникает между вызовом bio_endio
на одном CPU и задачей, перенесенной на другой ЦП. Если задача находится на одном процессоре, она запускается очень быстро, и если задача находится на другом физическом ЦП, она занимает намного больше времени - обычно около 80 микросекунд дольше в моей текущей тестовой системе (x86_64 на чипсете Intel 5520 [NUMA]).
Я могу мгновенно удвоить свое выступление, установив процесс и привязанность процессора IRQ к одному и тому же физическому процессору, но это не очень хорошее долгосрочное решение. Я бы предпочел получить хорошую производительность независимо от того, где я/Os. И у меня только один IRQ, поэтому я могу управлять только одним процессором за один раз - неважно, если многие потоки работают на многих процессорах.
Я вижу эту проблему на ядрах от 2.6.28 Centos 5.4 до основной линии 2.6.32.
Итак, вопрос в том, почему для возобновления пользовательского процесса требуется больше времени, если я позвоню bio_endio
из другого ЦП? Это проблема планировщика? И есть ли способ устранить или снизить задержку?
Да, я думал об этих строках, но я не хотел перекликать с еще более спекуляцией. Это может быть блокировка (возможно, блокировка задачи?), Отскакивающая от одного кеша к другому. На самом деле, похоже, вам нужно настроить все, чтобы вы делали намного больше ввода-вывода за прерывание. – caf
Нет замков, просто огромное количество ввода-вывода. И система NUMA, которая пропускает кросс-cpu, действительно дорогая. Большие переводы лучше, но иногда вам приходится брать то, что дает ядро или приложение. –