$ find . -type f | wc -l
26271
$ du -hs
774M .
$ time find . -type f | xargs cat > /dev/null
real 0m22.487s
user 0m0.025s
sys 0m0.797s
$ time find . -type f | xargs cat > /dev/null
real 0m26.454s
user 0m0.055s
sys 0m0.764s
Файлы в каталоге между запусками последних двух команд не изменяются, в gstat при выполнении этих команд наблюдается чтение диска с одинаковой интенсивностью.
А вот и ответ: за количество файлов, которые могут быть закэшированы овтечает параметр kern.maxvnodes. У меня он был равен 20000. Так как файлов много (26к), часть не попадала в кэш. После увеличения параметра все работает как надо.
upd. Общий объем памяти, которая может использоваться для кэша дисков - vfs.maxbufspace. Для увеличения в x64 тюнить kern.nbuf: vfs.maxbufspace / 16384 = kern.nbuf(ro, loader.conf)