Das Speichermanagement des Linux Kernels möchte den freien Arbeitsspeicher immer sinnvoll nutzen. Inodes und Dentries werden im weniger bekannten Slab Cache zwischengelagert.
Der Slab allocator ist ein Verfahren zur Verwaltung von Arbeitsspeicher, das viele Betriebssysteme und auch Anwendungen verwenden. Der Algorithmus hat zum Ziel, dass bei der häufig vorkommenden Reservierung kleiner Speicherbereiche der vorhandene Arbeitsspeicher möglichst effizient, also mit wenig Verschwendung, genutzt wird.
Punkt 1: Kernel Verhalten ändern
Der Kernel gibt standardmäßig 100% des Slab Caches automatisch frei. Man kann diese System Variable jedoch prozentual in der Datei /etc/sysctl.conf verändern.
vm.vfs_cache_pressure = 100
Punkt 2: Slab Belegung anzeigen
Mittels slabtop kann man sich ähnlich wie bei top die Belegung anzeigen lassen.
Active / Total Objects (% used) : 12604895 / 13198553 (95,5%)
Active / Total Slabs (% used) : 1786010 / 1786049 (100,0%)
Active / Total Caches (% used) : 132 / 248 (53,2%)
Active / Total Size (% used) : 6154229,64K / 6201434,19K (99,2%)
Minimum / Average / Maximum Object : 0,02K / 0,47K / 4096,00K
OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
5755712 5755674 99% 0,85K 1438928 4 5755712K ext3_inode_cache
3329841 3312702 99% 0,22K 195873 17 783492K dentry
2771522 2770043 99% 0,10K 74906 37 299624K buffer_head
651832 142356 21% 0,06K 11048 59 44192K size-64
Der genutzte Slab Memory wird auch in /proc/meminfo sichtbar.
# cat /proc/meminfo
MemTotal: 32936116 kB
MemFree: 705256 kB
Buffers: 8605412 kB
Cached: 12437288 kB
SwapCached: 91360 kB
MemCommitted: 14155776 kB
VirtualSwap: 0 kB
Active: 10881568 kB
Inactive: 13995968 kB
Active(anon): 3079848 kB
Inactive(anon): 1039892 kB
Active(file): 7801720 kB
Inactive(file): 12956076 kB
Unevictable: 3868 kB
Mlocked: 3868 kB
SwapTotal: 999992 kB
SwapFree: 701920 kB
Dirty: 29772 kB
Writeback: 0 kB
AnonPages: 3755592 kB
Mapped: 392560 kB
Shmem: 283252 kB
Slab: 7148612 kB
SReclaimable: 7038152 kB
SUnreclaim: 110460 kB
KernelStack: 12376 kB
PageTables: 97284 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 17468048 kB
Committed_AS: 20669952 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 86268 kB
VmallocChunk: 34359520216 kB
HardwareCorrupted: 0 kB
AnonHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 7872 kB
DirectMap2M: 33538048 kB
Punkt 3: Slab Cache leeren
Sollte der Kernel einmal nicht schnell genug den Slab Cache freigeben, kann man dies auch erzwingen.
sync
echo 3 > /proc/sys/vm/drop_caches
echo 0 > /proc/sys/vm/drop_caches