Facebook专家:Huge Page是否为拯救性能的万能良药?

准备知识 
 

在阅读本文之前,需要读者至少了解以下基础知识:

 

  • CPU Cache的基本概念
  • NUMA的基本概念
  • 目前Linux基于多核CPU繁忙程度的线程调度机制,参看Chip Multi Processing aware Linux Kernel Scheduler论文。

 

一、关于Huge Page 
 

在正式开始本文分析前,我们先大概介绍下Huge Page的历史背景和使用场景。

 

  • 为什么需要Huge Page 

 

了解CPU Cache大致架构的话,一定听过TLB Cache。Linux系统中,对程序可见的,可使用的内存地址是Virtual Address。每个程序的内存地址都是从0开始的。而实际的数据访问是要通过Physical Address进行的。因此,每次内存操作,CPU都需要从page table中把Virtual Address翻译成对应的Physical Address,那么对于大量内存密集型程序来说page table的查找就会成为程序的瓶颈。

 

所以现代CPU中就出现了TLB(Translation Lookaside Buffer) Cache用于缓存少量热点内存地址的mapping关系。然而由于制造成本和工艺的限制,响应时间需要控制在CPU Cycle级别的Cache容量只能存储几十个对象。那么TLB Cache在应对大量热点数据Virual Address转换的时候就显得捉襟见肘了。

 

我们来算下按照标准的Linux页大小(page size) 4K,一个能缓存64元素的TLB Cache只能涵盖4K*64 = 256K的热点数据的内存地址,显然离理想非常遥远的。于是Huge Page就产生了。 

 

Tips: 这里不要把Virutal Address和Windows上的虚拟内存搞混了。后者是为了应对物理内存不足,而将内容从内存换出到其他设备的技术(类似于Linux的SWAP机制)。

 

 

  • 什么是Huge Page

 

既然改变不了TLB Cache的容量,那么只能从系统层面增加一个TLB Cache entry所能对应的物理内存大小,从而增加TLB Cache所能涵盖的热点内存数据量。假设我们把LinuxPage Size增加到16M,那么同样一个容纳64个元素的TLB Cache就能顾及64*16M = 1G的内存热点数据,这样的大小相较上文的256K就显得非常适合实际应用了。像这种将Page Size加大的技术就是Huge Page。

 

二、Huge Page是万能的? 
 

了解了Huge Page的由来和原理后,我们不难总结出能从Huge Page受益的程序必然是那些热点数据分散且至少超过64个4K Page Size的程序。此外,如果程序的主要运行时间并不是消耗在TLB Cache Miss后的Page Table Lookup上,那么TLB再怎么大,Page Size再怎么增加都是徒劳。在LWN的一篇入门介绍中就提到了这个原理,并且给出了比较详细的估算方法。

 

简单说就是:先通过oprofile抓取到TLB Miss导致的运行时间占程序总运行时间的多少,来计算出Huge Page所能带来的预期性能提升。 

 

简单来说,我们的程序如果热点数据只有256K,并且集中在连续的内存page上,那么一个64个entry的TLB Cache就足以应付了。说到这里,大家可能有个疑问了:既然我们比较难预测自己的程序访问逻辑是否能从开启Huge Page中受益,反正Huge Page看上去只改了一个Page Size,不会有什么性能损失。那么我们就索性对所有程序都是用Huge Page好啦。

 

其实这样的想法是完全错误的!也正是本文想要介绍的一个主要内容,在目前常见的NUMA体系下Huge Page也并非万能钥匙,使用不当甚至会使得程序或者数据库性能下降10%。

 

下面我们重点分析。

 

三、Huge Page on NUMA 
 

“Large Pages May Be Harmful on NUMA Systems”一文的作者曾今做过一个实验,测试Huge Page在NUMA环境的各种不同应用场景下带来的性能差异。从下图可以看到Huge Page对于相当一部分的应用场景并不能很好的提升性能,甚至会带来高达10%的性能损耗。

 

 

性能下降的原因主要有以下两点:

 

CPU对同一个Page抢占增多

 

对于写操作密集型的应用,Huge Page会大大增加Cache写冲突的发生概率。由于CPU独立Cache部分的写一致性用的是MESI协议,写冲突就意味:

 

  • 通过CPU间的总线进行通讯,造成总线繁忙
  • 同时也降低了CPU执行效率。
  • CPU本地Cache频繁失效

 

类比到数据库就相当于,原来一把用来保护10行数据的锁,现在用来锁1000行数据了。必然这把锁在线程之间的争抢概率要大大增加。

 

连续数据需要跨CPU读取(False Sharing)

 

从下图我们可以看到,原本在4K小页上可以连续分配,并因为较高命中率而在同一个CPU上实现locality的数据。到了Huge Page的情况下,就有一部分数据为了填充统一程序中上次内存分配留下的空间,而被迫分布在了两个页上。

 

