iaGuoZhi / paper-readnotes

1 stars 0 forks source link

[ASPLOS 18] Making Huge Pages Actually Useful. #28

Open iaGuoZhi opened 2 years ago

iaGuoZhi commented 2 years ago

Linux中大页需要进行compaction,来获得连续的地址空间来分配大页。但是存在着unmovable pages(是因为kernel address space是direct mapping,没有页表。因此kernel object所在的页都是unmovable)。Linux应对这个问题的解决办法是在物理内存层次对内核与用户态进行划分。一个page block(hugepage大小,eg, 2M)要么是movable(分配用户态的页),要么是unmovable(分配内核态的页)。不过尽管如此,Linux中大页在compaction进行时的时延仍然不能够接受。

作者通过分析发现了是由于unmovable page以及当前实现导致的几个问题引起的:

  1. polltion, unmovable block如果不够用会向movable block借用page,导致最后都是hybrid,一个block既有movable的page和unmovable的page)。
  2. unsuccessful migration, Linux会尝试通过migrate页来进行compaction,但是在compact过程中发现了一个页面中有unmovabel page时,这个block依旧是hybrid,依旧不能够作为大页给分配,导致了这个compaction过程不但没有发挥作用,还浪费了CPU cycles,tlb。
  3. RCU的广泛应用导致了unmovable pages数量增加,加重了以上两个问题。

这些问题的背后的核心就是内核没有对hybrid page block 进行处理。在第一个问题,如果内核能够识别hybrid block,就能够在hybrid block中分配空闲页作为unmovable page,而不用pollute 所有的blocks。对于第二个问题,如果内核能够识别hybrid block,就不会在要分配hugepage的时候,对这个hybrid block进行无效的compaction。

因此作者在Linux上实现了Illuminator,能够针对hybrid block进行处理。根据测试,在overall performance测试中,mysql最差情况下的查询延迟从1-4s下降到了0.1s以下。