Отбросить определенный файл от кэша файловой системы Linux?

Я рекомендовал бы пытаться решить проблему LibreOffice, но если это не работает, Вы услышали о Abiword? Это является более старым, чем проект OpenOffice.org и является подобным MS Word (предленточные версии) или Устройство записи от комплекта LibreOffice.

Другая идея, если Вы знакомы с ЛАТЕКСОМ, состоит в том, чтобы попробовать одного из тех почти (или не совсем так почти) WYSIWYG-редакторы как Kile (KDE), LyX (Спокойные зависимости), или Texmaker (QT).

Протест: Я не использовал ни одной из вышеупомянутых частей программного обеспечения потому что LibreOffice и прямо pdflatex были достаточно для всего, что я должен был сделать до сих пор.

22
22.07.2018, 06:06
5 ответов

Можно открыть отдельные файлы с O_DIRECT флаг (см. man 2 open) — читают раздел NOTES той страницы справочника тщательно и рассматривают, хотите ли Вы также/нуждаетесь O_SYNC.

2
27.01.2020, 19:43
  • 1
    Ну, мой процесс cat, и я не переписал бы его.:) Я надеялся на инструмент командной строки или a /proc/sys кнопка. –  Jay Hacker 20.04.2012, 01:21
  • 2
    Хуже, чем это, я подозреваю, что Вы действительно подразумеваете использование перенаправления таким образом, процесс является оболочкой. Я не знаю о способе на файл управлять этим кроме open флаг; необходимо было бы действительно записать программу, чтобы сделать это. (cat -u только отключает stdio буферизация, не буферизация ОС.) –  geekosaur 20.04.2012, 01:36

Метод потенциала # 1 - F_DROP_CACHES

Я нашел метод в 2012 году, который обсуждает предлагаемый патч к ядру Linux в этой почтовой теме под названием: Re: [RFC Patch] FS: Реализуйте кэши для капли файла .

Выдержка

CONG> Это черновой патч реализован для каждого капли файла капли.

интересно. Итак, могу ли я сделать это из-за пределов процесса? Я а Sysadmin, поэтому мой POV от заметки, нахождения и крепления производительности Проблемы, когда система находится под давлением.

 CONG> Он представляет новую команду fcntl f_drop_caches для падения
CONG> Файл кэширует определенный файл.  Причина в том, что в настоящее время
CONG> У нас есть только интерфейс капли системных капли, он мог
CONG> вызвать системную производительность вниз, если мы бросьте все кэшировки страницы
CONG> Когда мы фактически хотим бросить кеши некоторых огромных файлов.
 

Как я могу сказать, сколько кеша используется файлом? И что такое Воздействие эффективности этого при запуске на занятой системе? И что делает Этот патч купишь нас, так как я полагаю, что VM уже должен отбрасывать Кэши, как только система наступает под давлением MEM ...

CON> Ниже - это небольшой тестовый корпус для этого патча:

Поток включает в себя как тестовый шкаф, так и фактический патч для нескольких файлов в ядре Linux, который добавляет дополнительную функцию К FS / DORM_CACHES.C Вызывается Drop_PageCache_File (struction file * filp) . Эта функция затем доступна через инструмент Frontend, FNCTL.C через команду f_drop_Caches . В этом случае вызывает эту функцию:

file_drop_caches(filp, arg);

, которая обрабатывает падение всех кэшей, связанных с заданным файлом. Из файла включают / linux / mm.h :

void file_drop_caches(struct file *filp, unsigned long which);
Так что это может быть использовано?

Я не нашел доказательств того, что этот патч когда-либо прошел в репозиторий Main Linux Kernel, так что это Опция будет иметь доступность, только если вы готовы перекомпилировать ядро ​​Linux самостоятельно.

Потенциальный метод № 2 - с использованием DD

в той же ниде, другой пользователь упоминает совершенно другую методологию, которая использует dd .

Следующее выдержка из этого письма

Это полезная функциональность. Хотя это не оно не предусмотрено posix_fadv_dontned ? Эта функциональность была добавлена ​​в GNU DD (8.11) Год назад .

Вот примеры из этого патча:
  • Советуйте отбросить кеш для всего файла

      $ DD, если = ifile iflag = nocache count = 0
     
  • Убедитесь, что кэш капли для всего файла

      $ DD = OFLELAG = NOCACHACH CONV = NOTRUNC, FDATASYNC COUNT = 0
     
  • Кэш-память для части файла

      $ dd, если = iflag iflag = nocache skip = 10 count = 10 of = / dev / null
     
  • Данные по потоку с использованием только кэш для чтения

      $ dd, если = ifile of = ofile iflag = nocache oflag = nocache
     
Тестирование этого

Я не был на 100% положительным, как это проверить, но я придумал следующий подход.

  1. Создайте файл 100 МБ

     $ DD, если = / dev / urandom of = fushy.txt bs = 100 мс = 1
     
  2. Процедентные доступ к файлу с использованием FATRACE

     $ SUDO FATRACE |  grep образец.txt.
     
  3. Run TOP Итак, мы можем отслеживать использование памяти, обратите внимание на сумму бесплатно.

     $ Top
     
  4. Открытый файл, обратите внимание на сумму бесплатной памяти сейчас. ПРИМЕЧАНИЕ FATRACE файла Whume.txt .

     $ cat whume.txt> / dev / null
     
  5. Оставьте файл из памяти, сейчас обратите внимание на сумму бесплатной памяти. Обратите внимание на выходные данные FATRACE .

     $ sudo dd of = / home / saml / tst / 162600 / sample.txt \
      oflag = nocache conv = notrunc, fdatasync count = 0
     

