momo zone

调核人的blog

kernel 2.6.38 特性–Transparent huge pages

翻译过来应该是透明大内存页。所谓的大内存页就是大于4KB的页。什么? 教课书上不是说页都是4KB吗?  哦,有此疑问的需要更新一下新知识了,以免落伍。大内存页的好处显而易见,免得频繁调度内存页,减少缺页异常,提高应用程序效率。 缺点嘛 就是写这类程序时要考虑一下内存分配以及回收策略(应用程序的话应该有库摆平了)。

另外大内存页还有一个隐含的好处:可完全避免虚拟地址到物理地址的转换。为什么?  因为cpu里面有个TLB缓存(恨死了,当初oracle面试我这个是啥东西我竟不知道 ,很丢人)里面放的就是虚拟地址对应的物理地址,当程序需要寻址/载入某虚拟地址时,CPU会首先读/写TLB缓存,如果有对应虚拟地址的项就直接发出/更新TLB中的物理地址,而不用CPU按照页表去计算物理地址。然而TLB是一个稀缺资源,用cpuid可以查看TLB的缓存相数:

   cache and TLB information (2):
      0xb1: instruction TLB: 2M/4M, 4-way, 4/8 entries
      0xb0: instruction TLB: 4K, 4-way, 128 entries
      0x05: data TLB: 4M pages, 4-way, 32 entries

指令4K页的有128项缓冲,数据4M页有32项缓冲。指令2M/4M页有4/8项

看起来相当稀缺啊(增加这个会提高cpu设计/制造成本吗?),所以当使用4K页的时候这128项地址映射缓冲将会频繁更新,导致性能下降。那么还有2M/4M页缓冲呢,能用吗?

答案是能用,但问题之前仅是内核代码和数据段在使用。一般的应用程序如果想用,必须程序员和系统管理员都忙活一下,借助libhugetlbfs这个库来启用(可以参考 http://www.ibm.com/developerworks/cn/linux/es-lop-leveragepages/index.html)。

这次内核的透明大内存页特性就是使内核发现适合启用大内存页的情景,并自动启用。实现方法是在内核中启动khugepaged 这个内核线程来收集4KB页表,一旦发现有连续分配的情况就把页表项合并。目前它的开发进度是仅能够应付2MB的大内存页。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

%d 博主赞过: