首页 > *nix技术, Shell命令, 内存管理, 系统管理 > 查看Slab allocator信息

查看Slab allocator信息

2012年1月30日 发表评论 阅读评论 5,251 次浏览

关于Linux Slab的简单介绍就是一种对相同大小内存对象的分配与释放的优化管理机制。下面主要介绍如何查看Linux系统上Slab allocator的状态统计信息,而这可以通过/proc/slabinfo接口查看,比如:

[root@localhost ~]# cat /proc/slabinfo 
slabinfo - version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
xfs_buf               10     12    320   12    1 : tunables   54   27    8 : slabdata      1      1      0
fstrm_item             0      0     24  144    1 : tunables  120   60    8 : slabdata      0      0      0
xfs_mru_cache_elem      0      0     32  112    1 : tunables  120   60    8 : slabdata      0      0      0
xfs_ili                0      0    216   18    1 : tunables  120   60    8 : slabdata      0      0      0
xfs_inode           4882   4884    960    4    1 : tunables   54   27    8 : slabdata   1221   1221      0
...
scsi_data_buffer       0      0     24  144    1 : tunables  120   60    8 : slabdata      0      0      0
ext3_inode_cache   80932  80985    752    5    1 : tunables   54   27    8 : slabdata  16197  16197      0
ext3_xattr           156    220     88   44    1 : tunables  120   60    8 : slabdata      5      5      0
journal_handle         0      0     24  144    1 : tunables  120   60    8 : slabdata      0      0      0
...
dentry             88464  88540    192   20    1 : tunables  120   60    8 : slabdata   4427   4427      0
names_cache           21     21   4096    1    1 : tunables   24   12    8 : slabdata     21     21      0
avc_node               0      0     64   59    1 : tunables  120   60    8 : slabdata      0      0      0
selinux_inode_security   2244   2438     72   53    1 : tunables  120   60    8 : slabdata     46     46      0
key_jar                8     20    192   20    1 : tunables  120   60    8 : slabdata      1      1      0
buffer_head        78185 185407    104   37    1 : tunables  120   60    8 : slabdata   5011   5011      0
vm_area_struct     10000  10059    184   21    1 : tunables  120   60    8 : slabdata    479    479      0
...
size-128            1959   2190    128   30    1 : tunables  120   60    8 : slabdata     73     73      0
size-32             9793   9856     32  112    1 : tunables  120   60    8 : slabdata     88     88      0
kmem_cache           188    188   2176    1    1 : tunables   24   12    8 : slabdata    188    188      0
[root@localhost ~]# 

以“xfs_buf 10 12 320 12 1 : tunables 54 27 8 : slabdata 1 1 0”为例,介绍一下相关字段:
xfs_buf:# name,Slab cache对象名称,必须是唯一
10:active_objs,活动对象个数
12:num_objs,总对象个数,可以看出有2个处于非活动状态,即如果当前有程序申请一个xfs_buf,那么可以直接从这2个处于非活动状态的对象中获取一个用于分配。
320:objsize,每个对象大小,以字节为单位。
12:objperslab,一个slab包含有几个xfs_buf对象。
1 : tunables:pagesperslab : tunables,一个slab占用几个page内存页。可以算一下,一个slab的大小为320*12=3840,小于4096(我这里,内存页为4K),所以一个slab只需占用1个page内存页。另外,cache对象本身需要存储一个额外的管理信息,即有overhead,所以一个xfs_buf slab的大小不止3840。
1:active_slabs,活动slab个数。
1:num_slabs,总slab个数。

另外,对于SMP机器,为了进一步提高cache对象性能,比如CPU0上释放的xfs_buf对象仍然会尽可能的被CPU0重新利用,而不是CPU1。
54:limit,每一个CPU的per-CPU空闲链接允许的最大对象个数。
27:batchcount,在SMP机器上,填充per-CPU可用空闲链接的一次批处理数量。

如果打开了CONFIG_DEBUG_SLAB内核选项,可用看到更多的字段。

还有一个更直观的Slab查看工具:

[root@localhost ~]# slabtop --help
usage: slabtop [options]

