Transparent Hugepages 为什么是众多数据库的
用过不少种类的数据库的人会遇到一个问题, transparent Hugepages 在不少的数据库中都被提到 disabled, turn off . Why should we turn off the transparent hugepage ?
透明的巨型页面是 transparenet 的专用中文释义名词,对于LINUX kernel 来说 page, 页面相当于一个内存的unit, (其实对于数据库来说,大部分也是).默认来说是2048KB, 当然有的不是.
transparent Huge pages 允许为频繁频繁访问的数据保留相关的资源,打开他的确是可以提高系统的性能,保持数据滞留在linux 内存中.
在LINUX 中有一项建议(非数据库服务器), 设置3/8 以内的内存为transparenet huge page. 因为部分LINIUX的应用也不能使用transparenet huge page. 而在Linux内核中包括了 THP 的压缩功能,压缩的操作对资源是密集型的操作,对整体的系统性能是有影响的.
那么问题回到一个basement level , 为什么会有 HP THP, 这样的东西,大部分的应用程序和OS 运行在虚拟内存中,虚拟内存,虚拟内存就是物理内存的映射,相当于地址转换,CPU通过 cpu's memory management unit 简称mmu来访问, 自然MMU也有自己的cache 来缓存经常访问的页面.这个cache 叫, Translation lookside buffer(TLB), 但实际上CPU 访问的内存数量越来越多
后,会带来访问率或者叫命中率的降低, 那解决的方法有两种
1 提高 TLB 的大小 (这不容易,这是硬件的问题)
2 将每次寻址的单元扩大, 也就是以前一个页面 4KB,那我们将一个页面变为1MB ,这样访问的效率不就提升了. 所以就有了HP THP 这样的东西了.
那这样的问题就产生了新的问题,一次尽量访问更多的内存, 但内存也有碎片,也不见得一次是完整的连续的空间, 如果不能满足HP THP 的需求, 则系统会对页面进行换出, 压缩 这样一番下来,会出现一个名词叫 latency spikes , 会严重影响访问的时间和性能.
而为什么有些数据库要禁用掉THP ,主要的原因是这类数据库大部分访问内存的方式是分散的,并不是访问连续的页面,而这样的访问模式,就会造成内存的碎片化.访问的page 不也不是大量连续性的. 并且在不启用THP 时申请4KB的内存时,LINUX会分配相应的内存给应用, 但如果是在系统级别启用了THP,则类似数据库申请内存时,即使申请的值是4KB ,但分配是会以大于4KB例如 2MB 来进行分配,这样数据库申请使用内存的方式也会出现问题,和相关的损耗.
值得说明的是大部分数据库都会建议你关闭 THP , 包括 MYSQL POSTGRESQL ORACLE 等数据库也是建议关闭THP.
但PostgreSQL 中有一个设置从PG9.4而来, Huge Page 并且有三个参数 ON OFF TRY,默认使用 try ,内核中有足够的大页面,PostgreSQL将尝试使用大页面,若没有就不使用它。强制使用巨大的页面,内核没有足够大的页面则PostgreSQL将无法启动。HugePages可以通过显著减少内存页表中的页表条目数量来提高系统性能,要让应用程序使用HugePages,需要显式指令。用这种方式更改应用程序有时可以,有时不行,需要在系统管理级别进行重新设计。因此,引入了透明巨页(THP)技术。如果启用,它可能会在应用程序实际上“不知道”的情况下为应用程序分配巨大的页面;因此,透明度。
猜测这也就是PG 为什么支持HP 而建议关闭THP的原因之一吧
相关文章