减少竞争 per_cpu_pageset
在伙伴系统的研究中,我们看到page是挂在对应的zone下面的,这个数量是固定的。如果我们每次直接从伙伴系统中获取页,那会导致一个问题。
随着cpu个数的增加,对伙伴系统的竞争也会越来越大
linux内核中为了解决这个问题,引入了per_cpu_pageset。
其实理念很简单,就是先从zone这个大仓库里拿一些页出来,放到每个cpu自己的小仓库。用好了,也先放回到这里,等满了再一起还给zone。
那接下来先看看这个结构在zone中是什么样子的。
struct zone
+------------------------------------------------------------------------------------------------+
|pageset |
| (struct per_cpu_pageset *) |
| cpu0 cpu1 cpuN |
| +--------------------------+ +--------------------------+ ... +--------------------------+
| |pcp | |pcp | |pcp |
| | (struct per_cpu_pages) | | (struct per_cpu_pages) | | (struct per_cpu_pages) |
| | +-----------------------+ | +-----------------------+ | +-----------------------+
| | |count | | |count | | |count |
| | |high | | |high | | |high |
| | |batch | | |batch | | |batch |
| | | | | | | | | |
| | |lists[MIGRATE_PCPTYPES]| | |lists[MIGRATE_PCPTYPES]| | |lists[MIGRATE_PCPTYPES]|
+---+--+-----------------------+--+--+-----------------------+--------+--+-----------------------+可以看到,对于任意一个zone都记录了每个cpu上那个小仓库的信息。具体到每个成员的含义为:
count: 当前小仓库中有多少页
high: 如果小仓库里有超过high个数量的页,则还页面到zone
batch: 如果小仓库没有页面了,则一次从zone中找batch个页面来
这些值还能通过/proc/percpu_pagelist_fraction来动态调节。
那系统中是否能够观察到这些数值呢?也是有办法的。通过/proc/zoneinfo就可以。不过这个文件有点大,大家要仔细去看pageset的字段。
我在这里给大家整理出来一个4个node,8个cpu系统上的zoneinfo中pageset的信息。这样或许有个直观的理解。
Last updated