slabinfo – kernel slab allocator statistics

WHAT IS SLAB ALLOCATION ?

Slab allocation is a memory management mechanism intended for the efficient memory allocation of kernel objects. It eliminates fragmentation caused by allocations and deallocations. The technique is used to retain allocated memory that contains a data object of a certain type for reuse upon subsequent allocations of objects of the same type. It is analogous to an object pool, but only applies to memory, not other resources.
Instead of parsing the highly verbose /proc/slabinfo file manually, the /usr/bin/slabtop program displays kernel slab cache information in real time. This program allows for custom configurations, including column sorting and screen refreshing.

RELATED SHELL SESSION EXPOSURE

$sudo slabtop -o
 Active / Total Objects (% used)    : 535097 / 607019 (88.2%)
 Active / Total Slabs (% used)      : 21678 / 21678 (100.0%)
 Active / Total Caches (% used)     : 101 / 124 (81.5%)
 Active / Total Size (% used)       : 116716.47K / 136870.05K (85.3%)
 Minimum / Average / Maximum Object : 0.01K / 0.22K / 8.00K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
118209 104139  88%    0.10K   3031       39     12124K buffer_head            
103840 103648  99%    0.25K   6490       16     25960K skbuff_head_cache      
 43225  41001  94%    0.20K   2275       19      9100K vm_area_struct         
 37590  30689  81%    0.19K   1790       21      7160K dentry                 
 32512  28745  88%    0.03K    254      128      1016K kmalloc-32             
 32384  27081  83%    0.06K    506       64      2024K anon_vma_chain         
 29010  28898  99%    0.13K    967       30      3868K kernfs_node_cache      
 20272  12148  59%    0.57K    724       28     11584K radix_tree_node        
 18752  16591  88%    0.06K    293       64      1172K kmalloc-64             
 17342  14540  83%    0.09K    377       46      1508K anon_vma               
 16578  14490  87%    0.59K    614       27      9824K inode_cache            
 14576  11558  79%    0.25K    911       16      3644K filp                   
 12800  11906  93%    0.02K     50      256       200K kmalloc-16             
 12390   9609  77%    1.05K    413       30     13216K ext4_inode_cache       
 10200   6294  61%    0.05K    120       85       480K ftrace_event_field     
  8704   7034  80%    0.01K     17      512        68K kmalloc-8              
  4704   3944  83%    0.09K    112       42       448K kmalloc-96             
  4256   4200  98%    0.07K     76       56       304K Acpi-Operand           
  4074   3120  76%    0.19K    194       21       776K cred_jar               
  3668   3665  99%    0.14K    131       28       524K ext4_groupinfo_4k      
  3570   3570 100%    0.04K     35      102       140K ext4_extent_status     
  3450   2422  70%    0.69K    150       23      2400K shmem_inode_cache      
  3312   2611  78%    0.66K    138       24      2208K proc_inode_cache       
  3200   2599  81%    0.12K    100       32       400K pid                    
  2754   2751  99%    0.04K     27      102       108K Acpi-Namespace         
  2688   2432  90%    0.03K     21      128        84K fscrypt_info           
  2550   1633  64%    0.04K     25      102       100K pde_opener             
  2448   2137  87%    0.50K    153       16      1224K kmalloc-512            
  2394   2134  89%    0.19K    114       21       456K kmalloc-192            
  2384   2171  91%    1.00K    149       16      2384K kmalloc-1024           
  2176   1898  87%    0.12K     68       32       272K kmalloc-128            
  2139   1734  81%    0.69K     93       23      1488K sock_inode_cache       
  2112   2112 100%    0.06K     33       64       132K kmem_cache_node        
  2037   2037 100%    0.38K     97       21       776K kmem_cache             
  1932   1006  52%    0.56K     69       28      1104K i915_vma               
  1840   1819  98%    0.09K     40       46       160K trace_event_file       
  1568   1386  88%    0.07K     28       56       112K eventpoll_pwq          
  1488   1382  92%    2.00K     93       16      2976K kmalloc-2048           
  1472   1200  81%    1.00K     92       16      1472K UNIX                   
  1323    688  52%    0.75K     63       21      1008K xfrm_state             
  1275    896  70%    0.08K     25       51       100K inotify_inode_mark     
   945    903  95%    0.19K     45       21       180K proc_dir_entry         
   896    836  93%    0.25K     56       16       224K kmalloc-256            
   884    782  88%    0.12K     26       34       104K jbd2_journal_head      
   882    777  88%    0.38K     42       21       336K mnt_cache              
   837    663  79%    3.38K     93        9      2976K task_struct            
   810    590  72%    1.06K     27       30       864K mm_struct              
   780    618  79%    1.06K     26       30       832K signal_cache           
   720    593  82%    4.00K     90        8      2880K kmalloc-4096           
   680    563  82%    0.02K      4      170        16K numa_policy            
   640    510  79%    0.25K     40       16       160K pool_workqueue         
   511    292  57%    0.05K      7       73        28K mbcache                
   506    388  76%    0.69K     22       23       352K files_cache            
   450    367  81%    2.06K     30       15       960K sighand_cache          
   288    195  67%    0.12K      9       32        36K secpath_cache          
   256      2   0%    0.02K      1      256         4K jbd2_revoke_table_s    
   234    234 100%    0.10K      6       39        24K blkdev_ioc             
   225    177  78%    1.25K      9       25       288K UDPv6                  
   224    224 100%    0.12K      7       32        28K scsi_sense_cache       
   219    152  69%    0.05K      3       73        12K Acpi-Parse             
   208    144  69%    0.25K     13       16        52K dquot                  
   172    171  99%    8.00K     43        4      1376K kmalloc-8192           
   170    170 100%    0.05K      2       85         8K fscrypt_ctx            
   168    100  59%    1.12K      6       28       192K RAWv6                  
   165    150  90%    2.12K     11       15       352K TCP                    
   128    128 100%    0.06K      2       64         8K dmaengine-unmap-2      
   128    128 100%    0.03K      1      128         4K sd_ext_cdb             
   128    128 100%    0.06K      2       64         8K ext4_io_end            
   112     82  73%    0.50K      7       16        56K skbuff_fclone_cache    
   102    102 100%    0.08K      2       51         8K Acpi-State             
    96     87  90%    0.32K      4       24        32K taskstats              
    85     68  80%    0.23K      5       17        20K tw_sock_TCP            
    85     42  49%    0.94K      5       17        80K RAW                    
    80     80 100%    0.20K      4       20        16K file_lock_cache        
    76     44  57%    0.81K      4       19        64K bdev_cache             
    75     73  97%    0.62K      3       25        48K task_group             
    72     60  83%    8.00K     18        4       576K biovec-max             
    64     42  65%    2.00K      4       16       128K biovec-128             
    64     64 100%    0.12K      2       32         8K ext4_allocation_context
    63     46  73%    0.19K      3       21        12K dmaengine-unmap-16     
    50     50 100%    0.16K      2       25         8K sigqueue               
    50     50 100%    0.62K      2       25        32K i915_request           
    42     42 100%    2.25K      3       14        96K TCPv6                  
    40     20  50%    0.39K      2       20        16K fuse_request           
    38     19  50%    0.20K      2       19         8K ip4-frags              
    36      0   0%    0.43K      2       18        16K uts_namespace          
    34     17  50%    0.23K      2       17         8K posix_timers_cache     
    34      1   2%    0.94K      2       17        32K mqueue_inode_cache     
    32     16  50%    4.00K      4        8       128K names_cache            
    32     32 100%    1.00K      2       16        32K biovec-64              
    30     30 100%    1.06K      1       30        32K dmaengine-unmap-128    
    26     26 100%    0.61K      1       26        16K hugetlbfs_inode_cache  
    25     25 100%    0.62K      1       25        16K rpc_inode_cache        
    21     21 100%    0.75K      1       21        16K dax_cache              
    19     19 100%    0.81K      1       19        16K fuse_inode             
    17      0   0%    0.45K      1       17         8K user_namespace         
    16      0   0%    0.50K      1       16         8K dma-kmalloc-512        
    15      6  40%    6.19K      3        5        96K net_namespace          
    15     15 100%    2.06K      1       15        32K dmaengine-unmap-256    
    13     13 100%    2.40K      1       13        32K request_queue          
     8      2  25%    4.00K      1        8        32K sgpool-128             
     0      0   0%    0.09K      0       42         0K dma-kmalloc-96         
     0      0   0%    0.19K      0       21         0K dma-kmalloc-192        
     0      0   0%    0.01K      0      512         0K dma-kmalloc-8          
     0      0   0%    0.02K      0      256         0K dma-kmalloc-16         
     0      0   0%    0.03K      0      128         0K dma-kmalloc-32         
     0      0   0%    0.06K      0       64         0K dma-kmalloc-64         
     0      0   0%    0.12K      0       32         0K dma-kmalloc-128        
     0      0   0%    0.25K      0       16         0K dma-kmalloc-256        
     0      0   0%    1.00K      0       16         0K dma-kmalloc-1024       
     0      0   0%    2.00K      0       16         0K dma-kmalloc-2048       
     0      0   0%    4.00K      0        8         0K dma-kmalloc-4096       
     0      0   0%    8.00K      0        4         0K dma-kmalloc-8192       
     0      0   0%    0.12K      0       34         0K iint_cache             
     0      0   0%    0.30K      0       26         0K blkdev_requests        
     0      0   0%    0.30K      0       26         0K request_sock_TCP       
     0      0   0%    0.94K      0       17         0K PING                   
     0      0   0%    0.31K      0       25         0K xfrm_dst_cache         
     0      0   0%    0.03K      0      128         0K dnotify_struct         
     0      0   0%    0.19K      0       21         0K userfaultfd_ctx_cache  
     0      0   0%    0.12K      0       34         0K cfq_io_cq              
     0      0   0%    0.30K      0       26         0K request_sock_TCPv6     
     0      0   0%    0.23K      0       17         0K tw_sock_TCPv6          
     0      0   0%    1.12K      0       28         0K PINGv6                 
