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