てっきりLinuxにはMADV_DONTNEEDがあるからMADV_FREEは実装されないものだと思ってたら、Linux 4.5で登場してた。この辺に詳しい。 Volatile ranges and MADV_FREE
ぱっと見た感じ、MADV_DONTNEEDはcallされると即座にinvalidateされるのに対し、MADV_FREEはcallされてもshrinkerから追い出されるまでは必ずしもinvalidateされるわけではない、という感じっぽい。どちらも、ユーザランドからkernelにmmapした領域をもうイラネと通知するための仕組み。invalidateされると、その後はじめてアクセスするタイミングでAnonymousページだとゼロフィルされたページが再度割り当てられる。backendがある場合(ファイルをmmapしたなど)は再度データを読み込んだページを割り当てる。
・・・みたいな感じのことをmadvise(2)のmanを見るだけでユーザはちゃんと理解できるんだろうか、とか思わなくもない・・・
VMとFilesystem回りのパフォーマンスチューニングは難しくて、メモリをいっぱい使いたいんだけどOOM Killerが走るほどは使いたくない、みたいな微妙なラインをユーザランドも意識したい場合とか、ポリシー策定がめんどいよなぁ。とりあえず使いこなすのが難しいSyscall類などなど、mmap, munmap, msync, readahead, posix_fadvise, madvise, mprotect, mlock, mlockall 最終的な環境がわからずにこれら使ってチューニングするとたいていは逆に悪化するような気がする。