Кеширование в mmap

Я использую вызов mmap для чтения из очень большого файла, используя простую арифметику указателей в C++. Проблема в том, что когда я читаю небольшие порции данных (порядка килобайт) несколько раз, каждое чтение занимает столько же времени, сколько и предыдущее. Как я могу узнать, осуществляется ли доступ к диску для выполнения моего запроса или выполняется ли запрос из основной памяти (кеш страниц) в вызовах после первого.

2 ответа

Решение

Проблема в следующем: обе операции чтения выполнялись из кеша. Я предполагаю, что кэширование начинается, когда файл открывается или отображается, прежде чем запрашивать данные. Чтобы убедиться в этом, я выдал:

echo 3 > /proc/sys/vm/drop_caches

который очищает кеш, затем, если я запускаю две итерации для получения одних и тех же данных, первый запуск (в моем случае) в 10 раз медленнее, чем второй.

Вы получите лучшую производительность кеша, если будете использовать локальность ссылок. То есть, если вы обращаетесь к переменным, которые расположены близко друг к другу в памяти (например, переходите на одну в порядке возрастания переменных), и вы выполняете эти обращения близко во времени (то есть не выполняете много других обращений к памяти между чтением этих элементов), то Вы получите лучшую производительность кеша. Если каждое чтение занимает примерно одинаковое количество времени, то весьма вероятно, что оно кэшируется; если вещи не обслуживаются из кэша, на это обычно указывают несколько быстрых операций чтения (попадания в кэш), за которыми следует скачок (пропуск кэша), а затем более быстрое чтение. Практически во всех системах ошибка кэша приводит к загрузке фрагмента, в котором находятся данные, в кэш, поэтому, если вы обращаетесь к переменным, находящимся в одном блоке, они будут в кэше.

Другие вопросы по тегам