Потенциальный метод № 1 - F_DROP_CACHES
Я нашел метод 2012 года, в котором обсуждается предложенный патч для ядра Linux в этой почтовой ветке под названием: Re: [RFC Patch] fs: реализовать кеши для каждого файла .
выдержка
Cong> Это черновой патч реализации кеша для каждого файла.
Интересный. Так я могу сделать это извне процесса? Я являюсь системным администратором, поэтому мой POV заключается в том, чтобы замечать, находить и устранять проблемы с производительностью, когда система находится под давлением.
Cong> It introduces a new fcntl command F_DROP_CACHES to drop
Cong> file caches of a specific file. The reason is that currently
Cong> we only have a system-wide drop caches interface, it could
Cong> cause system-wide performance down if we drop all page caches
Cong> when we actually want to drop the caches of some huge file.
Как я могу сказать, сколько кеша используется файлом? И как это влияет на производительность при работе в загруженной системе? И что этот патч купит нам, так как я полагаю, что виртуальная машина уже должна сбрасывать кэши, как только система оказывается под давлением mem ...
Cong> Ниже приведен небольшой тестовый пример для этого патча:
Поток включает в себя как тестовый случай, так и реальный патч для нескольких файлов в ядре Linux, что добавляет к fs/drop_caches.c
вызываемой дополнительную функцию drop_pagecache_file(struct file *filp)
. Затем эта функция доступна через инструмент внешнего интерфейса, fnctl.c
через команду F_DROP_CACHES
. Этот случай вызывает эту функцию:
file_drop_caches(filp, arg);
Который обрабатывает удаление всех кэшей, связанных с данным файлом. Из файла include/linux/mm.h
:
void file_drop_caches(struct file *filp, unsigned long which);
Так это можно использовать?
Я не нашел никаких доказательств того, что этот патч когда-либо попадал в основной репозиторий кода ядра Linux, поэтому эта опция будет доступна, только если вы захотите перекомпилировать ядро Linux самостоятельно.
Потенциальный метод № 2 - Использование дд
В той же теме другой пользователь упоминает совершенно другую методологию, которая использует dd
.
Ниже приводится выдержка из этого письма
Это полезный функционал. Хотя это уже не обеспечено
POSIX_FADV_DONTNEED
? Эта функциональность была добавлена в GNU dd (8.11) год назад .
Вот примеры из этого патча:
Посоветуйте сбросить кеш для всего файла
$ dd if=ifile iflag=nocache count=0
Обеспечить удаление кэша для всего файла
$ dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
Удалить кеш для части файла
$ dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
Потоковые данные, используя только кэш опережающего чтения
$ dd if=ifile of=ofile iflag=nocache oflag=nocache
Тестирование это
Я не был на 100% уверен, как это проверить, но я придумал следующий подход.
сделать файл размером 100 МБ
$ dd if=/dev/urandom of=sample.txt bs=100M count=1
доступ к файлу трассировки с использованием fatrace
$ sudo fatrace | grep sample.txt
запустить, top
чтобы мы могли контролировать использование памяти, обратите внимание, количество свободных.
$ top
откройте файл, отметьте количество свободной памяти сейчас. Обратите внимание fatrace
на файл sample.txt
.
$ cat sample.txt > /dev/null
удалите файл из памяти, запишите количество свободной памяти сейчас. Обратите внимание на вывод 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
Теперь откройте файл 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
.