一、linux内核片缓存概念

Linux 所使用的 slab 分配器的基础是 Jeff Bonwick 为 SunOS 操作系统首次引入的一种算法。Jeff 的分配器是围绕对象缓存进行的。在内核中,会为有限的对象集(例如文件描述符和其他常见结构)分配大量内存。Jeff 发现对内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间。因此他的结论是不应该将内存释放回一个全局的内存池,而是将内存保持为针对特定目而初始化的状态。Linux slab 分配器使用了这种思想和其他一些思想来构建一个在空间和时间上都具有高效性的内存分配器。

Linux内核需要为临时对象如任务或者设备结构和节点分配内存,缓存分配器管理着这些类型对象的缓存。现代Linux内核部署了该缓存分配器以持有缓存,称之为片。不同类型的片缓存由片分配器维护。本文集中讨论slabtop命令,该命令显示了实时内核片缓存信息。

二、slabtop命令相关

slabtop命令是/proc/meminfo(其中的slab项)、/proc/slabinfo、/proc/$pid/smaps、/proc/$pid/maps多个文件内容的综合。其可以很直观的显示进程及内核片缓存的分配情况。

 1[root@361way ~]# slabtop --help
 2usage: slabtop [options]
 3options:
 4  --delay=n, -d n    delay n seconds between updates
 5  --once, -o         only display once, then exit
 6  --sort=S, -s S     specify sort criteria S (see below)
 7  --version, -V      display version information and exit
 8  --help             display this help and exit
 9The following are valid sort criteria:
10  a: sort by number of active objects
11  b: sort by objects per slab
12  c: sort by cache size
13  l: sort by number of slabs
14  v: sort by number of active slabs
15  n: sort by name
16  o: sort by number of objects
17  p: sort by pages per slab
18  s: sort by object size
19  u: sort by cache utilization

1、显示间隔:默认情况下,slabtop每隔3秒刷新一次。但是,如果你想要调整,可以使用-d或者–delay=N选项来调整刷新间隔,以秒为单位;

2、输出一次:-o或–once选项不会刷新输出,它仅仅将一次输出结果丢给STDOUT,然后退出;

3、排序标准:在slabtop输出中有很多字段,-s或–sort=S选项可以根据指定的排序标准对这些字段排序。

 1# slabtop --sort=a
 2活跃:缓存可以通过'a'来对活跃对象编号进行排序。
 3# slabtop -s b
 4对象/分片: 每分片对象数可以使用“b”来选择。
 5# slabtop -s c
 6缓存大小:要选择缓存大小,你需要提供“c”选项。
 7# slabtop -s l
 8分片:分片数量,使用“l”来选择。
 9# slabtop -s v
10活跃分片:活跃分片数量。(注意:这不同于上面讲得活跃对象数量。)使用“v”来根据该标准排序。
11# slabtop -s n
12名称:缓存名称。相关字符是“n”。
13# slabtop -s o
14对象:要根据对象数量排序,使用“o”。
15# slabtop -s p
16每分片页面数:“p”将根据每分片页面数排序。
17# slabtop -s s
18对象大小:对象大小排序由“s”来指定。
19# slabtop -s u
20使用:“u”选项根据缓存使用量排序。

操作输出如下图:

slabtop
slabtop