Hugepages的前世今生 (一)

原文链接: http://www.dbaleet.org/the_cirle_of_hugepages/

 

故事的开始得从三句名人名言说起:

IBM的创始人Thomas J. Watson曾经说: “全世界只需要5台电脑就足够了”;

Microsoft的创始人Bill Gates曾在一次演讲中说:“个人用户的计算机内存只需640K ”;

Intel创始人之一Gordon Moore曾经说:“当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍, 性能也会增加一倍”。

后 来的故事我想大家都知道了,前面两句话在今天看上是十分可笑的,而最后那条就是著名的摩尔定律。有句话叫前人栽树,后人乘凉,同时也有一句话叫做父债子偿,天经地义。现今大多数科技成果都是后 人都是基于前人的一些经验或者教训,然后逐步增强或者改良,直至完善。hugepages的出现同样也是因为摩尔定律导致了主机内存越来越大,最后不得不 对于标准pages的改进以提高效率。要了解hugepages首先必须清楚Unix/Linux内存的分配机制。本文从入门的角度介绍Linux的内存 分配机制,当然这一部分内容相信很多人都在计算机体系结构这门课程中学到过,这里就重新温习一下。

早期因为程序非常简单并且使用的内存也非常小,程序的内存地址都是使用程序地址对应物理地址这种这种直接映射的模式,通俗的说就是物理地址是在程序中写死的。想想使用汇编直接操作物理地址是多么壮观的工程呀。对于一个大型的软件系统来说,这部分工作几乎是不可能完成的。后来开始使用“段页式”的方式来管理内存的寻址。用一个时髦的词来说就是引入了“虚拟化”技术。现代操作系统都会使用受保护的虚拟地址模式(protected virtual address mode)来管理内存,Linux下分为三类地址:逻辑地址(Logic Address)、线性地址(Linear Address)与物理地址(Physics Address)。下面是这三者的对应关系。

 

 

简单的说就是逻辑地址通过分段机制映射转化为线性地址,然后线性地址通过分页机制映射转化为物理地址。因为这里是介绍hugepages,所以我这里不打算介绍分段机制,主要对分页机制做简单的阐述。

事实上,地址映射的过程远远不止上图中这么简单。例如在分页机制映射中,一般需要经过四级映射,也就是将线性地址映射为物理地址的过程中,需要从内存中读取至少四次页目录表(Page Directory)和页表 (Page Table)。 众所周知,CPU寄存器与内存的访问速率相差至少一个数量级,所以如果使用传统的分页机制的开销将会非常大。所以在现代的X86架构中,集成了一种被成为TLB(Translation Lookaside Buffer)的硬件级缓存。TLB读写速度非常快,基本和CPU寄存器的速率在一个数量级,而TLB中保缓存了最近使用过的线性地址和物理地址的映射关系。如下图所示:

 

那么将线性地址映射为物理地址的过程如下:首先到TLB中找到这个条目是否存在,如果不存在则为TLB miss,然后使用页表的方式进行寻址,最后把这个映射关系更新到TLB中以备下次使用。由于TLB是大小有限,而一旦出现TLB miss,则其查询的代价很高,所以现代CPU架构基本都进行了一些优化以提高地址映射的效率。,例如

  • 线性地址到物理地址转换一开始就选择同时在TLB和页表进行查询,而不经过TLB查找是否成功的等待;
  • 使用多级TLB以及软TLB,
  • 在CPU context swtch的时候不flush整个TLB。

To be continued…

 

 


© Steven Lee for Oracle Exadata & Best practices, 2013. |

Comment

*

沪ICP备14014813号

沪公网安备 31010802001379号