查看Slab allocator信息
关于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/961 或 http://lenky.info/?p=961
备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来信讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。
法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以Email或书面等方式告知,本站将及时删除相关内容或链接。
想知道,slab有没有限制,比如我的一个xfs_buf大概使用了420M内存,会不会出问题呢?