而在所在Huge Page中占比较小的那部分数据,由于在计算CPU亲和力的时候权重小,自然就被附着到了其他CPU上。那么就会造成:本该以热点形式存在于CPU2 L1或者L2 Cache上的数据,不得不通过CPU inter-connect去remote CPU获取数据。 

 

假设我们连续申明两个数组,Array A和Array B大小都是1536K。内存分配时由于第一个Page的2M没有用满,因此Array B就被拆成了两份,分割在了两个Page里。而由于内存的亲和配置,一个分配在Zone 0,而另一个在Zone 1。那么当某个线程需要访问Array B时就不得不通过代价较大的Inter-Connect去获取另外一部分数据。

 

 

delays re-sulting from traversing a greater physical distance to reach a remote node, are not the most important source of performance overhead. On the other hand, congestion on interconnect links and in memory controllers, which results from high volume of data flowing across the system, can dramatically hurt performance.

Under interleaving, the memory latency re- duces by a factor of 2.48 for Streamcluster and 1.39 for PCA. This effect is entirely responsible for performance improvement under the better policy. The question is, what is responsible for memory latency improvements? It turns out that interleaving dramatically reduces memory controller and interconnect congestion by allevi- ating the load imbalance and mitigating traffic hotspots.

 

四、对策 
 

理想

 

我们先谈谈理想情况。上文提到的论文其实他的主要目的就是讨论一种适用于NUMA架构的Huge Page自动内存管理策略。这个管理策略简单的说是基于Carrefour的一种对Huge Page优化的变种。(注:不熟悉什么是Carrefour的读者可以参看博客之前的科普介绍或者阅读原文) 

 

下面是一些相关技术手段的简要概括:

 

  • 为了减少只读热点数据跨NUMA Zone的访问,可以将读写比非常高的Page,使用Replication的方式在每个NUMA Zone的Direct内存中都复制一个副本,降低响应时间。
  • 为了减少False Sharing,监控造成大量Cache Miss的Page,并进行拆分重组。将同一CPU亲和的数据放在同一个Page中

 

现实

 

谈完了理想,我们看看现实。现实往往是残酷的,由于没有硬件级别的PMU(Performance Monitor Unit)支持,获取精准的Page访问和Cache Miss信息性能代价非常大。所以上面的理想仅仅停留在实验和论文阶段。那么在理想实现之前,我们现在该怎么办呢? 答案只有一个就是测试。

 

  • 实际测试 

 

实际测试的结果最具有说服力。所谓实际测试就是把优化对象给予真实环境的压力模拟。通过对比开启和关闭Huge Page时的性能差别来验证Huge Page是否会带来性能提升。当然大多数应用程序,要想模拟真实环境下的运行情况是非常困难的。那么我们就可以用下面这种理论测试。

 

  • 理论测试 

 

理论测试可以通过profile预估出Huge Page能够带来的潜在提升。具体原理就是计算当前应用程序运行时TLB Miss导致的Page Walk成本占程序总执行时间的占比。当然这种测试方式没有把上文提到的那两种性能损失考虑进去,所以只能用于计算Huge Page所能带来的潜在性能提升的上限。如果计算出来这个值非常低,那么可以认为使用Huge Page则会带来额外的性能损失。具体方法见LWN上介绍的方法 具体的计算公式如下图:

 

 

如果没有hardware的PMU支持的话,计算需要用到oprofile和calibrator。

 

五、总结 
 

并不是所有的优化方案都是0性能损失的。充分的测试和对于优化原理的理解是一个成功优化的前提条件。

 

六、Reference 
 

  1. Huge pages part 5: A deeper look at TLBs and costs
  2. About Huge Page
  3. TLB on Wikipedia
  4. Traffic Management: A Holistic Approach to Memory Placement on NUMA Systems
  5. Large Pages May Be Harmful on NUMA Systems

 

作者介绍 卢钧轶

  • 【DBAplus社群】原创专家;
  • 目前就职于Facebook MySQL Infra Team,主要负责大规模MySQL数据库运维。在Failover,备份,监控,优化,数据库私有云等相关领域有一定经验和个人理解;
  • 之前先后就职于BesTV和大众点评网。曾在阿里嘉年华和中华数据库大会上有过相关分享。


时间: 2024-08-02 05:30:42

Facebook专家:Huge Page是否为拯救性能的万能良药?的相关文章

Huge page使用的一些问题

12c的数据库在安装的时候,有一个检查项目,叫做Maximum locked memory check. 这是要求设置/etc/security/limits.conf中的memlock的值,官方文档在11g要求是设置比物理内存稍小的一个值,在12c中要求至少为90%的物理内存. 而memlock的设置,是启用huge page的一部分.开启hugepage在大内存大sga的环境下,可以提供系统的性能. 启用hugepage需要设置/etc/security/limits.conf和vm.nr_

page fault带来的性能问题

