LINUX.ORG.RU

Кеширование и чтение из файла


0

0

Здравствуйте, уважаемые!

Подскажите, кто знает - кеширует ли линукс чтение данных из файла? Предполагаю, что повторное чтение данных в пределах прочитанной ранее страницы должно быть выполнено гораздо быстрее первого доступа. На практике никак не могу получить вменяемых результатов. Для определения времени выполнения операции использую конструкцию типа:

RDTSC(t1);
read(fd, &data, sizeof(data));
RDTSC(t2);
d = t2-t1;

Первую операцию чтения выполняю в одном процессе, вторую - в другом.

Полученные различия для первой и последующей операции отличаются не сильно (например, 1800 и 1700). Бывает, что наоборот - вторичное чтение осуществляется быстрее первичного.

★★

RDTLPT(i82);

fd -- это дескриптор на открытый файл? Где он находится? Как проводится тестирование?

Кэшируется содержимое диска, а также делается read ahead. В твоем случае наверняка все содержимое файла уже закешировано, и ты измеряешь только затраты на системный вызов.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Файл находится на диске, файловая система ext3. Размер файла около 30 мегабайт. Тестирование проводится следующим образом:
- первый процесс открывает файл, читает по 4 байта (int) из нескольких страниц файла, расположенных в разных местах, ожидает ввода с клавиатуры, закрывает файл;
- второй процесс (после перехода первого процесса в режим ожидания ввода с клавиатуры) открывает тот же файл, читает последовательно все страницы файла, замеряя время чтения, закрывает файл;
- вводом с клавиатуры завершается первый процесс.

i82 ★★
() автор топика
Ответ на: комментарий от i82

если ты под кешированием понимаешь хранение в памяти содержимого диска, то в твоем случае наверняка изначально весь файл целиком закеширован. То есть ты измеряешь только время на системный вызов и на поиск в структурах ядра.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

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

i82 ★★
() автор топика
Ответ на: комментарий от i82

> Я предполагал, что кешируются только те страницы, к которым осуществлялся доступ. Получается, что весь файл кешируется?

ну а ты уверен, что к нему не обращались до твоего теста? Если ты его создал перед тестом, то он уже закэширован. Если ты провел тест второй раз, то он уже закэширован.

> А если размер его не 30 мегабайт, а 300?..

Все потребители памяти соревнуются между собой, кого из них оставить в памяти, а кого на диске (в файле или свопе). Решение кого оставить в памяти принимается на основе какой-нибудь политики вытеснения http://en.wikipedia.org/wiki/Page_replacement_algorithm

Учитывая, что обычно в машине не менее полгига, а часто больше, то на незагруженной машине будут закэшированы все 300 мбайт файла.

dilmah ★★★★★
()
Ответ на: комментарий от i82

Кешируется не файл, а блоки (сектора) диска. Команда free показывает в столбце cached сколько ОЗУ в данный момент занято этим кешем. Что хранится в кеше сказать относительно сложно, как правло те блоки диска, к которым было последее обращение, но вроде, если блок хранит метаданные файловой системы, у него более высокий приоритет на нахождение в кеше.

>А если размер его не 30 мегабайт, а 300?

Если ОЗУ достаточно, то будут все 300 Мбайт, а если нет, то последнии (хвостовые) блоки.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.