Как заставить Linux перестать вымывать из памяти кэш метаданных файловой системы?
Я заметил, что если делать rsync на а очень большое число файлов (например, на всю машину — т.е. на "/" — при запуске rdiff-backup: миллионы файлов), то оно очень долго работает и сильно увеличивает LA, даже если в реальности никаких изменений rsync не обнаруживает. Если же сразу после завершения процесса запустить его снова, то все происходит в СОТНИ раз быстрее (первый rdiff-backup может работать 5 часов, а второй сразу же после него — 2 минуты). Это же касается и любой другой операции — например, «find /».
Я знаю, что ОС кэширует информацию о структуре файловой системе (где что лежит, сколько занимает и когда изменилось), но со временем этот кэш, похоже, вытесняется из памяти другими данными (т.к. на машине СУБД с большой базой данных). Так что ежедневный rdiff-backup заставляет снова поднимать всю структуру в память — а это вызывает огромное число seek-ов и вешает машину.
Есть ли какой-то способ сказать Linux, чтобы он всегда держал в памяти этот кэш метаданных и никогда его не чистил, даже если он долго не используется? (Хочу подчеркнуть, что речь именно метаданных — кэш же СОДЕРЖИМОГО файлов пусть как был, так и остается, с ним все нормально.)
Дополнение: после запуска find / -type f и просмотра slabtop видим:
2 887 684K ext3_inode_cache
611 768K dentry
В принципе, вполне приемлемо отдать 3.5Г оперативки под этот кэш (разве что мне странно, почему он так много занимает — файлов всего 3 309 564, это больше 1К памяти на файл, хотя хватило бы и 20-30 байт на файл).
Ну и, естественно, первый запуск этой команды отрабатывает минут за 5, а второй — секунды за 4.
Памяти более чем достаточно. Просто кэш вымывается и вымывается, независимо от того, сколько размер БД — там же идет запись постоянная, а значит, ОС выделяет все новую и новую память для кэша записи. Рано или поздно начинает стираться кэш метаданных (его же сутки не трогали — вот ОС и решает, что можно его под нож).
1. можно побольше сделать vm.swappiness возможно в своп уйдёт какая-нибудь не очень нужная программа или не очень нужная память (утёкшая в программе), потом оно там и останется. будет больше места для кэша
2. вообще такая же проблема была с rsnapshot + ext4. вообщем тормозит жутко. мало того такой вид бэкапа занимает кучу место в виде инодов. так что пытаюсь перейти на duplicity (где бэкап файлов не миллионы)
Нет, принципиальная разница. У rdiff будет столько же файлов в destination directory, как и в source directory. Так же удаление при ротации кучи файлов очень затратная операция.