Linux выполняет опережающее чтение при одновременном чтении одного и того же файла

Linux выполняет опережающее чтение при одновременном чтении одного и того же файла

Linux выполняет опережающее чтение (указанное в /sys/block//queue/read_ahead_kb), когда файл считывается последовательно.

Интересующая ОС: Red Hat Linux Интересующая файловая система: xfs, ext4

Каковы критерии принятия решения о выполнении последовательного чтения?Рассмотрим несколько одновременных чтений одного и того же файла с использованием pread (https://man7.org/linux/man-pages/man2/pwrite.2.html) с одинаковыми или разными ФД.

например

Тот же FD. прочтения в позициях 10-20-30-78-89 (вне последовательности прочтений) -40-50-60-70 - 23-34 (вне последовательности прочтений)- 80-90-100...

Могут ли вышеупомянутые неявные внеочередные чтения избежать опережающего чтения в этом случае?

Если да, решит ли эту проблему использование двух разных FD (т. е. использование отдельного FD для чтения по адресу 78-89-23-34)? (т. е. опережающее чтение будет происходить как обычно для чтения по адресу 10-20-30-40-50)

решение1

Могут ли вышеупомянутые неявные несоответствия в последовательности позволить избежать опережающего чтения в этом случае?

Да, несоответствующие последовательности чтения из одного и того же файлового дескриптора могут повлиять на опережающее чтение, но ядро ​​пытается это учитывать — по крайней мере, для небольших «случайных» чтений параллельно с последовательными чтениями. Смотритеописание конструкции опережающего чтения по требованию, в частности:

При чередующихся последовательных чтениях параллельные потоки на одном и том же fd могут делать недействительным состояние readahead друг друга. Поэтому мы помечаем новую страницу readahead в (start+size-async_size) с помощью PG_readahead и используем ее как индикатор readahead. Флаг не будет установлен на уже кэшированных страницах, чтобы избежать суеты readahead-for-nothing, экономя бессмысленные поиски в кэше страниц.

Вы можете увидеть, где это применимо, посмотрев наondemand_readahead, в частностиего призыв кtry_context_readaheadи окружающие комментарии.

Как всегда, когда пытаетесь устранить узкие места производительности, вы не должны принимать во внимание потенциальные узкие места, кроме как в качестве подсказок: вы должны разработать свои собственные бенчмарки и проанализировать характеристики производительности ваших конкретных сценариев. Например, может быть так, что ваши внеочередные чтения попадают только на страницы, которые уже находятся в кэше страниц в результате упреждающего чтения при ваших последовательных чтениях.

Связанный контент