资讯专栏INFORMATION COLUMN

Linux大页与透明大页

IT那活儿 / 1879人阅读
Linux大页与透明大页

点击上方“IT那活儿”,关注后了解更多精彩内容!!!




前言




最近看着手头维护的数据库服务器,发现物理内存是越来越大,500G起步,TB也不在话下。都知道数据库是一种吃内存的软件,但是面对如此巨大的物理内存,如何高效的使用又成了一个话题,于是各家数据库软件厂商针对这个问题都引入了参数调优。

比如oracle的use_large_pages,mysql的large_pages,postgres的huge_pages等参数,都是用来告诉数据库是否使用大页模式的内存策略。





大页vs透明大页




这里有个关键词就是 大页(huge page),我们以postgres为例来查一下他们的文档解释:

其中有2段话比较重要,第一段就是说使用大页(huge page)能够缩小page tables,减少cpu在内存管理上的的系统开销,提高性能注意依赖于操作系统的大页配置情况。而第二段意思说在Linux/FreeBSD这类操作系统上还有一种自动的大页(huge page)管理策略称之为透明大页(transparent  huge page/ THP), 而THP经常会导致数据库性能下降,hang之类的,需要禁用这个THP策略。作为oracle老司机一看这个TPH就很懂,不管是MOS上的文档,还是处理过的案例都是一茬一茬的。如下:

由于THP引起大量的重启、以及性能问题 Oracle强烈建议客户关闭THP特性。

经过数据库的文档描述我们知道,数据库厂商都建议启用大页来提升性能,并且都强烈建议关闭透明大页以免引起各类故障。接下来我们就来深入了解一下这2个点:

大页(huge page/large page):

我们以rhel的文档为参考,如下:

文档主要描述linux大多数页为标准页4k,当内存较大时建议配置大页,降低开销之类的。

Linux内存采用段页式管理,这里我们不在深入探讨。物理内存会按照标准页(page)4k来进行划分,所有的4k页打包在一块就是page tables,比较简单。当物理内存为100G时 page tables=(100*1024*1024/4)。

由此可以确认page tables与物理内存成正比关系,随着物理内存的增长,page tables 则会越来越庞大不利于管理,损耗就会逐步上升。举个例子:当我们口袋里有1000块的1元时,钱包都炸裂了,可以想象这是多么恐怖的一件事。此时我们就需要使用50和100的单位了。这个单位就是具体的 huge page size,通常在linux中为2048k,也就是2M。当巨量的数据库内存使用2M 的大页时,产生的page tables则相对较小,page table的理开销则相对较小,从而提升系统性能。如下图:

实际数据库一般使用共享内存,大量的用户连接进程attach到一个巨大的共享内存段(page table)时,也会产生隐性开销,比如进程fork过慢导致数据库连接建立缓慢等等。搞清楚了大页原理,我们在设置数据库大页时则相对简单了,一般计算公式为:

大页数=共享内存(GB) *1024/2,当我们算出页量时,设置Linux 参数vm.nr_hugepages就可以了,如下:

图中我们使用计算器求出3G内存的页数,然后设置nr_hugepages使之生效,就是HugePages_Total,当然我们这里没有使用所以大页都是Free状态. 注意写入sysctl.conf中后可以永久生效。

透明大页(transparent huge page / THP)


老样子先查一下rhel的文档描述,如下:

主要描述由于上文的大页配置为手动模式,不是很灵活,于是内核又搞出了一个自动分配大页的技术,用来代替手动分配大页。以及THP主动性的分配连续大页内存以及频繁的page compact等可能会导致内存分配延迟,引发性能问题。

关闭也很简单,如下:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled

#
 或者修改/etc/grub.conf 添加transparent_hugepage=neve





总结



最后我们总结一下,实际在数据库服务器上,巨大的共享内存段属于启动时的一次性分配,且大部分的启动操作都属于计划性的工作,不需要内核给我们动态分配,而数据库连接的那些server process往往内存较小也不需要用到大页,也就是Oracle强烈建议关闭THP的原因,本文就到此为止。





END




本 文 原 创 来 源:IT那活儿微信公众号(上海新炬王翦团队)


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129728.html

相关文章

  • Swoole 源码分析——内存模块之共享内存

    摘要:前言我们知道,由于没有多线程模型,所以更多的使用多进程模型,因此代码相对来说更加简洁,减少了各种线程锁的阻塞与同步,但是也带来了新的问题数据同步。相比多线程之前可以直接共享进程的内存,进程之间数据的相互同步依赖于共享内存。 前言 我们知道,由于 PHP 没有多线程模型,所以 swoole 更多的使用多进程模型,因此代码相对来说更加简洁,减少了各种线程锁的阻塞与同步,但是也带来了新的问题...

    diabloneo 评论0 收藏0
  • Linux 30周年:Linux 5.14闪亮登场!添加新硬件和秘密内存区域支持

    摘要:或许,最重要的是和内核调度,两者都是进行清理工作,以缓解英特尔的和漏洞。说到英特尔,增加了对的平台的更多支持,该平台可根据需要优先处理工作负载。另外,还将增加戴尔硬件隐私支持。linux之父Linus Torvald:庆祝完Linux 30 岁了吧,一起来看新的 Linux 5.14。linux5.14晋升为稳定版,在精彩的2021年秋季linux发行版大量出现之前提供最新的功能、硬件支持和...

    NicolasHe 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<