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.
1 |
vm.vfs_cache_pressure = 100 |
Punkt 2: Slab Belegung anzeigen
Mittels slabtop kann man sich ähnlich wie bei top die Belegung anzeigen lassen.
1 2 3 4 5 6 7 8 9 10 11 |
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.
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 45 |
# 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.
1 2 3 |
sync echo 3 > /proc/sys/vm/drop_caches echo 0 > /proc/sys/vm/drop_caches |