mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 06:27:05 +00:00
Merge pull request #106307 from cynepco3hahue/e2e_node_fix_memory_manager_multi_NUMA
e2e_node: provide an option to specify hugepages on the specific NUMA node
This commit is contained in:
commit
4aba017280
@ -118,7 +118,7 @@ func makePodToVerifyHugePages(baseName string, hugePagesLimit resource.Quantity,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// configureHugePages attempts to allocate hugepages of the specified size
|
// configureHugePages attempts to allocate hugepages of the specified size
|
||||||
func configureHugePages(hugepagesSize int, hugepagesCount int) error {
|
func configureHugePages(hugepagesSize int, hugepagesCount int, numaNodeID *int) error {
|
||||||
// Compact memory to make bigger contiguous blocks of memory available
|
// Compact memory to make bigger contiguous blocks of memory available
|
||||||
// before allocating huge pages.
|
// before allocating huge pages.
|
||||||
// https://www.kernel.org/doc/Documentation/sysctl/vm.txt
|
// https://www.kernel.org/doc/Documentation/sysctl/vm.txt
|
||||||
@ -128,16 +128,26 @@ func configureHugePages(hugepagesSize int, hugepagesCount int) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// e.g. hugepages/hugepages-2048kB/nr_hugepages
|
||||||
|
hugepagesSuffix := fmt.Sprintf("hugepages/hugepages-%dkB/%s", hugepagesSize, hugepagesCapacityFile)
|
||||||
|
|
||||||
|
// e.g. /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
|
||||||
|
hugepagesFile := fmt.Sprintf("/sys/kernel/mm/%s", hugepagesSuffix)
|
||||||
|
if numaNodeID != nil {
|
||||||
|
// e.g. /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
|
||||||
|
hugepagesFile = fmt.Sprintf("/sys/devices/system/node/node%d/%s", *numaNodeID, hugepagesSuffix)
|
||||||
|
}
|
||||||
|
|
||||||
// Reserve number of hugepages
|
// Reserve number of hugepages
|
||||||
// e.g. /bin/sh -c "echo 5 > /sys/kernel/mm/hugepages/hugepages-2048kB/vm.nr_hugepages"
|
// e.g. /bin/sh -c "echo 5 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages"
|
||||||
command := fmt.Sprintf("echo %d > %s-%dkB/%s", hugepagesCount, hugepagesDirPrefix, hugepagesSize, hugepagesCapacityFile)
|
command := fmt.Sprintf("echo %d > %s", hugepagesCount, hugepagesFile)
|
||||||
if err := exec.Command("/bin/sh", "-c", command).Run(); err != nil {
|
if err := exec.Command("/bin/sh", "-c", command).Run(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// verify that the number of hugepages was updated
|
// verify that the number of hugepages was updated
|
||||||
// e.g. /bin/sh -c "cat /sys/kernel/mm/hugepages/hugepages-2048kB/vm.nr_hugepages"
|
// e.g. /bin/sh -c "cat /sys/kernel/mm/hugepages/hugepages-2048kB/vm.nr_hugepages"
|
||||||
command = fmt.Sprintf("cat %s-%dkB/%s", hugepagesDirPrefix, hugepagesSize, hugepagesCapacityFile)
|
command = fmt.Sprintf("cat %s", hugepagesFile)
|
||||||
outData, err := exec.Command("/bin/sh", "-c", command).Output()
|
outData, err := exec.Command("/bin/sh", "-c", command).Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -258,7 +268,7 @@ var _ = SIGDescribe("HugePages [Serial] [Feature:HugePages][NodeSpecialFeature:H
|
|||||||
|
|
||||||
ginkgo.By(fmt.Sprintf("Configuring the host to reserve %d of pre-allocated hugepages of size %d", count, size))
|
ginkgo.By(fmt.Sprintf("Configuring the host to reserve %d of pre-allocated hugepages of size %d", count, size))
|
||||||
gomega.Eventually(func() error {
|
gomega.Eventually(func() error {
|
||||||
if err := configureHugePages(size, count); err != nil {
|
if err := configureHugePages(size, count, nil); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -324,7 +324,7 @@ var _ = SIGDescribe("Memory Manager [Disruptive] [Serial] [Feature:MemoryManager
|
|||||||
if *is2MiHugepagesSupported {
|
if *is2MiHugepagesSupported {
|
||||||
ginkgo.By("Configuring hugepages")
|
ginkgo.By("Configuring hugepages")
|
||||||
gomega.Eventually(func() error {
|
gomega.Eventually(func() error {
|
||||||
return configureHugePages(hugepagesSize2M, hugepages2MiCount)
|
return configureHugePages(hugepagesSize2M, hugepages2MiCount, pointer.IntPtr(0))
|
||||||
}, 30*time.Second, framework.Poll).Should(gomega.BeNil())
|
}, 30*time.Second, framework.Poll).Should(gomega.BeNil())
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@ -356,7 +356,8 @@ var _ = SIGDescribe("Memory Manager [Disruptive] [Serial] [Feature:MemoryManager
|
|||||||
if *is2MiHugepagesSupported {
|
if *is2MiHugepagesSupported {
|
||||||
ginkgo.By("Releasing allocated hugepages")
|
ginkgo.By("Releasing allocated hugepages")
|
||||||
gomega.Eventually(func() error {
|
gomega.Eventually(func() error {
|
||||||
return configureHugePages(hugepagesSize2M, 0)
|
// configure hugepages on the NUMA node 0 to avoid hugepages split across NUMA nodes
|
||||||
|
return configureHugePages(hugepagesSize2M, 0, pointer.IntPtr(0))
|
||||||
}, 90*time.Second, 15*time.Second).ShouldNot(gomega.HaveOccurred(), "failed to release hugepages")
|
}, 90*time.Second, 15*time.Second).ShouldNot(gomega.HaveOccurred(), "failed to release hugepages")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user