Используя posix_fadvise, вы можете намекнуть ОС, что она должна удалить определенные файловые блоки из кэша. Вместе с информацией из mincore, которая сообщает нам, какие блоки в настоящее время кэшируются, мы можем изменить работу приложений, не нарушая буферный кеш.
Этот восхитительный обходной путь для [не] реализованных функций ядра подробно описан:
http://insights.oetiker.ch/linux/fadvise/
[Редактировать] Последствия упреждающего чтения ядра
Для полной производительности чтения, вы должны обязательно отбрасывать только те страницы, которые вы уже прочитали. В противном случае вы отбросите страницы, которые ядро услужливо читает заранее :). (Я думаю, что это должно быть определено как неправильное предвидение readahead, которое могло бы отключить его и, по крайней мере, избежать большого количества потерянного ввода-вывода. Но упреждающее чтение очень полезно, поэтому вы должны избегать его отключения).
Кроме того, держу пари, что если вы тестируете страницы непосредственно перед последним чтением, они всегда отображаются как встроенные. Это не скажет вам, использовал ли кто-то еще их или нет. Все, что он покажет, это то, что ядро с опережением чтения работает:).
Код в связанном патче rsync должен быть в порядке (игнорируя хак с "массивом всех fds"). Он проверяет весь файл перед первым чтением. Это разумно, потому что требуется только внутреннее выделение 1 байта на страницу файла 4 КБ.