Linux进程如何访问内存 Linux下,进程并不是直接访问物理内存,而是通过内存管理单元(MMU)来访问内存资源.原因后面会讲到. 为什么需要虚拟内存地址空间 假设某个进程需要4MB的空间,内存假设是1MB的,如果进程直接使用物理地址,这个进程会因为内存不足跑不起来.既然进程不是直接访问物理内存,那么进程中涉及的内存地址当然也不是物理内存地址.而是虚拟的内存地址,虚拟的内存地址和物理的内存地址之间保持一种映射关系,这种关系由MMU进行管理.每个进程都有自己独立的虚拟地址空间. 什么是MMU M

Facebook 如何重新设计 HHVM JIT 编译器的性能

2013年夏天,Facebook工程师开始对HHVM JIT编译器进行重大的重新设计,这次重新设计使得Facebook Web服务器CPU的使用率整体降低了15%.Facebook工程师Guilherme Ottoni最近描述了Facebook如何在JIT编译器中利用性能分析引导优化(PGO)技术达到这一效果. 性能分析引导优化技术主要采用运行时分析,例如,识别出更频繁执行的代码,以改进代码的生成.由于编译器和运行时环境的集成特性,PGO更适合集成到动态编译器和JIT编译器中. Facebook

Facebook专家:Hadoop不足以处理大数据

文章讲的是Facebook专家:Hadoop不足以处理大数据,随着大数据在各个业务领域的发展和应用,相关的技术和工具也层出不穷,其中Hadoop框架受到更多的关注和应用.Facebook分析主管Ken Rudin最近在纽约举行的一个Strata+Hadoop世界大会发表主题演讲时表示,不要小看关系型数据库技术的价值.他认为,Hadoop编程框架可能是"大数据"运动的代名词,但它并不是企业从大规模存储的非结构化信息中得到价值的唯一工具. 有很多很普及的大数据的观念需要被质疑,首先一点就是

阿里高级数据库专家何登成:AliSQL性能优化与功能突破的演进之路

首届阿里巴巴在线技术峰会(Alibaba Online Technology Summit),将于7月19日-21日 20:00-21:30 在线举办.本次峰会邀请到阿里集团9位技术大V,分享电商架构.安全.数据处理.数据库.多应用部署.互动技术.Docker持续交付与微服务等一线实战经验,解读最新技术在阿里集团的应用实践. 本次峰会全部开放,免费注册,3天夜间技术交流.每场1.5小时深度分享.长时间互动答疑.素材第一时间公开.用户组同步搭建, 我们希望搭建起业内开发者与阿里技术专家在线交流分享

三体PCC大赛题目 - facebook\微博 like场景 数据库设计与性能压测

标签 PostgreSQL , pipelinedb , facebook , 微博 , 流式统计 背景 高可用架构的一个PCC大赛,看了一下比赛规则,发现PostgreSQL很适合做这个场景,原样复刻,使用PG实现以及性能表现到底如何? 比赛内容介绍如下 https://github.com/archnotes/PCC 实现类似 facebook 中的 like 功能,需要: 可以对一个对象(一条feed.文章.或者url)进行 like 操作,禁止 like 两次,第二次 like 返回错误

Linux传统Huge Pages与Transparent Huge Pages再次学习总结

  Linux下的大页分为两种类型:标准大页(Huge Pages)和透明大页(Transparent Huge Pages).Huge Pages有时候也翻译成大页/标准大页/传统大页,它们都是Huge Pages的不同中文翻译名而已,顺带提一下这个,免得有人被这些名词给混淆.误导了.Huge Pages是从Linux Kernel 2.6后被引入的.目的是使用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能.透明大页

【云和恩墨】性能优化:Linux环境下合理配置大内存页(HugePage)

原创 2016-09-12 熊军  [云和恩墨]性能优化:Linux环境下合理配置大内存页(HugePage) 熊军(老熊) 云和恩墨西区总经理 Oracle ACED,ACOUG核心会员 PC Server发展到今天,在性能方面有着长足的进步.64位的CPU在数年前都已经进入到寻常的家用PC之中,更别说是更高端的PC Server:在Intel和AMD两大处理器巨头的努力下,x86 CPU在处理能力上不断提升:同时随着制造工艺的发展,在PC Server上能够安装的内存容量也越来越大,现在随处

memlock过低导致的数据库性能问题

今天在一台备库机器上准备搭建active data guard ,在主库上做配置的时候,发现主库的反应有些慢,主要的感觉就是敲命令的时候似乎都有些停顿. 带着疑问查看了下数据库的负载情况,发现连进来的用户很少,数据库负载也很低,归档每天切换不到20次 但是使用top命令查看的时候还是能够看到kswapd1的身影,这个进程是一个性能出现问题的标志,因为在之前的一个项目中因为配置hugepage出现问题,结果导致系统出现了严重的swap现象,当时的top 进程就是kswapd这样的进程. 我按照to