Задать вопрос
Driver86
@Driver86
Немодератор toster.ru

При записи данных в файл, они остаются в кеше ОС для возможности чтения из кеша?

Есть большой файл. В который данные пишутся только вконец. ОС, как я понимаю, кеширует эти данные (т.е. не сразу сбрасывает на диск, а оставляет в памяти).
Так вот, два вопроса:
1. Читаем эти же данные (т.е. укажем смещение (которое равно предыдущей (до записи) длине файла) и длину только что записанных данных), ОС поймёт, что читаются именно те данные, которые записались и закешировались, и выдаст ли ОС эти данные из кеша?
2. Тот же самый вопрос, но если до чтения этих же данных были ещё новые данные дописаны.

Спрашиваю это вот почему. Есть приложение, которое хранит минифайлы склеенными в одном большом мегафайле (это для обхода ограничений на inodes). Минифайлы записываются в один поток всегда вконец мегафайла, никогда не модифицируются и не удаляются из мегафайла. И, как показывает практика, чаще всего именно только что записанный минифайл потребуется. И потребуется один раз, потом - намного реже. Т.е. логично его кешировать не по факту чтения, а по факту записи (тем более он уже в оперативной памяти при записи). А после чтения тут вообще логичнее наоборот, удалять его из кеша. Есть смысл сохранять его в кеше средствами приложения (например, в tmpfs), либо ОС сама это сделает через свой кеш?
  • Вопрос задан
  • 262 просмотра
Подписаться 2 Средний 3 комментария
Пригласить эксперта
Ответы на вопрос 3
gbg
@gbg Куратор тега Linux
Любые ответы на любые вопросы
Важно понимать следующее: нет никакой ложки

С точки зрения Линукса, данные, которые вы якобы пишете на диск - это страницы в памяти, которые помечены как неанонимные (это значит, что на диске есть файл, который с ними связан), и грязные (а это значит, что эти страницы надо сбросить на диск).

Причем момент, когда произойдет сброс, зависит от кучи факторов - программист на это может влиять таким образом:

-он может потребовать, чтобы ядро сбросило данные на накопитель и вернуло управление только после того, как накопитель сообщил, что данные сброшены.

То есть, программист может потребовать, чтобы данные сбросились на диск пораньше, но не попозже.

После сбрасывания страниц на диск, ОС помечает их как чистые. Это значит, что их можно занять под что-то другое. Можете запустить htop и посмотреть на желтую полоску - это как раз те самые страницы кэша, и их может быть очень много.

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

А теперь важный вопрос - как же понять, остаются ли данные в кэше после записи. Да легко.

-очистите кэш sync; echo 1 > /proc/sys/vm/drop_caches
-посмотрите, что желтая часть на полоске памяти в htop исчезла
-запустите DD, запишите на диск гигабайт. (dd if=/dev/urandom of=test.raw bs=8M count=128 status=progress)
-посмотрите, что у вас нарисовался желтый гигабайт
-можете потом считать этот файл и увидеть офигительную скорость - выше гигабайта в секунду (у меня получается 6, что очевидно говорит о том, что чтение происходило из RAM). Последнее лучше делать, если писали на HDD - потому что хороший SSD может выдать столько же

Объективно, этот тест показывает, что ДА, записанные данные остаются болтаться в памяти.

Но при этом, момент, когда эти данные оттуда уйдут, зависит от множества факторов (скажем, если памяти - в обрез, PageCache пойдет под нож в первую очередь). Так что может оказаться полезным использовать другие стратегии - например, mmap
Ответ написан
Комментировать
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Предположение так себе. Обьясню почему.
Вы игнорируете стандартные процедуры ос threading, file locking и пытаетесь получить воспроизводимый результат.
Возможно это получится, но стоит изменится ядру и ваши труды станут не нужными
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
И для записи и для чтения используется тот же механизм - page cache, только для записи они еще помечаются как dirty, которые должны быть записаны на следующий уровень.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы