Linux中的冷热页机制简述
作者:是非之地 发布时间:2023-11-04 02:03:14
什么是冷热页?
在Linux Kernel的物理内存管理的Buddy System中,引入了冷热页的概念。冷页表示该空闲页已经不再高速缓存中了(一般是指L2 Cache),热页表示该空闲页仍然在高速缓存中。冷热页是针对于每CPU的,每个zone中,都会针对于所有的CPU初始化一个冷热页的per-cpu-pageset.
为什么要有冷热页?
作用有3点:
Buddy Allocator在分配order为0的空闲页的时候,如果分配一个热页,那么由于该页已经存在于L2 Cache中了。CPU写访问的时候,不需要先把内存中的内容读到Cache中,然后再写。如果分配一个冷页,说明该页不在L2 Cache中。一般情况下,尽可能用热页,是容易理解的。什么时候用冷页呢?While allocating a physical page frame, there is a bit specifying whether we would like a hot or a cold page (that is, a page likely to be in the CPU cache, or a page not likely to be there). If the page will be used by the CPU, a hot page will be faster. If the page will be used for device DMA the CPU cache would be invalidated anyway, and a cold page does not waste precious cache contents.
简单翻译一下:当内核分配一个物理页框时,有一些规范来约束我们是分配热页还是冷页。当页框是CPU使用的,则分配热页。当页框是DMA设备使用的,则分配冷页。因为DMA设备不会用到CPU高速缓存,所以没必要使用热页。
Buddy System在给某个进程分配某个zone中空闲页的时候,首先需要用自旋锁锁住该zone,然后分配页。这样,如果多个CPU上的进程同时进行分配页,便会竞争。引入了per-cpu-set后,当多个CPU上的进程同时分配页的时候,竞争便不会发生,提高了效率。另外当释放单个页面时,空闲页面首先放回到per-cpu-pageset中,以减少zone中自旋锁的使用。当页面缓存中的页面数量超过阀值时,再将页面放回到伙伴系统中。
使用每CPU冷热页还有一个好处是,能保证某个页一直黏在1个CPU上,这有助于提高Cache的命中率。
冷热页的数据结构
struct per_cpu_pages {
int count; // number of pages in the list
int high; // high watermark, emptying needed
int batch; // chunk size for buddy add/remove
// Lists of pages, one per migrate type stored on the pcp-lists
每个CPU在每个zone上都有MIGRATE_ * TYPES个冷热页链表(根据迁移类型划分)
struct list_head lists[MIGRATE_ * TYPES];
};
在Linux中,对于UMA的架构,冷热页是在一条链表上进行管理。热页在前,冷页在后。CPU每释放一个order为0的页,如果per-cpu-pageset中的页数少于其指定的阈值,便会将释放的页插入到冷热页链表的开始处。这样,之前插入的热页便会随着其后热页源源不断的插入向后移动,其页由热变冷的几率便大大增加。
怎样分配冷热页
在分配order为0页的时候(冷热页机制只处理单页分配的情况),先找到合适的zone,然后根据需要的migratetype类型定位冷热页链表(每个zone,对于每个cpu,有3条冷热页链表,对应于:MIGRATE_UNMOVABLE、MIGRATE_RECLAIMABLE、MIGRATE_MOVABLE)。若需要热页,则从链表头取下一页(此页最“热”);若需要冷页,则从链表尾取下一页(此页最“冷”)。
分配函数(关键部分已添加注释):
/*
* Really, prep_compound_page() should be called from __rmqueue_bulk(). But
* we cheat by calling it from here, in the order > 0 path. Saves a branch
* or two.
*/
static inline
struct page *buffered_rmqueue(struct zone *preferred_zone,
struct zone *zone, int order, gfp_t gfp_flags,
int migratetype)
{
unsigned long flags;
struct page *page;
//分配标志是__GFP_COLD才分配冷页
int cold = !!(gfp_flags & __GFP_COLD);
again:
if (likely(order == 0)) {
struct per_cpu_pages *pcp;
struct list_head *list;
local_irq_save(flags);
pcp = &this_cpu_ptr(zone->pageset)->pcp;
list = &pcp->lists[migratetype];
if (list_empty(list)) {
//如果缺少页,则从Buddy System中分配。
pcp->count += rmqueue_bulk(zone, 0,
pcp->batch, list,
migratetype, cold);
if (unlikely(list_empty(list)))
goto failed;
}
if (cold)
//分配冷页时,从链表尾部分配,list为链表头,list->prev表示链表尾
page = list_entry(list->prev, struct page, lru);
else
//分配热页时,从链表头分配
page = list_entry(list->next, struct page, lru);
//分配完一个页框后从冷热页链表中删去该页
list_del(&page->lru);
pcp->count--;
} else {//如果order!=0(页框数>1),则不从冷热页链表中分配
if (unlikely(gfp_flags & __GFP_NOFAIL)) {
/*
* __GFP_NOFAIL is not to be used in new code.
*
* All __GFP_NOFAIL callers should be fixed so that they
* properly detect and handle allocation failures.
*
* We most definitely don't want callers attempting to
* allocate greater than order-1 page units with
* __GFP_NOFAIL.
*/
WARN_ON_ONCE(order > 1);
}
spin_lock_irqsave(&zone->lock, flags);
page = __rmqueue(zone, order, migratetype);
spin_unlock(&zone->lock);
if (!page)
goto failed;
__mod_zone_page_state(zone, NR_FREE_PAGES, -(1 << order));
}
__count_zone_vm_events(PGALLOC, zone, 1 << order);
zone_statistics(preferred_zone, zone, gfp_flags);
local_irq_restore(flags);
VM_BUG_ON(bad_range(zone, page));
if (prep_new_page(page, order, gfp_flags))
goto again;
return page;
failed:
local_irq_restore(flags);
return NULL;
}