Пример

в терминале № 1:
$ dd if=/dev/urandom of=sample.txt bs=100M count=1
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 7.37996 s, 14.2 MB/s

$ ls -l sample.txt 
-rw-rw-r--. 1 saml saml 104857600 Oct 17 22:54 sample.txt
в терминале № 2:
$ top
...
KiB Mem:   7968336 total,  6900956 used,  1067380 free,   267080 buffers
...
в терминале № 3:
$ sudo fatrace | grep sample.txt
Теперь открыть файл, , и обратите внимание на сумму , и обратите внимание на сумму баран. В терминале № 1.
$ cat sample.txt > /dev/null
В Терминале № 2:
KiB Mem:   7968336 total,  7011896 used,   956440 free,   267336 buffers
Обратите внимание на вывод FATRACE в терминале № 3:
cat(25940): R /home/saml/tst/162600/sample.txt
cat(25940): R /home/saml/tst/162600/sample.txt
cat(25940): RC /home/saml/tst/162600/sample.txt
Теперь удалите файл из оперативной памяти, в терминале № 4:
$ sudo dd of=/home/saml/tst/162600/sample.txt \
    oflag=nocache conv=notrunc,fdatasync count=0
Обратите внимание на вывод FATRACE в терминале № 2:
dd(26229): O /home/saml/tst/162600/sample.txt
dd(26229): CW /home/saml/tst/162600/sample.txt
Обратите внимание на оперативную память в терминале № 3:
KiB Mem:   7968336 total,  6908364 used,  1059972 free,   267364 buffers

Так что кажется, что все то, что было потреблено файлом в оперативной памяти.

Потенциальный метод № 3 - Python-Fadvise

Благодаря комментарию @frostchutz, есть другой инструмент, сценарий Python, названный [Pyadvise] [4] , который обеспечивает гораздо более простые интерфейс, чем Вышеуказанные DD методы. Этот скрипт использует один и тот же POSIX_FADVISE (2) интерфейс.

Пример
$ sudo pyadvise --help
Usage: 
    pyadvise [options] [FILE]..

Options:
  -h, --help        show this help message and exit
  -w, --willneed    The specified files will be accessed in the near future
  -s, --sequential  The application expects to access the specified files
                    sequentially (with lower offsets read before higher ones)
  -d, --dontneed    The specified files will not be accessed in the near
                    future
  -r, --random      The specified files will be accessed in random order
  -o, --noreuse     The specified files will be accessed only once. Under
                    Linux, this operation is a no-op; see contrib/copyfileobj-
                    fadvise.py in the python-fadvise source tree for an
                    example on how to achieve approximately the same effect
  -n, --normal      Indicates that the application has no advice to give about
                    its access pattern for the specified files. If no advice
                    is given for an open file, this is the default assumption
  -v, --verbose     Explain what is being done

И если мы повторим вышеупомянутый тест и использовать Pyadvise вместо dd :

$ pyadvise -d /home/saml/tst/162600/sample.txt

Я заметил одинаковое падение в использовании оперативной памяти, как и раньше, когда Я использовал dd .

20
27.01.2020, 19:43

Если вы хотите заставить файл всегда использовать O_Sync, вы можете пометить его как в расширенных атрибутах с помощью Chattr + S $ файл :

MAN Chattr:

, когда файл с Набор атрибутов модифицирован, изменения написано синхронно на диске; Это эквивалентно Вариант монтажа «Sync» наносится в подмножество файлов.

O_SYNC заставляет метаданные данные + быть записаны на буферы диска, но он все еще проходит через кэш страницы. O_direct обходит кэш страницы.

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

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

TMPFS кладет все в внутренние кэши ядра и растет и Усаживается для размещения файлов, которые он содержит

-2
27.01.2020, 19:43

Расширяя ответ @ 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.

Отказ от ответственности: я не тестировал это.

3
27.01.2020, 19:43

Единственный способ предотвратить кэширование файла — использовать O _DIRECT. дд твой друг.
Если вы не хотите использовать O _DIRECT, обратите внимание, что ущерб может быть нанесен уже после того, как (другие более важные вещи могут быть удалены из кеша ).

# fgrep MemFree: /proc/meminfo
4691788 KB
# dd if=massivefile of=/dev/null bs=2M  
# fadv <massivefile
# fgrep MemFree: /proc/meminfo
5097264 KB

где fadv.c — это (используйте стандартный ввод, чтобы сделать код максимально простым):

#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv)
{ posix_fadvise(0, 0, lseek(0, 0, SEEK_END), POSIX_FADV_DONTNEED);
  return 0;
}

Обратите внимание, что после этого свободной памяти становится больше, чем раньше, а это означает, что данные, которые раньше находились в кэше, были выброшены. Однако, если вы читаете файл с O _DIRECT:

  # fgrep MemFree: /proc/meminfo
  MemFree:         5091464 kB
  # dd if=verylargefile bs=2M of=/dev/null iflag=direct
  6141+1 records in
  6141+1 records out
  12880669515 bytes (13 GB) copied, 72,7641 s, 177 MB/s
  # fgrep MemFree: /proc/meminfo
  MemFree:         5074164 kB

Теперь свободной памяти немного меньше, т. е. другие действия использовали часть памяти, но фактическое чтение этого 13-гигабайтного файла не очистило кеш.

0
15.11.2020, 02:43

Теги

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