Buffers und Caches Leeren
Geschrieben von: Michael Bäcker Donnerstag, den 14. Januar 2010 um 13:11 Uhr
Manchmal kommt man in die Verlegenheit, die Buffers und Caches eines Linux Rechners zu löschen. Ob man das nur macht, um die Maschine zu bereinigen oder ein Überwachungstool zu befriedigen ist egal. Hier ist der Weg:
Kernels 2.6.16 und höher
linux ~ # free
total used free shared buffers cached
Mem: 3082832 2950204 132628 0 40 1735244
-/+ buffers/cache: 1214920 1867912
Swap: 4200988 45896 4155092
linux ~ # sync && echo 3 > /proc/sys/vm/drop_caches
linux ~ # free
total used free shared buffers cached
Mem: 3082832 1195472 1887360 0 40 74632
-/+ buffers/cache: 1120800 1962032
Swap: 4200988 45896 4155092
Kernel 2.6.15 und kleiner
Hierzu gibt es ein kleines C Programm namens fillmem. Das Program belegt einfach den angegebenen Speicher und beim Beenden gibt er den Speicher wieder frei. Damit werden teile des Caches und der Buffer "entfernt". Der Wert ist MB anzugeben.
linux:/tmp # free
total used free shared buffers cached
Mem: 2074552 1971680 102872 0 92 1798588
-/+ buffers/cache: 173000 1901552
Swap: 4200988 12 4200976
linux:/tmp # sync
linux:/tmp # ./fillmem 1000
linux:/tmp # free
total used free shared buffers cached
Mem: 2074552 996188 1078364 0 44 835336
-/+ buffers/cache: 160808 1913744
Swap: 4200988 16 4200972
fillmem.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 /* * fillmem.c - fill all memory to force the eviction of page cache * * Robert Love < Diese E-Mail-Adresse ist gegen Spambots geschützt! JavaScript muss aktiviert werden, damit sie angezeigt werden kann. > */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #define MB (1024 * 1024) int main (int argc, char *argv[]) { unsigned long nr, i; if (argc < 2) { fprintf (stderr, "usage: %s <memory in MB>\n", argv[0]); return 1; } errno = 0; nr = strtoul (argv[1], NULL, 0); if (errno) { perror ("strtoul"); return 1; } for (i = 0; i < nr; i++) { unsigned long *data; data = malloc (MB); if (!data) { perror ("malloc"); return 1; } memset (data, i, MB); printf ("%p filled with %ld\n", data, i); } printf ("done\n"); return 0; }Das Program kann auf einer entsprechenden Maschine mittels folgendem Kommando übersetzt werden:
gcc fillmem.c -o fillmemQuelle: http://wiki.services.openoffice.org/wiki/Cold-start-simulator