/** * A convenience method that makes it easier to express the difference * between normal and huge pages backed VM in scheduler. * * @return The amount of non huge page memory needed for the VM */ public static Integer getRequiredMemoryWithoutHugePages(VmBase vmBase) { if (isBackedByHugepages(vmBase)) { return 0; } else { return vmBase.getMemSizeMb(); } }
/** * Returns true iff there is a defined "hugepages" custom property with an integer value */ public static boolean isBackedByHugepages(VmBase vm) { return getHugePageSize(vm).orElse(0) > 0; }
@Test public void getHugePagesMemoryDoesNotFitIntoOne() { VmBase base = new VmBase(); base.setCustomProperties("hugepages=1048576"); base.setMemSizeMb(1025); assertThat(HugePageUtils.getHugePages(base).size(), is(1)); assertThat(HugePageUtils.getHugePages(base).get(1048576), is(2)); }
@Test public void getHugeMemoryFitsIntoOneHugePage() { VmBase base = new VmBase(); base.setCustomProperties("hugepages=1048576"); base.setMemSizeMb(1024); assertThat(HugePageUtils.getHugePages(base).size(), is(1)); assertThat(HugePageUtils.getHugePages(base).get(1048576), is(1)); }
private void testIsBackedByHudepagesHugePage(String customProperties, boolean expected) { VmBase base = new VmBase(); base.setCustomProperties(customProperties); assertThat(HugePageUtils.isBackedByHugepages(base), is(expected)); } }
@Test public void getHugePagesNoHugePagesDefined() { VmBase base = new VmBase(); base.setMemSizeMb(1); assertThat(HugePageUtils.getHugePages(base).size(), is(0)); }
/** * Returns a map of: * huge page size -> required amount of such huge pages */ public static Map<Integer, Integer> getHugePages(VmBase vm) { Optional<Integer> hugePageSize = getHugePageSize(vm); if (!hugePageSize.isPresent()) { return Collections.emptyMap(); } // Make sure we do not overflow when big memory VM is used int fullPages = (int)((KIB_IN_MIB * vm.getMemSizeMb() + hugePageSize.get() - 1) / hugePageSize.get()); return Collections.singletonMap(hugePageSize.get(), fullPages); }