$

RELATED CODE PARTS FROM LINUX KERNEL

A

struct slabinfo {
	unsigned long active_objs;
	unsigned long num_objs;
	unsigned long active_slabs;
	unsigned long num_slabs;
	unsigned long shared_avail;
	unsigned int limit;
	unsigned int batchcount;
	unsigned int shared;
	unsigned int objects_per_slab;
	unsigned int cache_order;
};

void get_slabinfo(struct kmem_cache *s, struct slabinfo *sinfo);
void slabinfo_show_stats(struct seq_file *m, struct kmem_cache *s);
ssize_t slabinfo_write(struct file *file, const char __user *buffer,
		       size_t count, loff_t *ppos);

B

void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)
{
	unsigned long active_objs, num_objs, active_slabs;
	unsigned long total_slabs = 0, free_objs = 0, shared_avail = 0;
	unsigned long free_slabs = 0;
	int node;
	struct kmem_cache_node *n;

	for_each_kmem_cache_node(cachep, node, n) {
		check_irq_on();
		spin_lock_irq(&n->list_lock);

		total_slabs += n->total_slabs;
		free_slabs += n->free_slabs;
		free_objs += n->free_objects;

		if (n->shared)
			shared_avail += n->shared->avail;

		spin_unlock_irq(&n->list_lock);
	}
	num_objs = total_slabs * cachep->num;
	active_slabs = total_slabs - free_slabs;
	active_objs = num_objs - free_objs;

	sinfo->active_objs = active_objs;
	sinfo->num_objs = num_objs;
	sinfo->active_slabs = active_slabs;
	sinfo->num_slabs = total_slabs;
	sinfo->shared_avail = shared_avail;
	sinfo->limit = cachep->limit;
	sinfo->batchcount = cachep->batchcount;
	sinfo->shared = cachep->shared;
	sinfo->objects_per_slab = cachep->num;
	sinfo->cache_order = cachep->gfporder;
}

LINKS
https://lkml.org/lkml/2017/3/27/370
http://www.secretmango.com/jimb/Whitepapers/slabs/slab.html
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/4/html/Reference_Guide/s2-proc-slabinfo.html
https://en.wikipedia.org/wiki/Slab_allocation