options:
  --delay=n, -d n    delay n seconds between updates
  --once, -o         only display once, then exit
  --sort=S, -s S     specify sort criteria S (see below)
  --version, -V      display version information and exit
  --help             display this help and exit

The following are valid sort criteria:
  a: sort by number of active objects
  b: sort by objects per slab
  c: sort by cache size
  l: sort by number of slabs
  v: sort by number of active slabs
  n: sort by name
  o: sort by number of objects
  p: sort by pages per slab
  s: sort by object size
  u: sort by cache utilization
[root@localhost ~]# 

一般而言,我们当然是要查看占用内存最多的cache,所以也就是:

[root@localhost ~]# slabtop -s c
 Active / Total Objects (% used)    : 347594 / 465486 (74.7%)
 Active / Total Slabs (% used)      : 34121 / 34121 (100.0%)
 Active / Total Caches (% used)     : 100 / 189 (52.9%)
 Active / Total Size (% used)       : 113633.26K / 127561.78K (89.1%)
 Minimum / Average / Maximum Object : 0.02K / 0.27K / 4096.00K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
 80860  80805  99%    0.73K  16172        5     64688K ext3_inode_cache
185370  77714  41%    0.10K   5010	 37     20040K buffer_head
 87140  86956  99%    0.19K   4357	 20     17428K dentry
 23520  20235  86%    0.55K   3360        7     13440K radix_tree_node
  4884   4882  99%    0.94K   1221        4	 4884K xfs_inode
 10185   9963  97%    0.18K    485	 21	 1940K vm_area_struct
  2688   2545  94%    0.52K    384        7	 1536K inode_cache
   702    673  95%    2.00K    351        2	 1404K size-2048
 11856  11761  99%    0.08K    247	 48	  988K sysfs_dir_cache
   892    880  98%    1.00K    223        4	  892K size-1024
  4040   3770  93%    0.19K    202       20	  808K filp
   201    201 100%    4.00K    201	  1	  804K size-4096
   188    188 100%    2.12K    188        1	  752K kmem_cache
   183    173  94%    2.06K     61        3	  488K sighand_cache
  7080   5925  83%    0.06K    120	 59	  480K size-64
   224    199  88%    1.73K     56        4	  448K task_struct
   872    860  98%    0.50K    109        8	  436K size-512
   455    437  96%    0.73K     91        5	  364K shmem_inode_cache
  9856   9780  99%    0.03K     88	112	  352K size-32
  6622   6245  94%    0.05K     86	 77	  344K anon_vma_chain
   602    574  95%    0.57K     86        7	  344K proc_inode_cache
  1540   1502  97%    0.19K     77	 20	  308K size-192
  4081   3961  97%    0.07K     77	 53	  308K Acpi-Operand
   385    363  94%    0.75K     77        5	  308K UNIX
   444    427  96%    0.62K     74        6	  296K sock_inode_cache
  2190   1938  88%    0.12K     73	 30	  292K size-128
   960    420  43%    0.25K     64	 15	  256K skbuff_head_cache
  5520   5245  95%    0.04K     60	 92	  240K anon_vma
   200    174  87%    0.88K     50        4	  200K signal_cache
   343    339  98%    0.53K     49        7	  196K idr_layer_cache
  2438   2244  92%    0.07K     46	 53	  184K selinux_inode_security
   136    102  75%    0.88K     34        4	  136K mm_struct
    34     34 100%    4.00K     34        1	  136K biovec-256
     1      1 100%  128.00K	 1        1	  128K size-131072
  2852   2829  99%    0.04K     31	 92	  124K Acpi-Namespace
   560    381  68%    0.19K     28	 20	  112K cred_jar
   143    105  73%    0.69K     13	 11	  104K files_cache
    36     33  91%    2.20K     12        3        96K blkdev_queue

当然,也可以在进入slabtop后再按c等进行排序,和top命令类似。

转载请保留地址:http://www.lenky.info/archives/2012/01/961http://lenky.info/?p=961


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。

  1. guochao
    2014年3月26日10:29 | #1

    想知道,slab有没有限制,比如我的一个xfs_buf大概使用了420M内存,会不会出问题呢?

  1. 本文目前尚无任何 trackbacks 和 pingbacks.