Скрыть
А как вы копируете файлы в этом вашем линупсе?
Проблема:
Ну вот, например, дохлое вычислительное устройство под OWRT. Периодически копирует крупные файлы, размер которых совместим с объёмом ОЗУ, а часто и превышает его.
Ну вот, копирует оно это своё файло с раздела sda1 в бэкапное место на sdb1 - чё происходит?
Файловая система читает файл с sda1, кешируя прочитанное в памяти. Одновременно пишет на sdb1, ещё раз кешируя в памяти те же байты (файл-то другой уже).
А кеш - он бесплатный, но не безразмерный. Все эти наши копирования байтов, которые нам никогда больше не потребуются, зачем-то сохраняются в кеше, эффективно вымывая оттуда все нужные данные, которые были закешированы для других, более полезных целей. Соответственно растёт пейджинг, kswapd начинает жрать ЦПУ, всё тормозит и т.д. И никакое ionice этого не исправит.
Какие средства нам для решения предоставляет этот ваш хвалёный линупс? Да никаких:
Есть функция posix_fadvise, которая позволяет сказать системе, например POSIX_FADV_SEQUENTIAL что означает что мы собираемся читать-писать файл последовательно. Надеюсь системные утилиты это и так всегда говорят (по крайней мере cp этот параметр выставляет - видно в strace), но к кешу это не имеет отношения.
У posix_fadvise есть ещё одно заклинание - POSIX_FADV_DONTNEED. Это уже ближе к телу. Но есть проблема - его почему-то утилиты копирования не выставляют, а надо выставлять прочитав каждую страницу данных. Есть костыль, который перехватывает вызовы fopen программы и при закрытии файлового дескриптора объявляет все данные файла как POSIX_FADV_DONTNEED что, кстати, не всегда приводит к немедленному результату - под федорой у меня исходный файл остался закешированным после копирования, а под опенврт - оба файла остались в кеше, и целевой и исходный. Проверяется это программой cachestats, которая входит в состав костыля.
Ну и, наконец, хит сезона - POSIX_FADV_NOREUSE! Это ещё один флаг для posix_fadvise, который какбэ призван дать программам возможность сразу честно признаться в том, что они собираются лишь однократно потрогать байты из файла и больше они им не потребуются.
Вот как описывает ман этот самый POSIX_FADV_NOREUSE:
POSIX_FADV_NOREUSE The specified data will be accessed only once.
In kernels before 2.6.18, POSIX_FADV_NOREUSE had the same semantics as POSIX_FADV_WILLNEED. This was probably a bug; since kernel 2.6.18, this flag is a no-op.
Это же просто охуенно: "this flag is a no-op"!
Так как копировать файлы в этом вашем линупсе не ставя всю систему раком?