NuoDB
by NuoDB

Linux透明巨大页面,Jemalloc和Nuodb

使用我们的最新发布周期,我们面临着影响极其负载密集型长期运行(多日期)测试的问题。症状是慢性但稳定地增加居民集大小(RSS),影响我们的交易引擎(TES)和存储管理人员(SMS)。在大型机器上,除非您正在查看“PS”统计,您不会注意到它,但在典型的云硬件上 oom. 杀手将取出NOODB流程。

由于我们的系统写入C ++以来,显而易见的是我们的内存泄漏。事实证明,在我们经历了许多各种各样的尝试时,我们经历了一些泄漏的情况 valgrind. 和Jemalloc堆分析器。然后调查转向内存碎片,可能导致更多页面与内存分配器无法使用的大量孔保持在内存中。 Jemalloc确实很好地完成了记忆碎片,我们确认了这一事实。所以内存碎片不是问题。

我们的工程团队发现,Jemalloc将页面释放回到操作系统的情况下,似乎没有任何影响。问题原因是由于Linux内核中的一些新功能 透明庞大的页面 (THPS)。 THP防止标有MADVISE的页面(...,...,madv_dontneed)从居民内存中清除。 THP的快速描述是Linux将在虚拟内存分配高于一定尺寸时自动创建“巨大”页面。通过这样做,在单个巨大的页面资源上没有纪记百分之一的小4k页面 - 这笔簿记会影响虚拟内存翻译Lookaside缓冲区(TLB)的性能。有关的更多细节 可以找到thps  这里 . 

Jemalloc使用Madvise(...,...,madv_dontneed),丢弃它不再需要的页面。由于这与THP不适用于THP,我们的工程团队(谢谢Tommy)修补了Jemalloc,以关闭使用Madvise(...,...,Madv_nohohugepage)的巨大页面分配。这样做修复了我们看到的内存消耗问题,而不会对我们的表现产生显着影响。汤米正在将更改提交回Jemalloc社区。

不幸的是,这个故事没有结束那里。 2.6.38之前的内核版本不支持Madvise(...,...,Madv_nohugepage)。对于这种情况,我们的TES和SMS(在即将到来的2.0.4发行版中)正在制作警告,该警告说要关闭透明的巨大页面。要关闭THP,请作为root,您需要执行以下操作:

  echo never > /sys/kernel/mm/transparent_hugepage/enabled
  echo never > /sys/kernel/mm/transparent_hugepage/defrag
Note: On some systems (CentOS 6.3), the name of directory will be redhat_transparent_hugepage.  Also note that while THPs were introduced in the Linux kernel, they are turned off by default in the Ubuntu kernel (so no worries there!).

如果在Linux内核上运行Nuodb,并启用透明的巨大页面,我们强烈建议将它们关闭。任何像Centos 6.3,6.4和6.5那样运行的人都在2.6.38以下运行内核修订,需要注意这一点。