Указание Linux не сохранять файл в кэше при его записи на диск

#linux #caching

#linux #кэширование

Вопрос:

Я записываю большой файл на диск из приложения пользовательского режима. Параллельно с этим я записываю один или несколько файлов меньшего размера. Большой файл не будет прочитан обратно в ближайшее время, но небольшие файлы могут быть. У меня достаточно оперативной памяти для приложения файлов меньшего размера, но недостаточно для большого файла. Могу ли я указать ОС не сохранять части большого файла в кэше после их записи на диск, чтобы для файлов меньшего размера было доступно больше кэша? Я все еще хочу, чтобы запись в большой файл была достаточно быстрой.

Ответ №1:

Могу ли я указать ОС не сохранять части большого файла в кэше?

Да, вы, вероятно, захотите использовать какой-нибудь системный вызов, например posix_fadvise(2) или madvise(2) . В странных случаях вы можете использовать readahead(2) или userfaultfd(2) или специфические для Linux флаги для mmap (2). Или очень хитро обрабатывать SIGSEGV (см. signal (7), signal-safety (7) и eventfd (2) и signalfd (2)), вам нужно будет написать свою программу на C для этого.

Но я не уверен, что это стоит ваших усилий по разработке. Во многих случаях поведение последнего ядра Linux достаточно хорошее.

См. Также proc(5) и linuxatemyram.com

Многие из вас хотят прочитать руководство по GC. Это имеет отношение к вашим проблемам

Участник, изучающий для вдохновения исходный код существующего программного обеспечения с открытым исходным кодом, такого как GCC, Qt, RefPerSys, PostgreSQL, GNU Bash и т. Д…

В большинстве случаев просто не стоит усилий явно кодировать что-либо для управления кешем страниц.

Я предполагаю, что параметры mount (2) в вашем /etc/fstab файле (см. fstab (5) …) на практике важнее. Или изменение или настройка вашей файловой системы (например, ext4 (5), xfs (5) ..). Или чтение (2) большими фрагментами (1 Мбайт).

Поиграйте с dd(1) для измерения. См. Также time(7)

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

не забудьте сравнить, например, используя strace(1) и time(1)

PS. Не забывайте о своих расходах на разработчика. Они часто намного выше цены модуля оперативной памяти (или какого-нибудь более быстрого SSD-диска).