LINUX.ORG.RU

буфферизация файловых операций в ядре


0

0

ядро буфферизирует файловые операции. после закрытия файла некоторая информация остается в памяти ядра (инод, последие блоки записи итп). не подскажите, как сбросить все, что находится в памяти, на диск и освободить всю память ядра, касающуюся определенного файла?

anonymous

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

меня интересует, как это сделать в ядре (что поправить в исходниках)? кстати, sync, не всегда освобождает память, а мне нужно именно это.

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

Еще раз говорю - что касается сброса данных файла - это не sync, а fsync. :)

Что касается удаления буферов из кэша, то для inode сложно определить чьи буфера есть чьи: можно сделать sync_dev/invalidate_bdev, но если есть занятые буфера на файловой системе, то будет плохо; можешь попытаться освободить буфера прочитав трансляцию через bmap, но этим ты не сбросишь буфера inode и т.д. и т.п.

А зачем такое вообще нужно?

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

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

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

А чем мешает то?

"Грязный" буферный кэш будет записан и освобожден kswapd при запросах на выделение памяти. Если хочешь более-менее гладкий performance, то просто делай fsync на файлы, тогда при заполнении памяти kswapd сможет просто освобождать страницы с буферами без торможения.

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

Насколько я понимаю твою проблему, ничего прграммировать и
компилировать не нужно. Самое лучшее решение, как мне кажется, это
монтирвать дисковый раздел, на котором ты работаешь, с флагом sync:
sync All I/O to the file system should be done synchronously.
В этом случае будет то, что ты желаешь. Но есть обратная сторона
медали: теперь вместо "огромное количество мелких файлов открываются и
закрываются с огромной скоростью. енто дело сильно сжирает память.
мне это очень мешает" будут тормоза.

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

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

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

Можешь попробовать открывать с флажком O_DIRECT, в этом случае после операций ввода-вывода выполняется invalidate_inode_pages2 и весь page cache, связанный с этой inode удаляется (правда при этом page cache устройства не сбрасывается).

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

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

Ты уверен что это тебе вообще мешает ? Зачем тебе нужна никак неиспользуемая память ?

Вообще то это все подкручивается через /proc/sys/vm см также linux/Documentation/vm

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

> так в том-то и дело, что тормоза меня тоже не устраивают.

А если поэкспериментировать с другими FS? Попробуй xfs, jfs, reiser. Последняя AFAIK заточена для работы с большим кол-вом мелких файлов.

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