Linux Kernel RAM Usage – How Much RAM Does the Kernel Use?

kernellinuxram

This question is motivated by my shock when I discovered that Mac OS X kernel uses 750MB of RAM.

I have been using Linux for 20 years, and I always "knew" that the kernel RAM usage is dwarfed by X (is it true? has it ever been true?).

So, after some googling, I tried slabtop which told me:

Active / Total Size (% used)       : 68112.73K / 72009.73K (94.6%)

Does this mean that my kernel is using ~72MB of RAM now?

(Given that top reports Xorg's RSS as 17M, the kernel now dwarfs X, not the other way around).

What is the "normal" kernel RAM usage (range) for a laptop?

Why does MacOS use an order of magnitude more RAM than Linux?

PS. No answer here addressed the last question, so please see related questions:

Best Answer

Kernel is a bit of a misnomer. The Linux kernel is comprised of several proceses/threads + the modules (lsmod) so to get a complete picture you'd need to look at the whole ball and not just a single component.

Incidentally mine shows slabtop:

 Active / Total Size (% used)       : 173428.30K / 204497.61K (84.8%)

The man page for slabtop also had this to say:

The slabtop statistic header is tracking how many bytes of slabs are being used and it not a measure of physical memory. The 'Slab' field in the /proc/meminfo file is tracking information about used slab physical memory.

Dropping caches

Dropping my caches as @derobert suggested in the comments under your question does the following for me:

$ sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
$

 Active / Total Size (% used)       : 61858.78K / 90524.77K (68.3%)

Sending a 3 does the following: free pagecache, dentries and inodes. I discuss this more in this U&L Q&A titled: Are there any ways or tools to dump the memory cache and buffer?". So 110MB of my space was being used by just maintaining the info regarding pagecache, dentries and inodes.

Additional Information

So how much RAM is my Kernel using?

This picture is a bit foggier to me, but here are the things that I "think" we know.

Slab

We can get a snapshot of the Slab usage using this technique. Essentially we can pull this information out of /proc/meminfo.

$ grep Slab /proc/meminfo
Slab:             100728 kB

Modules

Also we can get a size value for Kernel modules (unclear whether it's their size from on disk or when in RAM) by pulling these values from /proc/modules:

$ awk '{print $1 " " $2 }' /proc/modules | head -5
cpufreq_powersave 1154
tcp_lp 2111
aesni_intel 12131
cryptd 7111
aes_x86_64 7758

Slabinfo

Much of the details about the SLAB are accessible in this proc structure, /proc/slabinfo:

$ less /proc/slabinfo | head -5
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
nf_conntrack_ffff8801f2b30000      0      0    320   25    2 : tunables    0    0    0 : slabdata      0      0      0
fuse_request         100    125    632   25    4 : tunables    0    0    0 : slabdata      5      5      0
fuse_inode            21     21    768   21    4 : tunables    0    0    0 : slabdata      1      1      0

Dmesg

When your system boots there is a line that reports memory usage of the Linux kernel just after it's loaded.

$ dmesg |grep Memory:
[    0.000000] Memory: 7970012k/9371648k available (4557k kernel code, 1192276k absent, 209360k reserved, 7251k data, 948k init)

References