程序性能优化提升方法--大页内存

转载自 http://blog.chinaunix.net/uid-21706718-id-5781290.html

内存大页提升性能的方法是通过增大操作系统页的大小来减小页表,从而避免快表(TLB)缺失。
该技术是一种系统优化方法,说白了就是在os层面优化,所以应用范围较广。

稍微介绍下程序优化分类:业务优化,设计优化,系统优化。
业务层面优化就是将软件系统能别干的尽量别干,干的事越少性能越高 等等。
设计优化主要是架构层面,集中式还是分布式,尽量减少io或网络通信,选择合适的算法和数据结构,使用缓存等等。
系统优化就是在操作系统层面针对业务系统的特性作优化,比如linux的调度(cpu亲和性,设置实时处理),磁盘调度算法,内存大页就是在这个层面的。
大页内存也有适用范围,下面这个情况就不适合内存大页:程序耗费内存很小或程序访问内存的局部性较好
了解了局限性,内存大页适用的情况也就明确了:程序耗费内存较大(G级别)并且乱序访问。

描述一下内存大页为什么能够避免TLB缺失:
程序访问内存时需要先从页表计算内存的物理地址,再从该地址进行读写,当然中间过程隐藏在os内部。但是程序访问内存是很频繁的,每次都这样计算也太麻烦了(就是说执行速度会很慢),intel为了解决这个问题增设了一个具有并行查找能力的特殊高速缓存,即TLB,用以存放当前访问的那些页表项。因为是缓存,tlb不可能做得很大,通常只存放16~512个页表项。
有了缓存也就有了缓存命中问题,对于常规4K内存页,如果512个表项全用上也就能访问2M的大小,也就是访问这2M大小是最快的,如果再访问其他的2M,就会出现完全不命中(点太背了)。
而对于大型程序这种情况太普遍了,也就是程序一直处于点背状态。
可是使用内存大页基本就能完全避免这种情况,假设页面是2M,也就是说tlb能够缓存1G的内存地址,访问这1G都是最快的。

TLB解释

以下摘自百度百科

1、基本信息
编辑
英文缩写
Translation Lookaside Buffer的缩写,用于虚拟地址与实地址之间的交互,提供一个寻找实地址的缓存区,能够有效减少寻找物理地址所消耗时间。

2、库文件
OLE库文件,其中存放了OLE自动化对象的数据类型、模块和接口定义,自动化服务器通过TLB文件就能了解自动化对象的使用方法。

3、缓冲区
编辑
基本概念
TLB:Translation lookaside buffer,即旁路转换缓冲,或称为页表缓冲;里面存放的是一些页表文件(虚拟地址到物理地址的转换表)。
又称为快表技术。由于“页表”存储在主存储器中,查询页表所付出的代价很大,由此产生了TLB。
X86保护模式下的寻址方式:段式逻辑地址—〉线形地址—〉页式地址;
页式地址=页面起始地址+页内偏移地址;
对应于虚拟地址:叫page(页面);对应于物理地址:叫frame(页框);
X86体系的系统内存里存放了两级页表,第一级页表称为页目录,第二级称为页表。
TLB和CPU里的一级、二级缓存之间不存在本质的区别,只不过前者缓存页表数据,而后两个缓存实际数据。

内部组成
1:TLB在X86体系的CPU里的实际应用最早是从Intel的486CPU开始的,在X86体系的CPU里边,一般都设有如下4组TLB:
第一组:缓存一般页表(4K字节页面)的指令页表缓存(Instruction-TLB);
第二组:缓存一般页表(4K字节页面)的数据页表缓存(Data-TLB);
第三组:缓存大尺寸页表(2M/4M字节页面)的指令页表缓存(Instruction-TLB);
第四组:缓存大尺寸页表(2M/4M字节页面)的数据页表缓存(Data-TLB);
2:TLB命中和TLB失败
如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit);如果TLB中没有所需的页表,则称为TLB失败(TLB Miss)。
3: TLB条目数 即TLB里面可以存储的表项数目,一般也叫entry数。
4:TLB的联合方式
1〉全相联方式:Athlon XP
2〉组相联方式:P4
当CPU执行机构收到应用程序发来的虚拟地址后,首先到TLB中查找相应的页表数据,如果TLB中正好存放着所需的页表,则称为TLB命中(TLB Hit),接下来CPU再依次看TLB中页表所对应的物理内存地址中的数据是不是已经在一级、二级缓存里了,若没有则到内存中取相应地址所存放的数据。既然说TLB是内存里存放的页表的缓存,那么它里边存放的数据实际上和内存页表区的数据是一致的,在内存的页表区里,每一条记录虚拟页面和物理页框对应关系的记录称之为一个页表条目(Entry),同样地,在TLB里边也缓存了同样大小的页表条目(Entry)。

你可能感兴趣的:(日常运维)