#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-диска).