7.冷热缓存的初始化(free_area_init_nodes)

zone_pcp_init负责初始化该缓存。该函数由free_area_init_nodes调用。free_area_init_nodes位置参见setup_arch大概步骤
在用zone_batchsize算出批量大小(用于计算最小和最大填充水平的基础)后,(大约相当于内存域中页数的0.25‰。)代码将遍历系统中的所有CPU,同时调用setup_pageset填充每个per_cpu_pageset实例的常量。在调用该函数时,使用了zone_pcp宏来选择与当前CPU相关的内存域的pageset实例。内存域中的内存数量超出512 MiB时,批量大小并不增长。对于页面大小为4 096 KiB的系统,如
果页数超过131 072,则会达到512 MiB的限制。图3-17给出了批量大小与内存域中页数的关系图。

对热页来说,下限为0,上限为6*batch,缓存中页的平均数量大约是4*batch,因为内核不会让缓存水平降到太低。batch * 4相当于内存域中页数的千分之一(这也是zone_batchsize试图将批量
大小优化到总页数0.25‰的原因)。IA-32处理器上L2缓存的数量在0.25 MiB~2 MiB之间,因此在冷热缓存中保持更多的内存是无意义的。根据经验,缓存大小是主内存的千分之一。考虑到当前系统每个
CPU配备的物理内存大约在1 GiB~2 GiB,该规则是有意义的。这样,计算出的批量大小使得冷热缓存中的页有可能放置到CPU的L2缓存中。
冷页列表的水印稍低一些,因为冷页并不放置到缓存中,只用于一些不太关注性能的操作(当然,在内核中这样的操作属于少数)。其上限是batch值的两倍。
pcp->batch决定了在重新填充列表时,有多少页会立即使用。出于性能方面的考虑,一般会向列表添加连续的多页,而不是单页。

 

 

posted @ 2022-03-18 01:51  while(true);;  阅读(103)  评论(0)    收藏  举报