猜你喜欢
- 由于ASP脚本系统在互联网上广泛的应用,针对ASP系统的脚本攻击越来越流行。在这些攻击中,攻击者多是利用注入、跨站、暴库、上传、cookie
- Linux中许多常用命令是必须掌握的,这里将我学linux入门时学的一些常用的基本命令分享给大家一下,希望可以帮助你们。这个是我将鸟哥书上的
- 网站一定要做出自己的特色,和同类站点站点比较,你的站有什么优势?内容上的优势最能拉住访客,页面亲和度也是不可忽视的,如果两个内容差不多的站,
- 对于遭受DDOS攻击的情况是让人很尴尬的,如果我们有良好的DDoS防御方法,那么很多问题就将迎刃而解,我们来看看我们有哪些常用的有效地方法来
- 百度于昨天正式进入网络游戏市场,百度这次进入网游市场意欲如何?百度进军网游似乎来的太快了,业内不少人士认为百度进入网游市场前景不容乐观。百度
- 今天升级了Typecho,发现很多地方需要改动,烦啊,记一下升级步骤,源自官网FAQ1、删除服务器上的旧文件,请删除如下目录和文件:admi
- 系统:VMTOOLs下载:链接:https://pan.baidu.com/s/1KIzVWtPrb2vSrtokONToBw 提取码:ze
- 很久没有在博客上写关于百度seo的内容了,最近发现了百度这样一个现象,百度会根据链接文字修改网站标题。首先我们在百度搜索网易,排在结果中ww
- 这是一个用来在您站点上显示 Alexa Rank 的插件。http://wordpress.org/extend/plugins/alexa
- 【教程适用于独立主机或者虚拟主机】一、后台→ 全局 → 关闭站点(为了不影响数据库备份)转移开始第一步:备份整站数据并上传到新空间第二步:备
- 有趣的是,用链接文本方式或者其他方法做关键词优化的索引页有时也不能占据前10名搜索结果的位置,但相同域名的内页仍可以做到,至少排名在前20名
- 一项调查显示,超过60%的网民对政府网站不满意,只有7%表示满意。这的确是个值得重视的信号。网民上政府网站,要么是查看信息,要么是反映情况,
- 今天来介绍下如何在Godaddy子域名及别名域名上设置404页面,不过本文只与Linux托管计划有关。子域名上的404错误 你需要为每个指向
- linux usb摄像头设备信息查看linux下usb摄像头操作,离不开v4l2框架V4L2是Video for linux2的简称,为li
- 核心提示:世界万事都存在着蝴蝶效应。当然,在网站搜索引擎优化的过程中同样存在蝴蝶效应。事物总是具有普遍性的。网站SEO是一个整体优化的过程。
- PCIE有四种不同的规格,通过下图来了解下PCIE的其中2种规格 查看主板上的PCI插槽# dmidecode | grep --
- 北京10月16日电2008年12月24日台湾异想数位娱乐有限公司和大陆淘米公司签订合同。《摩尔庄园》在台正式上线。初期推广与大玩国配合,将摩
- 北京时间10月30日消息,据国外媒体报道,美国数字媒体公司RealNetworks周四发布了第三季度财报。财报显示,受削减支出抵消了音乐和游
- 北京时间11月14日早间消息,据国外媒体今日报道,尽管两家公司是竞争对手,但微软创始人、董事长比尔·盖茨(Bill G
- 一、什么是沙盒所谓的“沙盒效应(Sandbox Effect)”对于许多网站管理员来说不像游乐场,倒