« Отговор #8 -: Feb 13, 2007, 11:20 »
От 2.6.17 нататък има вариант през procfs да форс-неш изхвърлянето от РАМ-та на (почти) всичкия cache - ако не се лъжа през /proc/sys/vm/drop_cache става номера.
Дори с по-старо 2.6 ядро това не е много сложно - имайки предвид колко свободна РАМ имаш, както и колко от нея е заета за кеширане, просто пишеш няколко реда програма, която malloc()-ва определен обем памет. Смъкваш swappiness на 0, за да изхвърляш максимално ефективно кешираната информация, вдигаш vfs_cache_pressure на някаква голяма стойност, защото линукския VMM упорито избягва да изхвърля от паметта малки обекти, каквито са inode/dentry кешираните глупости. След това компилираш програмката, викаш sync, за да се flush-нат и dirty буферите, и изпълняваш програмата. Обикновено почти никакъв кеш не е останал в паметта ако си сметнал колко памет да malloc()-невш като хората. Ако случайно си заделил повечко памет без да искаш (дори и много правилни сметки да си правил, не можеш да гарантираш, че някой процес не е заявил повечко памет точно тогава да речем) - тогава ще забележиш, че системата леко е навлязла в swap-a. Тъй като след тази операция със сигурност имаш освободена немалко оперативна памет, можеш спокойно да направиш swapoff -a;swapon -a, би трябвало да мине бързо и без грешки.
Това всичкото при положение че имаш упоритото желание да гониш кешове от паметта де. В повечето случаи това е глупава идея, но наистина има варианти, в които се кешира абсолютно безсмислена информация - примерно ако монтираш отдалечена файлова система и и изчетеш директориите и след това я размонтираш или загубиш свързаност, почти всичкия vfs cache свързан с нея, ще остане в рам-та (buffer cache-a иначе ще се flush-не при umount). Друго приложение на горните методи е ако правиш тестове за прозводителност, за които кешът влияе силно върху крайните резултати.