Я знаю, что могу удалить все из кэша файловой системы Linux , но есть ли способ удалить только один конкретный файл? Или предотвратить кеширование файла? Или сказать процессу не кэшировать какие-либо файлы, которые он пишет?
У меня есть процесс, который читает много маленьких файлов и пишет большой файл. Я хочу сохранить маленькие файлы в кеше, чтобы избежать поиска на диске, и мне не важно кэшировать большой файл.
linux
files
filesystems
cache
Джей Хакер
источник
источник
Ответы:
Потенциальный метод № 1 - F_DROP_CACHES
Я нашел метод 2012 года, в котором обсуждается предложенный патч для ядра Linux в этой почтовой ветке под названием: Re: [RFC Patch] fs: реализовать кеши для каждого файла .
выдержкаПоток включает в себя как тестовый случай, так и реальный патч для нескольких файлов в ядре Linux, что добавляет к
fs/drop_caches.c
вызываемой дополнительную функциюdrop_pagecache_file(struct file *filp)
. Затем эта функция доступна через инструмент внешнего интерфейса,fnctl.c
через командуF_DROP_CACHES
. Этот случай вызывает эту функцию:Который обрабатывает удаление всех кэшей, связанных с данным файлом. Из файла
Так это можно использовать?include/linux/mm.h
:Я не нашел никаких доказательств того, что этот патч когда-либо попадал в основной репозиторий кода ядра Linux, поэтому эта опция будет доступна, только если вы захотите перекомпилировать ядро Linux самостоятельно.
Потенциальный метод № 2 - Использование дд
В той же теме другой пользователь упоминает совершенно другую методологию, которая использует
Ниже приводится выдержка из этого письма Тестирование этоdd
.Я не был на 100% уверен, как это проверить, но я придумал следующий подход.
сделать файл размером 100 МБ
доступ к файлу трассировки с использованием
fatrace
запустить,
top
чтобы мы могли контролировать использование памяти, обратите внимание, количество свободных.откройте файл, отметьте количество свободной памяти сейчас. Обратите внимание
fatrace
на файлsample.txt
.удалите файл из памяти, запишите количество свободной памяти сейчас. Обратите внимание на вывод
fatrace
.пример
В терминале № 1: В терминале № 2: В терминале № 3: Теперь откройте файлsample.txt
и запишите объем оперативной памяти. В терминале № 1. В терминале № 2: Обратите внимание на выводfatrace
в терминале № 3: Теперь удалите файл из ОЗУ в терминале № 4: Обратите внимание на выводfatrace
в терминале № 2: Обратите внимание на оперативную память в терминале № 3:Поэтому может показаться, что все, что было использовано файлом в оперативной памяти, освобождается.
Потенциальный метод № 3 - python-fadvise
Благодаря комментарию @frostchutz появился еще один инструмент, скрипт Python,
пример[pyadvise][4]
который предоставляет гораздо более простой интерфейс, чем описанные вышеdd
методы. Этот скрипт использует тот жеposix_fadvise(2)
интерфейс.И если мы повторим вышеупомянутый тест и используем
pyadvise
вместоdd
:Я заметил такое же падение потребления оперативной памяти, как и раньше, когда я использовал
dd
.источник
dd
работает для меня. Я закончил с chris-lamb.co.uk/projects/python-fadvise, что то же самое в более очевидной команде.python-fadvise
гораздо проще, я добавил пример показаdd
.os.posix_fadvise()
стандартной версии Python есть библиотека.Развернув ответ @ geekosaur, вы можете принудительно использовать его
O_DIRECT
с помощью LD_PRELOAD и программы здесь: http://arighi.blogspot.com/2007/04/how-to-bypass-buffer-cache-in-linux.htmlЭтот код действует
O_DIRECT
для всех файлов. Однако, просто добавив еще немного логики strncmp,__do_wrap_open
вы можете выборочно применить O_DIRECT.Отказ от ответственности: я не проверял это.
источник
Вы можете открывать отдельные файлы с
O_DIRECT
флагом (см.man 2 open
) - внимательно прочитайте раздел NOTES на этой man-странице и подумайте, хотите ли вы или нуждаетесьO_SYNC
.источник
cat
, и я бы не стал его переписывать. :) Я надеялся на инструмент командной строки или/proc/sys
кнопку.open
флага; вам действительно нужно написать программу для этого. (cat -u
отключает толькоstdio
буферизацию, но не буферизацию ОС.)Если вы хотите, чтобы файл всегда использовал O_SYNC, вы можете пометить его в расширенных атрибутах следующим образом
chattr +S $file
:man chattr:
O_SYNC заставляет данные + метаданные записываться в дисковые буферы, но все равно проходит через кеш страниц. O_DIRECT обходит кеш страницы.
Но имейте в виду, что открытие его с помощью O_DIRECT пагубно сказывается на производительности, если большой файл, к которому он добавляется, разница может быть небольшой. Но если большой файл перезаписывается в случайных местах, O_DIRECT будет очень сильно влиять на производительность, даже принимая во внимание, что наличие его в кеше может вытеснить из кеша некоторые небольшие прочитанные файлы.
Если у вас есть оперативная память для хранения всех маленьких файлов, вы можете решить проблему другим способом. Убедитесь, что небольшие файлы всегда находятся в оперативной памяти, и я бы предложил скопировать их в tmpfs :
источник
chattr +S
это не то же самоеO_DIRECT
, это то же самое, чтоO_SYNC
.O_DIRECT
приводит к тому, что операции чтения не кэшируются (о чем этот вопрос), а операции записи не буферизируются без гарантии.O_SYNC
заставляет только записи не буферизироваться.O_DIRECT
чтобыO_SYNC
бы ваш ответ внутренне непротиворечивой, но все - таки неправильно рассматривать вопрос.