LINUX.ORG.RU
решено ФорумAdmin

Как полностью сбросить дисковые кэши?

 ,


0

2

Редактитую образ винча через loop (конкретнее, kpartx), потом (после umount и kpartx -d)

sync; echo 3 > /proc/sys/vm/drop_caches

При чтении - получаю старый файл, изменений нет. Текущий workaround - загадить всю оперативу (dd if=big_disk_file of=/dev/null bs=1024 count=4000000) занимает 40 сек, а хотелось бы быстро.

Debian Jessie (kernel 3.16.0-4-amd64), без systemd.



Последнее исправление: abvgdee (всего исправлений: 1)

обновить ядро и попробовать с ним воспроизвести — не вариант?

cetjs2 ★★★★★
()

Насколько я знаю, штатного способа сбросить вообще все кеши из юзерспейса не существует. Но это можно сделать тривиальным модулем ядра: https://github.com/i-rinat/utility-kernel-modules/tree/master/shrink-memory

Собираешь make'ом, загружаешь insmod'ом, а потом пишешь что-нибудь в /proc/shrink-memory.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

anonymous, cetjs2, это нормальное поведение ядра. vm.drop_caches=3 не сбрасывает вообще всё. В этом можно убедиться, помониторив вывод grep file /proc/meminfo во время vm.drop-caches=3.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Спасибо, как-то не задумывался.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо всем! Я не пропал..

либо ты о чём-то умалчиваешь

Статистика маленькая и ненадёжная, и ещё я упростил описание. Но в целом - так. Ещё повторю тест скоро..

i-rinat, спасибо! Попозже попробую откомпилить (надо поставить исходники ядра..). А там действительно надо именно 13 раз вызывать shrink_all_memory((unsigned long)-1); ? :)

abvgdee
() автор топика
Ответ на: комментарий от abvgdee

А там действительно надо именно 13 раз вызывать

На самом деле, я не знаю. Но помню, что в коде освобождения памяти есть такое понятие, как приоритет. Сначала он равен 12, что означает освобождать 1/4096 от списков. Потом по надобности он двигается к нулю, с каждым шагом увеличивая долю в два раза. Это в нормальном режиме. Как меняется приоритет при повторных вызовах shrink_all_memory(), я не проверял. Так, пальцем в небо. Поэтому там цикл.

i-rinat ★★★★★
()
Ответ на: комментарий от abvgdee

и ещё я упростил описание

Вы сильно упростили. Вы выдёргиваете флешку чтоли? Тогда сбросить кеш: eject /dev/sdX

vodz ★★★★★
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от anonymous

не знаю, к сожалению или нет, но лор — не античат и уж тем более не стековерфлоу. каждый день тут для анонимуса модули ядра точно не пишут. тут чаще пятизвёздочники такие вопросы задают, что со стула падаешь.

anonymous
()
Ответ на: комментарий от i-rinat

Ох.. Юзер-хомяк я, локахост админю..

Поставил исходники. Там куда я их разжал: подложил (разжатый) /usr/src/linux-config-3.16/config.amd64_none_amd64.xz, убедился что make oldconfig (old - подхватить подложенный .config), make modules начинает компилять.. Ещё раз сделал (после mrproper) oldconfig, prepare, и теперь уже из директории shrink_mem:

$ make
make -C /lib/modules/3.16.0-4-amd64/build M=/pub/alexey/__NEW/_NEW/shrink_mem modules
make[1]: Entering directory '/pub/alexey/kernel-build/linux-source-3.16'

  WARNING: Symbol version dump ./Module.symvers
           is missing; modules will have no dependencies and modversions.

  CC [M]  /pub/alexey/__NEW/_NEW/shrink_mem/shrink-memory.o
/bin/sh: 1: ./scripts/recordmcount: not found
scripts/Makefile.build:263: recipe for target '/pub/alexey/__NEW/_NEW/shrink_mem/shrink-memory.o' failed
make[2]: *** [/pub/alexey/__NEW/_NEW/shrink_mem/shrink-memory.o] Error 127
Makefile:1354: recipe for target '_module_/pub/alexey/__NEW/_NEW/shrink_mem' failed
make[1]: *** [_module_/pub/alexey/__NEW/_NEW/shrink_mem] Error 2
make[1]: Leaving directory '/pub/alexey/kernel-build/linux-source-3.16'
Makefile:4: recipe for target 'all' failed
make: *** [all] Error 2
$
Внутри scripts/Makefile.build есть вызов recordmcount, но править его пока не решился, боюсь что-то не то делаю..
$ ll recordmcount* 
-rw-r--r-- 1 alexey alexey 14921 Apr  5 00:21 recordmcount.c
-rw-r--r-- 1 alexey alexey 16772 Apr  5 00:21 recordmcount.h
-rwxr-xr-x 1 alexey alexey 18364 Apr  5 00:21 recordmcount.pl
$

vodz Флэшка не вынималась на время записи-чтения (пока не совпадут чек-суммы - со второго раза), ни при чём это. Если eject - из Гнома - я Redhat's bloatware свободным не считаю

$ apt-cache search eject flash
$ apt-cache search eject usb
$

А ещё, i-rinat, а полученный модуль - можно будет загружать в обновлённом штатном ядре (ну когда через месяц скажем будет апдэйт)? Или каждый раз компилять надо?

abvgdee
() автор топика
Последнее исправление: abvgdee (всего исправлений: 1)
Ответ на: комментарий от abvgdee

Что-то сложно делаешь. Можно проще: поставить пакет linux-headers-3.16.0-4-amd64, в нём уже есть нужные заголовки и симлинки.

можно будет загружать в обновлённом штатном ядре

Нет, для новой версии ядра модули нужно пересобирать. Старые бинарники скорее всего не загрузятся, там для этого специально вставлены проверки. Для серьёзных модулей пересборку автоматизируют с помощью DKMS. Это такой набор скриптов, который запускает пересборку сторонних модулей сразу после обновления пакета с ядром.

i-rinat ★★★★★
()
Ответ на: комментарий от abvgdee

Redhat's bloatware свободным не считаю

Концентрированная шиза однако)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.