O 'sync' não vai reduzir o buff / cache, apenas solicita que os dados vão para os dispositivos de bloco. O ponto do cache é que os dados permanecem nos caches da RAM. Enviar um 3 para drop_caches não espera que os caches caiam também. Você poderia adicionar um 'sleep 60' antes do 'free'? Isso pode permitir algum tempo para que a memória seja limpa antes de reportar gratuitamente.
Deixar um 'watch -n60 cat / proc / meminfo' pode ajudar a mostrar a área de memória que está crescendo, mas cache e buff não são vazamentos sozinhos, consumindo memória, eles estão cumprindo sua finalidade e fazendo o melhor uso de o recurso disponível do seu sistema.
Se um processo for trocado para o disco, isso não significa automaticamente que algo ruim aconteceu. O kernel está fazendo a coisa certa se esse processo não estiver usando todas as suas páginas e ficar ocioso, há uma chance razoável de que em um servidor web o conteúdo da raiz www seja necessário antes que uma cópia do mutt seja executada. Tela GNU quando o usuário se desconectou, por exemplo.
Se você ainda considera que o kernel está consumindo a RAM através de módulos, você pode inspecionar um pouco mais usando:
awk '{ print $2" "$1 }' /proc/modules | sort -n
Você está usando o ZFS? Isso é uma grande fome para a RAM, mas, assim como o cache, ele tenta manter o disco rígido na memória RAM no caso de ser necessário.